はじめに
こんにちは、Gakken LEAP のエンジニアの shogawa です。
現在自分が携わっているJavaのプロジェクトでは、ソースコードが肥大化(リファクタリングしろ!)しており、
GitHub Actionsでのbuild時に時間が掛かりすぎてしまう問題がありました。
例えばステージング環境にリリースするのにも、多少の待ち時間が発生してしまうので工数的にももったいないので、
それを解消するために実践したことを書いていきます。
前提
- Javaプロジェクトで、GitHubActionsでbuildしている
- buildツールは、gradleまたはmaven
※今回はgradleとmavenでやったのでそれの紹介です。
参考:GitHub 公式ドキュメント
修正前コード(抜粋)
元々のGitHubActionsは以下のようになっていました。
buildジョブがシンプルに ./gradlew bootWar(./mvnw package -DskipTests) してるだけです。
(いまだにJava8かよ。。。とかいうツッコミは禁止!)
jobs:
build:
runs-on: ubuntu-latest
concurrency:
group: build-app-stg
cancel-in-progress: true
environment: stg
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: 'corretto'
java-version: '8'
- name: build war
id: builder
run: |
# gradleの場合
./gradlew bootWar
# mavenの場合
#./mvnw package -DskipTests
修正後コード(抜粋)
公式ドキュメントを参考に、build前にキャッシュ関連の設定を追加していきます。
cacheアクションでは、key, pathが必須で、keyにヒットしない場合も考慮してオプションのrestore-keysも設定しておきます。
設定値は公式ドキュメントを見つつ、プロジェクトに合わせた形で設定していきます。
修正後のGitHubActionsは以下の通り。
jobs:
build:
runs-on: ubuntu-latest
concurrency:
group: build-app-stg
cancel-in-progress: true
environment: stg
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: 'corretto'
java-version: '8'
+ # Gradleキャッシュの設定
+ - name: Cache Gradle dependencies
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ gradle-${{ runner.os }}-
+ # Gradleキャッシュの設定ここまで
+ # Mavenキャッシュの設定
+ - name: Cache Maven repository
+ uses: actions/cache@v4
+ with:
+ path: ~/.m2/repository
+ key: maven-${{ runner.os }}-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ maven-${{ runner.os }}-
+ # Mavenキャッシュの設定ここまで
- name: build war
id: builder
run: |
# gradleの場合
./gradlew bootWar
# mavenの場合
#./mvnw package -DskipTests
実際の動作
キャッシュ設定をする前と後でどれくらいの速度の違いが出るのかを確認してみます。
buildジョブの実行時間に着目すると、
修正前は[8m31s]掛かっていたものが、
修正後は[1m27s]とおよそ7分の短縮に繋がりました!
エンジニア募集中
Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています!!