# This workflows polls releases from actions/runner and in case of a new one it # updates files containing runner version and opens a pull request. name: Update runners on: schedule: # run daily - cron: "0 9 * * *" workflow_dispatch: jobs: # check_versions compares our current version and the latest available runner # version and sets them as outputs. check_versions: runs-on: ubuntu-latest env: GH_TOKEN: ${{ github.token }} outputs: current_version: ${{ steps.versions.outputs.current_version }} latest_version: ${{ steps.versions.outputs.latest_version }} steps: - uses: actions/checkout@v3 - name: Get current and latest versions id: versions run: | CURRENT_VERSION=$(echo -n $(cat runner/VERSION)) echo "Current version: $CURRENT_VERSION" echo current_version=$CURRENT_VERSION >> $GITHUB_OUTPUT LATEST_VERSION=$(gh release list --exclude-drafts --exclude-pre-releases --limit 1 -R actions/runner | grep -oP '(?<=v)[0-9.]+' | head -1) echo "Latest version: $LATEST_VERSION" echo latest_version=$LATEST_VERSION >> $GITHUB_OUTPUT # check_pr checks if a PR for the same update already exists. It only runs if # runner latest version != our current version. If no existing PR is found, # it sets a PR name as output. check_pr: runs-on: ubuntu-latest needs: check_versions if: needs.check_versions.outputs.current_version != needs.check_versions.outputs.latest_version outputs: pr_name: ${{ steps.pr_name.outputs.pr_name }} env: GH_TOKEN: ${{ github.token }} steps: - name: debug run: echo ${{ needs.check_versions.outputs.current_version }} echo ${{ needs.check_versions.outputs.latest_version }} - uses: actions/checkout@v3 - name: PR Name id: pr_name env: LATEST_VERSION: ${{ needs.check_versions.outputs.latest_version }} run: | PR_NAME="Update runner to version ${LATEST_VERSION}" result=$(gh pr list --search "$PR_NAME" --json number --jq ".[].number" --limit 1) if [ -z "$result" ] then echo "No existing PRs found, setting output with pr_name=$PR_NAME" echo pr_name=$PR_NAME >> $GITHUB_OUTPUT else echo "Found a PR with title '$PR_NAME' already existing: ${{ github.server_url }}/${{ github.repository }}/pull/$result" fi # update_version updates runner version in the files listed below, commits # the changes and opens a pull request as `github-actions` bot. update_version: runs-on: ubuntu-latest needs: - check_versions - check_pr if: needs.check_pr.outputs.pr_name permissions: pull-requests: write contents: write env: GH_TOKEN: ${{ github.token }} CURRENT_VERSION: ${{ needs.check_versions.outputs.current_version }} LATEST_VERSION: ${{ needs.check_versions.outputs.latest_version }} PR_NAME: ${{ needs.check_pr.outputs.pr_name }} steps: - uses: actions/checkout@v3 - name: New branch run: git checkout -b update-runner-$LATEST_VERSION - name: Update files run: | sed -i "s/$CURRENT_VERSION/$LATEST_VERSION/g" runner/VERSION sed -i "s/$CURRENT_VERSION/$LATEST_VERSION/g" runner/Makefile sed -i "s/$CURRENT_VERSION/$LATEST_VERSION/g" Makefile sed -i "s/$CURRENT_VERSION/$LATEST_VERSION/g" test/e2e/e2e_test.go sed -i "s/$CURRENT_VERSION/$LATEST_VERSION/g" .github/workflows/e2e-test-linux-vm.yaml - name: Commit changes run: | # from https://github.com/orgs/community/discussions/26560 git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git config user.name "github-actions[bot]" git add . git commit -m "$PR_NAME" git push -u origin HEAD - name: Create pull request run: gh pr create -f