The push_image function deleted the existing manifest before pushing
(Gitea #31964 workaround). When push failed for other reasons (HTTP
500), the old tag was lost, breaking all CI jobs using that image.
Now tries push first, only deletes+retries on "already exists" error.
Closes DEVX-159
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>