1. 使用 sbt 設定 GitHub Actions

使用 sbt 設定 GitHub Actions 

GitHub Actions 是 GitHub 的工作流程系統,支援持續整合 (CI) 和持續部署 (CD)。由於 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_OPTSJVM_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

請注意,建置矩陣中的 osjava 鍵沒有任何神奇之處。

您定義的鍵會成為 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 

還有 sbt-github-actions,這是 Daniel Spiewak 的 sbt 外掛程式,可以產生工作流程檔案,並將設定保留在 build.sbt 檔案中。