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、操作系统和其他设置上运行不同的测试子集

这两种用例都可以使用 构建矩阵 来实现。这里需要注意的是,我们希望在很大程度上重复使用步骤,除了少数差异。对于步骤不重叠的任务(如测试与部署),最好创建不同的作业或新的工作流程。

以下是如何使用 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 文件中。