跳至内容

GitHub Actions

构建和运行规范

为了持续测试 我们的示例应用程序 - 无论何时推送提交以及有人打开 拉取请求 时,请添加此最小 工作流文件

.github/workflows/ci.yml
on:
  push:
  pull_request:
    branches: [master]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Download source
        uses: actions/checkout@v2
      - name: Install Crystal
        uses: crystal-lang/install-crystal@v1
      - name: Run tests
        run: crystal spec

要开始使用 GitHub Actions,请将此 YAML 文件提交到您的 Git 存储库中的 .github/workflows/ 目录下,将其推送到 GitHub,并观察 Actions 选项卡。

快速入门

查看 install-crystal 操作的配置器,快速获取包含您需要的 CI 功能的配置。或者继续阅读以了解更多详细信息。

这将在 GitHub 的 默认“最新 Ubuntu”容器上运行。它从存储库本身(直接进入当前目录)下载源代码,通过 Crystal 的官方 GitHub Action 安装 Crystal,然后运行规范,假设它们位于 spec/ 目录中。

如果任何步骤失败,构建将显示为失败,通知作者,如果它是推送操作,则将项目的整体构建状态设置为失败。

提示

为了获得更健康的代码库,请考虑为 crystal spec 使用这些标志
--order=random --error-on-warnings

没有规范?

如果您的测试覆盖率不是很好,请至少添加一个示例程序,并将其作为 CI 的一部分进行构建

对于库

          - name: Build example
            run: crystal build examples/hello.cr

对于应用程序(即使您有规范,这也非常值得做)

          - name: Build
            run: crystal build src/game_of_life.cr

使用不同版本的 Crystal 进行测试

默认情况下,将安装最新版本的 Crystal。但是您可能还想使用 Crystal 的“每日构建”版本进行测试,以及您仍然为项目提供支持的某些旧版本。请将工作流的顶部更改如下

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        crystal: [0.35.1, latest, nightly]
    runs-on: ubuntu-latest
    steps:
      - name: Download source
        uses: actions/checkout@v2
      - name: Install Crystal
        uses: crystal-lang/install-crystal@v1
        with:
          crystal: ${{ matrix.crystal }}
      - ...

所有这些版本将并行测试。

通过指定 Crystal 的版本,您甚至可以选择支持最新版本(这是一个不断变化的目标),而只支持特定的版本。

在多个操作系统上进行测试

通常,开发人员只在 Ubuntu 上运行测试,如果代码不依赖平台,这样做是可以的。但是很容易在测试矩阵中添加另一个 系统,只需在作业定义的顶部附近添加以下内容

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - ...

安装 Shards 包

大多数项目将具有外部依赖项,"shards"。在 shard.yml 中声明它们后,只需将安装步骤添加到您的工作流中(在 install-crystal 之后,并在任何测试之前)

      - name: Install shards
        run: shards install

最新依赖项还是锁定依赖项?

如果您的存储库已签入 shard.lock 文件(通常适用于应用程序),请考虑这将对 CI 产生什么影响:shards install 将始终安装该文件中指定的确切版本。但是,如果您正在开发库,您可能希望第一个发现依赖项的新版本是否会中断库的安装 - 否则用户会发现,因为锁不会进行传递应用。因此,强烈建议运行 shards update 而不是 shards install,或者不要签入 shard.lock。然后,在您的存储库中添加 计划运行 很有意义。

安装二进制依赖项

我们的应用程序或某些分片可能需要外部库。安装它们的方法可能大相径庭。典型方法是使用 Ubuntu 中的 apt 命令安装软件包。

在开头附近添加安装步骤。例如,使用 libsqlite3

      - name: Install packages
        run: sudo apt-get -qy install libsqlite3-dev

强制代码格式

如果您想验证您的所有代码是否都已使用 crystal tool format 进行格式化,请在工作流的末尾附近添加相应的检查作为一步。如果有人推送了格式不正确的代码,这将像失败的测试一样中断构建。

      - name: Check formatting
        run: crystal tool format --check

还可以考虑将此检查作为Git 预提交钩子为自己添加。

使用官方 Docker 镜像

我们一直在使用“操作”将 Crystal 安装到 GitHub 提供的默认操作系统镜像中。这 具有多个优势。但是,您也可以选择使用 Crystal 的官方 Docker 镜像,但这只适用于 Linux。

基本配置变为如下

.github/workflows/ci.yml
jobs:
  build:
    runs-on: ubuntu-latest
    container:
      image: crystallang/crystal:latest
    steps:
      - name: Download source
        uses: actions/checkout@v2

      - name: Run tests
        run: crystal spec

对于容器,一些 其他选项crystallang/crystal:nightlycrystallang/crystal:0.36.1crystallang/crystal:latest-alpine

缓存

下载和安装依赖项(特别是分片)的过程在每次运行时都是从头开始的。通过在 GitHub Actions 中进行缓存,我们可以节省一些重复的工作。

安全的方法是在 actions/cache 步骤中添加(在使用 shards 的步骤之前)如下定义

      - name: Cache shards
        uses: actions/cache@v2
        with:
          path: ~/.cache/shards
          key: ${{ runner.os }}-shards-${{ hashFiles('shard.yml') }}
          restore-keys: ${{ runner.os }}-shards-
      - name: Install shards
        run: shards update

重要

必须使用单独的 keyrestore-keys。只使用静态密钥,缓存只会保存第一次运行后的状态,然后永远重复使用它,无论有任何更改。

但这只会节省我们最初下载存储库所花费的时间。

一种更“大胆”的方法是缓存lib目录本身,但这只有在完全依赖于shard.lock的情况下才有效(请参阅最新或锁定依赖项?)。

      - name: Cache shards
        uses: actions/cache@v2
        with:
          path: lib
          key: ${{ runner.os }}-shards-${{ hashFiles('**/shard.lock') }}
      - name: Install shards
        run: shards check || shards install

请注意,我们还使安装依赖于shards check。这可以节省更多时间。

发布可执行文件

如果您的项目是应用程序,您可能希望将其作为可执行文件(“二进制”文件)进行分发。对于 Linux x86_64 的情况,最受欢迎的选择是构建和静态链接在 Alpine Linux 上。这意味着您不能使用 GitHub 的默认 Ubuntu 容器和安装操作。相反,只需使用官方容器

.github/workflows/release.yml
jobs:
  release_linux:
    runs-on: ubuntu-latest
    container:
      image: crystallang/crystal:latest-alpine
    steps:
      - uses: actions/checkout@v2
      - run: shards build --production --release --static --no-debug

这些步骤将接着进行一些操作以发布生成的执行文件 (bin/*),可以使用以下两种方式(或两种方式):

分发适用于 macOS (搜索示例) 和 Windows (搜索示例) 的可执行文件也是可能的。