Skip to content

Update Runner Versions #160

Update Runner Versions

Update Runner Versions #160

name: Update Runner Versions
on:
schedule:
- cron: "0 6 * * *" # daily 06:00 UTC
workflow_dispatch:
# Configuration for version tracking - add new components here
env:
COMPONENTS: >-
[
{"var": "RUNNER_VERSION", "repo": "actions/runner", "name": "Runner",
"prefix": "v"},
{"var": "RUNNER_CONTAINER_HOOKS_VERSION", "repo":
"actions/runner-container-hooks", "name": "Container Hooks", "prefix": "v"},
{"var": "DOCKER_VERSION", "repo": "moby/moby", "name": "Docker", "prefix":
"docker-v"},
{"var": "BUILDX_VERSION", "repo": "docker/buildx", "name": "Buildx",
"prefix": "v"} ]
jobs:
update-versions:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Set up Git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Load current versions
id: versions
uses: falti/dotenv-action@v1.1.4
with:
log-variables: true
export-variables: true
keys-case: "upper"
- name: Fetch latest releases
id: fetch_latest
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Load configuration from top-level env using jq
COMPONENTS='${{ env.COMPONENTS }}'
# Fetch latest version for each component
echo "$COMPONENTS" | jq -c '.[]' | while read -r component; do
VAR=$(echo "$component" | jq -r '.var')
REPO=$(echo "$component" | jq -r '.repo')
PREFIX=$(echo "$component" | jq -r '.prefix')
TAG=$(gh api repos/$REPO/releases -q '.[0].tag_name')
LATEST="${TAG#$PREFIX}" # Strip prefix from tag
echo "LATEST_$VAR=$LATEST" >> $GITHUB_ENV
echo "Fetched $VAR: $LATEST from $REPO (tag: $TAG)"
done
- name: Update .env if needed
id: update
run: |
# Load configuration from top-level env using jq
COMPONENTS='${{ env.COMPONENTS }}'
UPDATED=false
# Update .env for each changed version
while read -r component; do
VAR=$(echo "$component" | jq -r '.var')
CURRENT="${!VAR}"
LATEST_VAR="LATEST_$VAR"
LATEST="${!LATEST_VAR}"
if [ "$CURRENT" != "$LATEST" ]; then
echo "Updating $VAR: $CURRENT → $LATEST"
sed -i "s/^$VAR=.*/$VAR=$LATEST/" .env
UPDATED=true
fi
done < <(echo "$COMPONENTS" | jq -c '.[]')
echo "UPDATED=$UPDATED" >> $GITHUB_OUTPUT
echo "UPDATED=$UPDATED"
- name: Show changes
if: steps.update.outputs.UPDATED == 'true'
run: git diff --color=always
- name: Create or update PR if versions changed
if: steps.update.outputs.UPDATED == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
run: |
# Load configuration from top-level env using jq
COMPONENTS='${{ env.COMPONENTS }}'
BRANCH=update-runner-versions
git checkout -B $BRANCH
COMMIT_MSG="Update component versions"
MSG_LINES=()
# Build message lines for changed versions
while read -r component; do
VAR=$(echo "$component" | jq -r '.var')
REPO=$(echo "$component" | jq -r '.repo')
FRIENDLY=$(echo "$component" | jq -r '.name')
CURRENT="${!VAR}"
LATEST_VAR="LATEST_$VAR"
LATEST="${!LATEST_VAR}"
if [ "$CURRENT" != "$LATEST" ]; then
MSG_LINES+=("- $FRIENDLY: [$CURRENT](https://github.com/$REPO/releases/tag/v$CURRENT) → [$LATEST](https://github.com/$REPO/releases/tag/v$LATEST)")
fi
done < <(echo "$COMPONENTS" | jq -c '.[]')
if [ ${#MSG_LINES[@]} -gt 0 ]; then
COMMIT_MSG=$(printf "Update component versions\n\n%s" "$(printf "%s\n" "${MSG_LINES[@]}")")
fi
git add .env
git commit -m "$COMMIT_MSG"
git push --set-upstream origin $BRANCH --force
# Check if a PR already exists
EXISTING_PR=$(gh pr list --head $BRANCH --json number -q '.[0].number')
if [ -z "$EXISTING_PR" ]; then
gh pr create \
--title "Update component versions" \
--body "$COMMIT_MSG" \
--base main \
--head $BRANCH
else
echo "PR already exists: #$EXISTING_PR"
fi