From ea9a9e3a08511f16248b6ce5620ba8a5edb7fc45 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Wed, 26 Nov 2025 15:28:11 +0000 Subject: [PATCH] refactor: split Docker publish into separate workflow Docker images now build only after release is published, not during the draft creation phase. This prevents users from getting updates before the release is reviewed and approved. --- .github/workflows/create-release.yml | 114 +------------------------ .github/workflows/publish-docker.yml | 120 +++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 110 deletions(-) create mode 100644 .github/workflows/publish-docker.yml diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index a326f9d..d369b62 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -205,113 +205,10 @@ jobs: working-directory: tests/integration run: docker-compose -f docker-compose.test.yml down -v || true - build_docker_images: - needs: - - extract_version - - version_guard - - preflight_tests - runs-on: ubuntu-latest - timeout-minutes: 60 - permissions: - contents: read - packages: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Log in to GHCR - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push Pulse server image - uses: docker/build-push-action@v6 - with: - context: . - target: runtime - platforms: linux/amd64,linux/arm64 - push: true - provenance: false - cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/pulse:buildcache - cache-to: type=registry,ref=ghcr.io/${{ github.repository_owner }}/pulse:buildcache,mode=max - tags: | - rcourtman/pulse:${{ needs.extract_version.outputs.tag }} - rcourtman/pulse:${{ needs.extract_version.outputs.version }} - rcourtman/pulse:latest - ghcr.io/${{ github.repository_owner }}/pulse:${{ needs.extract_version.outputs.tag }} - ghcr.io/${{ github.repository_owner }}/pulse:${{ needs.extract_version.outputs.version }} - ghcr.io/${{ github.repository_owner }}/pulse:latest - labels: | - org.opencontainers.image.title=Pulse - org.opencontainers.image.description=Proxmox monitoring system - org.opencontainers.image.version=${{ needs.extract_version.outputs.tag }} - org.opencontainers.image.created=${{ github.event.repository.updated_at }} - org.opencontainers.image.revision=${{ github.sha }} - org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} - org.opencontainers.image.url=${{ github.server_url }}/${{ github.repository }} - org.opencontainers.image.licenses=MIT - - - name: Build and push Docker agent image - uses: docker/build-push-action@v6 - with: - context: . - file: ./Dockerfile - target: agent_runtime - platforms: linux/amd64,linux/arm64 - push: true - provenance: false - cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/pulse-docker-agent:buildcache - cache-to: type=registry,ref=ghcr.io/${{ github.repository_owner }}/pulse-docker-agent:buildcache,mode=max - tags: | - rcourtman/pulse-docker-agent:${{ needs.extract_version.outputs.tag }} - rcourtman/pulse-docker-agent:${{ needs.extract_version.outputs.version }} - rcourtman/pulse-docker-agent:latest - ghcr.io/${{ github.repository_owner }}/pulse-docker-agent:${{ needs.extract_version.outputs.tag }} - ghcr.io/${{ github.repository_owner }}/pulse-docker-agent:${{ needs.extract_version.outputs.version }} - ghcr.io/${{ github.repository_owner }}/pulse-docker-agent:latest - labels: | - org.opencontainers.image.title=Pulse Docker Agent - org.opencontainers.image.description=Docker container monitoring agent for Pulse - org.opencontainers.image.version=${{ needs.extract_version.outputs.tag }} - org.opencontainers.image.created=${{ github.event.repository.updated_at }} - org.opencontainers.image.revision=${{ github.sha }} - org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} - org.opencontainers.image.url=${{ github.server_url }}/${{ github.repository }} - org.opencontainers.image.licenses=MIT - - - name: Output Docker image information - run: | - echo "✅ Docker images built and pushed successfully!" - echo "" - echo "Server images:" - echo " - rcourtman/pulse:${{ needs.extract_version.outputs.tag }}" - echo " - rcourtman/pulse:${{ needs.extract_version.outputs.version }}" - echo " - rcourtman/pulse:latest" - echo "" - echo "Agent images:" - echo " - rcourtman/pulse-docker-agent:${{ needs.extract_version.outputs.tag }}" - echo " - rcourtman/pulse-docker-agent:${{ needs.extract_version.outputs.version }}" - echo " - rcourtman/pulse-docker-agent:latest" - create_release: needs: - extract_version - - build_docker_images + - preflight_tests runs-on: ubuntu-latest timeout-minutes: 30 permissions: @@ -494,12 +391,9 @@ jobs: echo "⚠️ IMPORTANT: This release is in DRAFT status" echo "" echo "Next steps:" - echo "1. Review the automatically generated release notes" - echo "2. Edit and categorize changes as needed" - echo "3. Publish the release when ready" - echo "" - echo "All artifacts have been uploaded." - echo "Docker images are available at Docker Hub and GHCR." + echo "1. Review the release notes at the URL above" + echo "2. Publish the release when ready" + echo "3. Docker images will be built automatically after publish" echo "" validate_release_assets: diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml new file mode 100644 index 0000000..ecbe321 --- /dev/null +++ b/.github/workflows/publish-docker.yml @@ -0,0 +1,120 @@ +name: Publish Docker Images + +on: + release: + types: [published] + +concurrency: + group: docker-publish-${{ github.event.release.tag_name }} + cancel-in-progress: false + +jobs: + publish: + runs-on: ubuntu-latest + timeout-minutes: 60 + permissions: + contents: read + packages: write + + steps: + - name: Extract version from release tag + id: version + run: | + TAG="${{ github.event.release.tag_name }}" + VERSION="${TAG#v}" + echo "tag=${TAG}" >> $GITHUB_OUTPUT + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "Publishing Docker images for ${TAG}" + + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.release.tag_name }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push Pulse server image + uses: docker/build-push-action@v6 + with: + context: . + target: runtime + platforms: linux/amd64,linux/arm64 + push: true + provenance: false + cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/pulse:buildcache + cache-to: type=registry,ref=ghcr.io/${{ github.repository_owner }}/pulse:buildcache,mode=max + tags: | + rcourtman/pulse:${{ steps.version.outputs.tag }} + rcourtman/pulse:${{ steps.version.outputs.version }} + rcourtman/pulse:latest + ghcr.io/${{ github.repository_owner }}/pulse:${{ steps.version.outputs.tag }} + ghcr.io/${{ github.repository_owner }}/pulse:${{ steps.version.outputs.version }} + ghcr.io/${{ github.repository_owner }}/pulse:latest + labels: | + org.opencontainers.image.title=Pulse + org.opencontainers.image.description=Proxmox monitoring system + org.opencontainers.image.version=${{ steps.version.outputs.tag }} + org.opencontainers.image.created=${{ github.event.release.published_at }} + org.opencontainers.image.revision=${{ github.sha }} + org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.url=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.licenses=MIT + + - name: Build and push Docker agent image + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile + target: agent_runtime + platforms: linux/amd64,linux/arm64 + push: true + provenance: false + cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/pulse-docker-agent:buildcache + cache-to: type=registry,ref=ghcr.io/${{ github.repository_owner }}/pulse-docker-agent:buildcache,mode=max + tags: | + rcourtman/pulse-docker-agent:${{ steps.version.outputs.tag }} + rcourtman/pulse-docker-agent:${{ steps.version.outputs.version }} + rcourtman/pulse-docker-agent:latest + ghcr.io/${{ github.repository_owner }}/pulse-docker-agent:${{ steps.version.outputs.tag }} + ghcr.io/${{ github.repository_owner }}/pulse-docker-agent:${{ steps.version.outputs.version }} + ghcr.io/${{ github.repository_owner }}/pulse-docker-agent:latest + labels: | + org.opencontainers.image.title=Pulse Docker Agent + org.opencontainers.image.description=Docker container monitoring agent for Pulse + org.opencontainers.image.version=${{ steps.version.outputs.tag }} + org.opencontainers.image.created=${{ github.event.release.published_at }} + org.opencontainers.image.revision=${{ github.sha }} + org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.url=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.licenses=MIT + + - name: Output image information + run: | + echo "✅ Docker images published successfully!" + echo "" + echo "Server images:" + echo " - rcourtman/pulse:${{ steps.version.outputs.tag }}" + echo " - rcourtman/pulse:${{ steps.version.outputs.version }}" + echo " - rcourtman/pulse:latest" + echo "" + echo "Agent images:" + echo " - rcourtman/pulse-docker-agent:${{ steps.version.outputs.tag }}" + echo " - rcourtman/pulse-docker-agent:${{ steps.version.outputs.version }}" + echo " - rcourtman/pulse-docker-agent:latest"