1. sbt で GitHub Actions をセットアップする

sbt で GitHub Actions をセットアップする 

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 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 オプション 

デフォルトの 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 8、JDK 11、Linux、macOS、Windows で同じテストを実行する
  • 同じ JDK、OS、およびその他のセットアップで、異なるテストのサブセットを実行する

どちらのユースケースも、ビルドマトリックス を使用して可能です。 ここでのポイントは、いくつかのバリアンスを除いて、ほとんどの場合ステップを再利用したいということです。 ステップが重複しないタスク (テストとデプロイなど) の場合は、別のジョブまたは新しいワークフローを作成する方がよい場合があります。

これは、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/*"

サンプルの .github/workflows/ci.yml 設定 

これらをすべてまとめたサンプルを次に示します。ほとんどのセクションはオプションであることに注意してください。

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/*"

sbt-github-actions 

Daniel Spiewak による sbt プラグインである sbt-github-actions もあります。これは、ワークフローファイルを生成し、設定を build.sbt ファイルに保持できます。