Skip to content

Commit

Permalink
GitHub Actions: Notify Go Module Major Version Updates
Browse files Browse the repository at this point in the history
When Go modules mature and their major version has exceeded one, the
module path requires a version suffix, such as "/v2"[0]. Unfortunately,
the Dependabot is unable to detect such a Go module major version bump
for suffixed major versions[1], resulting in stalling dependencies.

By introducing another GitHub Actions Workflow utilizing gomajor[2],
those major version updates for Go modules can be identified. As a
scheduled workflow, running each Monday morning, it will either create
or update an open GitHub issue with all currently available major
version updates for referenced Go modules.

[0]: https://go.dev/ref/mod#major-version-suffixes
[1]: dependabot/dependabot-core#2213
[2]: https://github.com/icholy/gomajor
  • Loading branch information
oxzi committed Mar 22, 2024
1 parent 112f6d7 commit abc1cec
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 0 deletions.
70 changes: 70 additions & 0 deletions .github/workflows/go-mod-major.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#!/bin/sh

# A GitHub issue with this title and those labels (might be just one)
# will be created or, if it already exists and is open, will be reused.
GH_ISSUE_TITLE="Go Module Major Version Updates"
GH_ISSUE_LABELS="dependencies"

set -eu

# UPDATE_MSG will be altered from within check_updates()
UPDATE_MSG=""

# check_updates DIR check if any major updates are within DIR.
# Found updates are being added to UPDATE_MSG
check_updates() {
cd "$1"
available_updates="$(gomajor list -major 2>&1 \
| grep -v "no module versions found" \
| awk '{ print NR ". `" $0 "`" }')"
cd - > /dev/null

if [ -z "$available_updates" ]; then
echo "Nothing to do in $1"
return
fi

echo "Found $(echo "$available_updates" | wc -l) updates in $1"
UPDATE_MSG="$(cat <<EOF
$UPDATE_MSG
### Updates in \`$1\`
$available_updates
EOF
)"
}

for DIR in "$@"; do
check_updates "$DIR"
done

if [ -z "$UPDATE_MSG" ]; then
echo "Nothing to do at all :-)"
exit 0
fi

UPDATE_MSG="$(cat <<EOF
## $GH_ISSUE_TITLE
There are major version updates available for used Go modules.
$UPDATE_MSG
EOF
)"

active_issue="$(gh issue list \
--label "$GH_ISSUE_LABELS" \
--state "open" \
--search "in:title \"$GH_ISSUE_TITLE\"" \
--json "number" \
--jq ".[0].number")"

if [ -n "$active_issue" ]; then
gh issue comment "$active_issue" \
--body "$UPDATE_MSG"
else
gh issue create \
--title "$GH_ISSUE_TITLE" \
--label "$GH_ISSUE_LABELS" \
--body "$UPDATE_MSG"
fi
25 changes: 25 additions & 0 deletions .github/workflows/go-mod-major.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Go Module Major Update Check
on:
schedule:
- cron: '30 6 * * 1' # at 06:30 every Monday morning

jobs:
go_mod_update_issue:
name: Go Module Major Update Check and Issue Creation
runs-on: ubuntu-latest

permissions:
issues: write

steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: stable

- run: go install github.com/icholy/gomajor@latest

- run: ./.github/workflows/go-mod-major.sh "." "tests"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}

0 comments on commit abc1cec

Please sign in to comment.