🏋️

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 version
  • release-candidate selects the latest release candidate version
  • nightly selects the latest unstable nightly version
  • release-nightly selects the latest unstable nightly version for the next release

Gradle 8.1 Release Notes

つまり、./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