在持续交付工作流中使用 nix

Using nix in a continuous delivery workflow

能否在持续交付工作流中使用nix

我们正在使用 semaphore 作为我们的持续集成服务,现在我正在研究在成功构建后构建包。为此,我正在考虑使用 nix

我不知道用这个包管理器设置持续交付管道的正确方法是什么。似乎这样的自动化过程将涉及:

  1. 创建 nixpkgs 存储库的分支(在 CI 服务器中)。
  2. 正在更新 fetchFromGithubrev 字段。
  3. (自动)提交拉取请求。

但我不知道这是否有意义,而且我担心持续交付过程涉及手动步骤(让人批准拉取请求)。

Can nix be used in a continuous-delivery workflow?

是的。它通常使用 Hydra,一个使用 Nix 构建的 CI 系统来完成。但是,可能可以用 Semaphore 做到这一点。

Semaphore CI 提供特定于语言的构建环境,但是......它是 running Ubuntu,所以理论上你可以这样做:

  1. 安装 Nix as if it were a dependency. See this 文章。
  2. 添加你的 Nix 包,我想你可以用 Git 来完成。你真的不需要克隆 Nixpkgs。
  3. 使用 nix-build 构建您的程序包。这将为构建输出创建一个 result 符号 link。
  4. 使用 git-deploy 部署。

如果你对你的包做这样的事情,你可以直接从 nix-build 调用它,因为你不必提供包依赖项作为参数:

{ pkgs ? import <nixpkgs> {} }:
let
   stdenv = pkgs.stdenv;
   ...
in
  stdenv.mkDerivation {
    ..
  }

优化

为每个构建安装 Nix 是一种浪费,但也许您可以缓存 Nix 存储。请参阅 this 文章。