GitHub Actions は、継続的インテグレーション (CI) および継続的デプロイメント (CD) をサポートする GitHub のワークフローシステムです。 CI/CD 機能は 2019 年 に導入されたため、CI/CD 分野では新参者ですが、オープンソースの Scala プロジェクトの事実上の標準 CI ソリューションとして急速に台頭しました。
project/build.properties
を設定する 継続的インテグレーションは、自分のマシン以外でコードが動作することを確認するのに最適な方法です。まだ作成していない場合は、必ず project/build.properties
を作成し、sbt.version
番号を明示的に設定してください。
sbt.version=1.9.8
これでビルドは 1.9.8 を使用するようになります。
Github Actions の秘訣は、Github Actions の 公式ドキュメント ( リファレンス を含む) に記載されています。 このガイドをインスピレーションとして使用し、詳細については公式ソースを参照してください。
GitHub Actions 用にビルドを設定するには、主に .github/workflows/ci.yml
を設定します。 これは、setup-java を使用した最小限の CI ワークフローの例です。
name: CI
on:
pull_request:
push:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 8
- name: Build and Test
run: sbt -v +test
デフォルトの JVM オプションは、setup-java で採用された公式の sbt ランナーによって提供され、ほとんどの場合で機能するはずです。 カスタマイズする場合は、-v
オプションを使用して、最初に現在のオプションを出力するようにスクリプトに指示してください。
# Executing command line:
java
-Dfile.encoding=UTF-8
-Xms1024m
-Xmx1024m
-Xss4M
-XX:ReservedCodeCacheSize=128m
-jar
/usr/share/sbt/bin/sbt-launch.jar
これを上書きするために、JAVA_OPTS
および JVM_OPTS
環境変数を定義できます。
name: CI
on:
pull_request:
push:
jobs:
test:
runs-on: ubuntu-latest
env:
# define Java options for both official sbt and sbt-extras
JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
JVM_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 8
- name: Build and Test
run: sbt -v +test
繰り返しますが、フラグが有効になっているかどうかを確認するためにログを確認しましょう。
# Executing command line:
[process_args] java_version = '8'
java
-Xms2048M
-Xmx2048M
-Xss6M
-XX:ReservedCodeCacheSize=256M
-Dfile.encoding=UTF-8
-jar
/usr/share/sbt/bin/sbt-launch.jar
+test
ジョブ間でさまざまなアーティファクトをキャッシュすることで、GitHub Actions での sbt
ビルドを高速化できます。
アクション setup-java
には、ビルドのロード時またはプロジェクトのビルド時に sbt によってダウンロードされたアーティファクトをキャッシュするための組み込みサポートがあります。
これを使用するには、アクション setup-java
の入力パラメーター cache
を値 "sbt"
に設定します。
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 8
cache: sbt
- name: Build and test
run: sbt -v +test
追加された行 cache: sbt
に注意してください。
全体として、キャッシュを使用すると、ジョブごとに数分のビルド時間を短縮できます。
継続的インテグレーションジョブを作成する場合、タスクを並行して実行される複数のジョブに分割するのはごく一般的です。 たとえば、次のことが可能です。
どちらのユースケースも、ビルドマトリックス を使用して可能です。 ここでのポイントは、いくつかのバリアンスを除いて、ほとんどの場合ステップを再利用したいということです。 ステップが重複しないタスク (テストとデプロイなど) の場合は、別のジョブまたは新しいワークフローを作成する方がよい場合があります。
これは、JDK バージョンとオペレーティングシステムを使用してビルドマトリックスを形成する例です。
name: CI
on:
pull_request:
push:
jobs:
test:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
java: 8
- os: ubuntu-latest
java: 17
- os: windows-latest
java: 17
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: ${{ matrix.java }}
- name: Build and test
shell: bash
run: sbt -v +test
ビルドマトリックスの os
または java
キーに魔法はないことに注意してください。
定義したキーは
matrix
コンテキストのプロパティになり、ワークフローファイルの他の領域でプロパティを参照できます。
反復処理するための任意のキーを作成できます。 これを使用して、jobtype
という名前のキーを作成して作業を分割することもできます。
name: CI
on:
pull_request:
push:
jobs:
test:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
java: 17
jobtype: 1
- os: ubuntu-latest
java: 17
jobtype: 2
- os: ubuntu-latest
java: 17
jobtype: 3
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: ${{ matrix.java }}
- name: Build and test (1)
if: ${{ matrix.jobtype == 1 }}
shell: bash
run: |
sbt -v "mimaReportBinaryIssues; scalafmtCheckAll; +test;"
- name: Build and test (2)
if: ${{ matrix.jobtype == 2 }}
shell: bash
run: |
sbt -v "scripted actions/*"
- name: Build and test (3)
if: ${{ matrix.jobtype == 3 }}
shell: bash
run: |
sbt -v "dependency-management/*"
これらをすべてまとめたサンプルを次に示します。ほとんどのセクションはオプションであることに注意してください。
name: CI
on:
pull_request:
push:
jobs:
test:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
java: 17
jobtype: 1
- os: ubuntu-latest
java: 17
jobtype: 2
- os: windows-latest
java: 17
jobtype: 2
- os: ubuntu-latest
java: 17
jobtype: 3
runs-on: ${{ matrix.os }}
env:
# define Java options for both official sbt and sbt-extras
JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
JVM_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: ${{ matrix.java }}
cache: sbt
- name: Build and test (1)
if: ${{ matrix.jobtype == 1 }}
shell: bash
run: |
sbt -v "mimaReportBinaryIssues; scalafmtCheckAll; +test;"
- name: Build and test (2)
if: ${{ matrix.jobtype == 2 }}
shell: bash
run: |
sbt -v "scripted actions/*"
- name: Build and test (3)
if: ${{ matrix.jobtype == 3 }}
shell: bash
run: |
sbt -v "dependency-management/*"
Daniel Spiewak による sbt プラグインである sbt-github-actions もあります。これは、ワークフローファイルを生成し、設定を build.sbt
ファイルに保持できます。