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
文件中。