diff --git a/.github/workflows/github-docker-registry-push.yml b/.github/workflows/github-docker-registry-push.yml index fb34475d..54c61af0 100644 --- a/.github/workflows/github-docker-registry-push.yml +++ b/.github/workflows/github-docker-registry-push.yml @@ -35,12 +35,6 @@ jobs: id: changes run: echo "files=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | tr '\n' ' ')" >> $GITHUB_ENV - - name: Write Docker versions to file - # This step writes the Docker and Docker Compose versions to a file - run: | - echo "- $(docker --version)" > docker-versions.txt - echo "- $(docker compose version)" >> docker-versions.txt - - name: Authenticate GH CLI # This step authenticates the GitHub CLI run: gh auth login --with-token <<< "${{ secrets.GITHUB_TOKEN }}" @@ -50,28 +44,65 @@ jobs: run: | git config --global user.name 'GitHub Action' git config --global user.email 'action@github.com' - git checkout -b docker-versions-update + + # Ensure we start from a clean main branch + git fetch origin main + git checkout main + git reset --hard origin/main + + # Create unique branch name to avoid conflicts + BRANCH_NAME="docker-versions-update-$(date +%s)" + git checkout -b "$BRANCH_NAME" + + # Write Docker versions to file + echo "- $(docker --version)" > docker-versions.txt + echo "- $(docker compose version)" >> docker-versions.txt + + # Only add the specific file we want git add docker-versions.txt - if git diff-index --quiet HEAD --; then - echo "No changes to commit" + + # Check if there are actually changes to commit + if git diff --cached --quiet; then + echo "No changes to docker-versions.txt, skipping PR creation" else - git commit -m "Update Docker versions" - git push origin docker-versions-update - echo 'y' | gh pr create --fill + # Check if an open PR already exists + EXISTING_PR=$(gh pr list --base main --state open --search "chore: update Docker versions in:title" --json number --jq '.[0].number // empty') + if [ -n "$EXISTING_PR" ]; then + echo "Open PR #$EXISTING_PR already exists for Docker version updates, skipping PR creation" + echo "You can view it at: $(gh pr view $EXISTING_PR --json url --jq '.url')" + else + git commit -m "chore: update Docker versions" + git push origin "$BRANCH_NAME" + # Create PR with explicit title and body instead of --fill + gh pr create \ + --title "chore: update Docker versions" \ + --body "Automated update of docker-versions.txt with current Docker and Docker Compose versions. + +**Changes:** +- Updated Docker version information +- Updated Docker Compose version information + +This PR only contains changes to docker-versions.txt and no other files." \ + --base main \ + --head "$BRANCH_NAME" + fi fi - name: Check for Dockerfile and context changes # This step checks for changes in Dockerfile and context run: | + HAS_DOCKER_CHANGES=false for file in ${{ env.files }}; do - if [[ $file =~ (^|/)Dockerfile($|/)|(^|/)dockerfiles/ ]]; then - echo "Dockerfile or dockerfiles directory has changed." - echo "Changed file: $file" + if [[ "$file" =~ (^|/)Dockerfile($|/)|(^|/)dockerfiles/ ]]; then + echo "Dockerfile or dockerfiles directory has changed: $file" + HAS_DOCKER_CHANGES=true break fi done - - if (( $? == 0 )); then + + echo "HAS_DOCKER_CHANGES=$HAS_DOCKER_CHANGES" >> $GITHUB_ENV + + if [[ "$HAS_DOCKER_CHANGES" == "false" ]]; then echo "No Dockerfile or context directory changes. Skipping Docker image build and push steps." echo "Changed files: ${{ env.files }}" fi @@ -87,7 +118,7 @@ jobs: - name: Login to GitHub Container Registry # This step logs in to GHCR - if: contains(env.files, 'Dockerfile') + if: env.HAS_DOCKER_CHANGES == 'true' && env.IS_FORK != 'true' uses: docker/login-action@v3 with: registry: ghcr.io @@ -103,91 +134,83 @@ jobs: echo "BRANCH=$BRANCH_NAME" >> $GITHUB_ENV id: extract_branch - - name: Extract branch name and set BRANCH environment variable - # This step extracts the branch name and sets the BRANCH environment variable - shell: bash - run: | - BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/} | sed -e 's#/#-#g') - if [[ "$BRANCH_NAME" == "main" ]]; then BRANCH_NAME=""; fi - echo "BRANCH=$BRANCH_NAME" >> $GITHUB_ENV - - name: Set repository name to lowercase # This step sets the repository name to lowercase run: echo "REPO_NAME=$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV - name: Build and push a simple jenkins controller # This step builds and pushes a simple Jenkins controller - if: contains(env.files, 'dockerfiles/Dockerfile') || contains(env.files, 'dockerfiles/') + if: (contains(env.files, 'dockerfiles/Dockerfile') || contains(env.files, 'dockerfiles/')) && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles - platforms: linux/amd64, linux/aarch64 + platforms: linux/amd64, linux/arm64 push: true tags: ghcr.io/${{ env.REPO_NAME }}/jenkinsci-tutorials:simple_controller_${{ env.BRANCH }} - name: Build and push the jenkins agent for maven tutorial # This step builds and pushes the Jenkins agent for the Maven tutorial - if: contains(env.files, 'dockerfiles/maven/Dockerfile') + if: contains(env.files, 'dockerfiles/maven/') && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles/maven - platforms: linux/amd64, linux/aarch64 + platforms: linux/amd64, linux/arm64 push: true tags: ghcr.io/${{ env.REPO_NAME }}/jenkinsci-tutorials:maven_agent_${{ env.BRANCH }} - name: Build and push the jenkins agent for python tutorial # This step builds and pushes the Jenkins agent for the Python tutorial - if: contains(env.files, 'dockerfiles/python/Dockerfile') + if: contains(env.files, 'dockerfiles/python/') && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles/python - platforms: linux/amd64, linux/aarch64 + platforms: linux/amd64, linux/arm64 push: true tags: ghcr.io/${{ env.REPO_NAME }}/jenkinsci-tutorials:python_agent_${{ env.BRANCH }} - name: Build and push the jenkins agent for node tutorial # This step builds and pushes the Jenkins agent for the Node.js tutorial - if: contains(env.files, 'dockerfiles/node/Dockerfile') + if: contains(env.files, 'dockerfiles/node/') && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles/node - platforms: linux/amd64, linux/aarch64 + platforms: linux/amd64, linux/arm64 push: true tags: ghcr.io/${{ env.REPO_NAME }}/jenkinsci-tutorials:node_agent_${{ env.BRANCH }} - name: Build and push the jenkins agent for the sidekick container # This step builds and pushes the Jenkins agent for the sidekick container - if: contains(env.files, 'dockerfiles/sidekick/Dockerfile') + if: contains(env.files, 'dockerfiles/sidekick/') && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles/sidekick - platforms: linux/amd64, linux/aarch64 + platforms: linux/amd64, linux/arm64 push: true tags: ghcr.io/${{ env.REPO_NAME }}/jenkinsci-tutorials:sidekick_${{ env.BRANCH }} - name: Build and push the jenkins agent for the agent-finding container # This step builds and pushes the Jenkins agent for the agent-finding container - if: contains(env.files, 'dockerfiles/agent-discovery/Dockerfile') + if: contains(env.files, 'dockerfiles/agent-discovery/') && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles/agent-discovery/ - platforms: linux/amd64, linux/aarch64 + platforms: linux/amd64, linux/arm64 push: true tags: ghcr.io/${{ env.REPO_NAME }}/jenkinsci-tutorials:agent_discovery_${{ env.BRANCH }} - name: Build and push the jenkins agent for multi-branch controller # This step builds and pushes the Jenkins agent for the multi-branch controller - if: contains(env.files, 'dockerfiles/multi/Dockerfile') + if: contains(env.files, 'dockerfiles/multi/') && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles/multi - platforms: linux/amd64, linux/aarch64 + platforms: linux/amd64, linux/arm64 push: true tags: ghcr.io/${{ env.REPO_NAME }}/jenkinsci-tutorials:multi_controller_${{ env.BRANCH }} - name: Build and push the jenkins agent for Android # This step builds and pushes the Jenkins agent for Android - if: contains(env.files, 'dockerfiles/android/Dockerfile') + if: contains(env.files, 'dockerfiles/android/') && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles/android @@ -197,7 +220,7 @@ jobs: - name: Build and push the jenkins agent for golang tutorial # This step builds and pushes the Jenkins agent for the Golang tutorial - if: contains(env.files, 'dockerfiles/golang/Dockerfile') + if: contains(env.files, 'dockerfiles/golang/') && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles/golang @@ -207,20 +230,20 @@ jobs: - name: Build and push the jenkins agent for cpp tutorial # This step builds and pushes the Jenkins agent for the C++ tutorial - if: contains(env.files, 'dockerfiles/cpp/Dockerfile') + if: contains(env.files, 'dockerfiles/cpp/') && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles/cpp - platforms: linux/amd64, linux/aarch64 + platforms: linux/amd64, linux/arm64 push: true tags: ghcr.io/${{ env.REPO_NAME }}/jenkinsci-tutorials:cpp_${{ env.BRANCH }} - + - name: Build and push the jenkins agent for dotnet tutorial - # This step builds and pushes the Jenkins agent for the C++ tutorial - if: contains(env.files, 'dockerfiles/dotnet/Dockerfile') + # This step builds and pushes the Jenkins agent for the .NET tutorial + if: contains(env.files, 'dockerfiles/dotnet/') && env.IS_FORK != 'true' uses: docker/build-push-action@v6 with: context: ./dockerfiles/dotnet - platforms: linux/amd64, linux/aarch64 + platforms: linux/amd64, linux/arm64 push: true tags: ghcr.io/${{ env.REPO_NAME }}/jenkinsci-tutorials:dotnet_${{ env.BRANCH }}