GitHub Actions¶
构建和运行规范¶
为了持续测试 我们的示例应用程序 - 无论何时推送提交以及有人打开 拉取请求 时,请添加此最小 工作流文件
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。
基本配置变为如下
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:nightly
、crystallang/crystal:0.36.1
、crystallang/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
重要
您必须使用单独的 key
和 restore-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 容器和安装操作。相反,只需使用官方容器
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/*
),可以使用以下两种方式(或两种方式):
-
作为发布的一部分:请参阅完整示例。
然后,您可以在 README 中使用类似于 https://github.com/:username/:reponame/releases/latest 的 URL 链接到最新版本。 -
作为每次提交的 CI 的一部分,通过 actions/upload-artifact。
然后考虑使用外部服务 https://nightly.link/ 链接到最新的“夜间”构建。