Update Runner Versions #160
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |