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/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/*"
還有 sbt-github-actions,這是 Daniel Spiewak 的 sbt 外掛程式,可以產生工作流程檔案,並將設定保留在 build.sbt
檔案中。