-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
GitHub Actions: Notify Go Module Major Version Updates
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
Showing
2 changed files
with
95 additions
and
0 deletions.
There are no files selected for viewing
This file contains 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
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 |
This file contains 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
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 }} |