diff --git a/.github/workflows/bump-go.yml b/.github/workflows/bump-go.yml new file mode 100644 index 00000000..19fd4d35 --- /dev/null +++ b/.github/workflows/bump-go.yml @@ -0,0 +1,23 @@ +name: Bump Go Version +on: + workflow_dispatch: + schedule: + - cron: '0 5 * * *' + +permissions: + contents: write + pull-requests: write + +jobs: + try-bump: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Bump Go Version + uses: actions/setup-go@v5 + with: + go-version: stable + - name: Open a PR if not up to date + run: ci/bump-go.sh diff --git a/ci/bump_go.sh b/ci/bump_go.sh new file mode 100755 index 00000000..7f749e1c --- /dev/null +++ b/ci/bump_go.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +REF_BRANCH=master +PR_KEYWORD="[bump-go]" +PR_LABEL="bump-go" + +set -e + +# Check if the working directory is clean +if [ ! -z "$(git status -s -uall)" ]; then + echo "Working directory is not clean" 2>&1 + exit 1 +fi + +# Create the bump-go branch if it doesn't exist +git show-ref --verify --quiet refs/heads/bump-go || git branch -c $REF_BRANCH bump-go + +# The version in the GO_VERSION file +current_version=$(git show $REF_BRANCH:GO_VERSION 2>/dev/null || echo "") +echo "Current version: $current_version" + +# The latest version installed +latest_version=$(go version | sed -E 's/.*go([0-9\.]*).*/\1/') +echo "Installed version: $latest_version" + +# The version already open in a PR +bump_candidate_version=$(git show bump-go:GO_VERSION 2>/dev/null || echo "") +echo "Bump candidate version: $bump_candidate_version" + +# Lookup number of existing PRs +existing_prs=$(gh pr list --state open --base $REF_BRANCH --label "$PR_LABEL" --json "number" | jq -r 'map(.number) | .[]') + +# Check if the version is up to date +if [ "$current_version" == "$latest_version" ]; then + echo "Go is up to date" + exit 0 +elif [ "$latest_version" == "$bump_candidate_version" ] && [ ! -z "$existing_prs" ]; then + echo "A PR is already open" + exit 0 +fi + +if [ -z "$GITHUB_TOKEN" ]; then + echo "GITHUB_TOKEN not set, but this is what I would do:" + echo "git checkout bump-go && git merge --ff-only $REF_BRANCH" + echo "echo \"$latest_version\" > GO_VERSION" + echo "git add GO_VERSION" + echo "git commit -m \"$PR_KEYWORD Bump Go to $latest_version\"" + echo "git push origin bump-go" + if [ -z "$existing_prs" ]; then + echo "gh pr create --base $REF_BRANCH --head bump-go --title \"$PR_KEYWORD Bump Go to $latest_version\" --label \"$PR_LABEL\"" + else + first_id=$(echo "$existing_prs" | head -n 1) + echo "gh pr edit $first_id --title \"$PR_KEYWORD Bump Go to $latest_version\"" + fi +else + + # Write the new version to the file + git checkout bump-go && git merge --ff-only $REF_BRANCH + echo "$latest_version" > GO_VERSION + git add GO_VERSION + + # Commit the changes + if git diff --quiet --cached; then + echo "No changes to commit" + else + git commit -m "$PR_KEYWORD Bump Go to $latest_version" + fi + + git push origin bump-go + + if [ -z "$existing_prs" ]; then + gh pr create --base $REF_BRANCH --head bump-go \ + --title "$PR_KEYWORD Bump Go to $latest_version" --label "$PR_LABEL" \ + --body "This PR was automatically created by the bump-go action." + else + first_id=$(echo "$existing_prs" | sort -nr | head -n 1) + gh pr edit $first_id --title "$PR_KEYWORD Bump Go to $latest_version" + fi +fi + \ No newline at end of file