Skip to content
Closed
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 71 additions & 48 deletions .github/workflows/github-docker-registry-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}"
Expand All @@ -50,28 +44,65 @@ jobs:
run: |
git config --global user.name 'GitHub Action'
git config --global user.email '[email protected]'
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
Expand All @@ -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
Expand All @@ -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 }}
Comment on lines 141 to 149
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Condition triggers on unrelated subdirectory changes.

The condition contains(env.files, 'dockerfiles/') will match any file under dockerfiles/, including files in subdirectories like dockerfiles/maven/Dockerfile or dockerfiles/python/requirements.txt. This causes the simple controller build to run unnecessarily when only language-specific agent files change.

To match only files directly in the dockerfiles/ root (not subdirectories), you need a more precise check. Consider this approach:

-      - 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/')) && env.IS_FORK != 'true'
+      - 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/plugins.txt')) && env.IS_FORK != 'true'

Alternatively, use a more sophisticated check in the "Check for Dockerfile and context changes" step to set separate flags for each build context.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In .github/workflows/github-docker-registry-push.yml around lines 141–149, the
job condition uses contains(env.files, 'dockerfiles/') which also matches files
in subdirectories and causes irrelevant builds; replace that check with a
precise test for files directly under dockerfiles/ (for example check for the
explicit path(s) like 'dockerfiles/Dockerfile' or equivalent exact filenames you
expect) or, preferably, modify the earlier "Check for Dockerfile and context
changes" step to set a dedicated env flag per build context (e.g.,
DOCKERFILES_ROOT_CHANGED) and use that flag in this job’s if condition so only
changes to files directly in the dockerfiles/ root trigger the simple controller
build.


- 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
Expand All @@ -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
Expand All @@ -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 }}
Loading