gradlewのバージョンを最新にするGitHubActionsのWorkflowを書いた
Fairy Devices株式会社のKabochaです。
当社では依存ライブラリの管理にDependabotを活用し、プロジェクトを最新の状態に保っています。
Dependabotは優秀で、様々なライブラリ、プラグインのバージョンアップを行ってくれます。
しかし、Dependabotを使っていると問題が発生することがあります。
よく起きるのが、Android Gradle Plugin(AGP)は上がったのに、Gradleのバージョンが上がらないという状況です。
AGPは、それぞれのバージョンで必要なGradleの最小バージョンが決まっていますが、DependabotはGradleバージョン自体は自動更新してくれないため、CIが失敗してしまいます。
そのため、手動でGradleバージョンを上げる必要があり、これが地味に面倒でした。
Dependabotの現状
この問題について調査してみると、Dependabotのリポジトリで長年議論されています。
(2025年7月23日時点)
残念ながら、これらのIssueは長期間対応されておらず、Gradle Wrapperの自動更新機能は実装されていないようです。
解決策の発見
Issueのディスカッションを調べていると、Gradle 8.1のリリースノートに興味深い機能が追加されていることを発見しました。
Other Improvements
Gradle Wrapper introduces labels for selecting the version
The--gradle-version
parameter for the wrapper task now supports using predefined labels to select a version.
The recognized labels are:
latest
selects the latest stable versionrelease-candidate
selects the latest release candidate versionnightly
selects the latest unstable nightly versionrelease-nightly
selects the latest unstable nightly version for the next release
つまり、./gradlew wrapper --gradle-version "latest"
を実行することで、常に最新の安定版Gradleに更新できるということです。これを定期実行すれば、手動でのバージョン管理から解放されます。
実装したWorkflow
以下のGitHub Actionsワークフローを作成しました。
適宜必要に応じてカスマイズしてください。
name: Update Gradle Wrapper
on:
workflow_dispatch: # 手動実行を許可
schedule:
- cron: "0 0 1 * *" # 毎月1日 00:00
permissions:
contents: write
pull-requests: write
issues: write
jobs:
update-wrapper:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: "adopt"
java-version: "17"
- name: Update Gradle Wrapper to latest
run: |
./gradlew wrapper --gradle-version "latest"
- name: Check for changes
id: check_changes
run: |
if git diff --exit-code --quiet gradle/wrapper/gradle-wrapper.properties; then
echo "no_changes=true" >> "$GITHUB_OUTPUT"
echo "Gradle Wrapper is already up to date."
else
echo "no_changes=false" >> "$GITHUB_OUTPUT"
echo "Changes detected in gradle-wrapper.properties."
fi
- name: Generate branch name
id: generate_branch_name
if: steps.check_changes.outputs.no_changes == 'false'
run: |
TIMESTAMP=$(date +'%Y%m%d%H%M%S')
echo "branch_name=feature/update-gradle-wrapper-${TIMESTAMP}" >> "$GITHUB_OUTPUT"
- name: Create Pull Request
if: steps.check_changes.outputs.no_changes == 'false'
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "chore: Update Gradle Wrapper to latest version"
title: "chore: Update Gradle Wrapper to latest version"
body: |
Gradle Wrapper が最新バージョンに更新されました。
branch: "${{ steps.generate_branch_name.outputs.branch_name }}"
delete-branch: true
labels: |
dependencies
automated pr
作成したワークフローの機能
このワークフローは、以下の機能を持っています。
1. 定期実行と手動実行の両方に対応
- 毎月1日に自動実行される
- 必要に応じて手動実行も可能
2. 変更検知機能
- Gradle Wrapperに変更がない場合はPRを作成しない
3. 自動PR作成
- 変更がある場合のみ、自動的にPRを作成
- 適切なラベルとメッセージを設定
4. 一意なブランチ名
- タイムスタンプを使用してブランチ名の衝突を回避
以前から地味に面倒だと思っていたので、この作業から開放されてよかったです。
まとめ
DependabotがGradle Wrapperの更新に対応していない現状において、GitHub Actionsを活用した自動更新ワークフローは便利です。
Gradle 8.1で追加された機能を活用することで、比較的シンプルに更新メカニズムを構築できました。
地味に面倒だなと思っていた作業の1つをなくせるので、おすすめです。
Discussion