这是我之前关于使用nix-shell建立一个简单的Ruby开发环境的文章的后续,在这篇文章中我提到我不确定我是否完全指定了开发环境。虽然这与我配置隔离开发环境的主要目的有点相左,但我认为修改自动发布本网站的GitHub动作工作流使用nix会有启发。
修改GitHub行动工作流程以使用nix
我找到了cachix/install-nix-action,并决定在我的工作流程中使用它,以及我已经创建的shell.nix 和gemset.nix 文件。我不得不删除 "ruby:2.6.6 "容器镜像的规范,因为它不包括install-nix-action步骤中安装nix所需的一些软件包。删除这个规范意味着工作流程回到了使用GitHub的 "ubuntu-latest "虚拟环境,该环境安装了大量的操作系统包,包括安装nix所需的包。
然后,我在现有的行动/结账步骤之后立即插入了install-nix-action步骤,删除了安装node.js和捆绑宝石的步骤,并修改了建立网站的步骤,以运行nix-shell --command 'middleman build' ,即在shell.nix 指定的外壳内建立网站。
在这一点上,令我惊讶的是,构建成功了!你可以看到我所做的所有修改。
name: Continuous Deployment to GitHub Pages
on:
push:
branches:
- main
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@master
- uses: cachix/install-nix-action@v10
with:
nix_path: nixpkgs=channel:nixos-unstable
- name: Build site
run: nix-shell --command 'middleman build'
- name: Publish site
uses: maxheld83/ghpages@v0.2.1
env:
GH_PAT: ${{ secrets.GH_PAT }}
BUILD_DIR: ./build
你可以在这个提交中看到我做的所有修改。
观察
和在本地机器上运行nix-shell的经验一样,我迟迟没有意识到node.js是由GitHub的虚拟环境而不是nix-shell提供的。我确实花了一点时间来研究这个问题,把工作流程建立在一个最小的容器镜像上,但事实证明,准备一个适合安装nix的容器镜像并非易事。所以我决定在这一点上放弃。虽然这意味着我仍然没有明确地证明我已经完全指定了开发环境,但我已经说服了自己,我明白了正在发生的事情,而且只要有足够的时间就可以证明这一点!
我惊喜地看到,基于nix的构建明显快于原始构建,尽管捆绑的宝石在后者中被缓存了。一些速度的提高可以归因于基于nix的构建不需要启动一个单独的容器,但是粗略的看了一下日志,大部分的收获似乎是不需要安装捆绑的宝石。
- 在没有nix-shell的情况下进行构建4分48秒
- 使用nix-shell构建1分44秒
接下来的步骤
虽然这是一个有趣的转移,但我计划通过为一个简单的Rails应用程序创建一个开发环境回到正轨,可能这个应用程序不需要数据库。