18 个版本

0.6.3 2022年6月14日
0.6.2 2022年1月14日
0.5.0 2021年3月10日
0.4.4 2021年1月12日
0.1.1 2020年4月13日

#230 in 构建工具

每月 43 次下载

Apache-2.0 OR MIT

80KB
1.5K SLoC

Memora:Git 仓库的构建工件缓存

Crate on crates.io Licensed MIT/Apache-2.0

Memora 是一个用于 构建工件 缓存 的工具,用于 Git 仓库。Memora 的目的是最小化冗余构建以节省时间和提高可重复性。

Memora 设计得非常简洁和自包含。使用 Memora 只需要三个条件:Git 仓库、Memora 清单文件memora 可执行文件。Memora 不会以任何方式依赖或干扰您的构建流程。

Memora 不实现自己的存储解决方案,而是依赖于现有的存储系统(目前简单地是一个本地挂载的文件系统)。可以根据需求添加对其他存储系统的支持。

Memora 缓存可以安全地由任意数量的同时运行的 memora 进程使用。通过使用 POSIX 建议性记录锁 防止竞态条件。

Memora 目前设计用于在 CI 流程 中使用,但计划将其扩展以用于主要开发流程(例如,在切换 Git 分支时交换构建工件),以及用于在开发者之间共享构建工件(例如,同事可以在切换到您的分支时轻松检索您的构建工件),以及用于将构建工件交付给最终用户。

安装

安装 Rust,然后使用以下命令安装 Memora

$ cargo install memora

用法

清单文件

Memora 需要一个清单文件来定义缓存位置和存储库中的工件。清单文件必须命名为Memora.yml,并位于 Git 存储库的根目录中,或在 .ci/.gitlab-ci.d/ 子目录中(较早提到的优先)。清单格式如下:

# This is the root directory of the build artifact cache for this Git repository.  The path can be
# absolute or relative to the root of the repository.
cache_root_dir: /some/path
# Each repository has a set of artifact definitions.
artifacts:
  # Each artifact must have a name.  This name is used as `artifact` argument to Memora
  # subcommands, so it should be kept short.  The name of an artifact must be unique among all
  # artifacts in a Memora manifest.
  foo:
    # Each artifact has a list of input and output paths.  All paths must be relative to the root of
    # the repository.  Each path points to a file or a directory.  If it points to a directory, the
    # entire directory is considered.  Wildcards/globbing are currently not supported (but planned
    # to be added for outputs).
    #
    # Inputs are the paths your build flow uses to build the outputs of an artifact.  For example,
    # this could be source code, Makefiles, or configuration files.  Each input must be checked into
    # the Git repository.  The list of inputs must be complete; that is, when none of the inputs
    # changes between two Git objects (e.g., a commit), the entire artifact is considered identical
    # for those two objects.  One input may be used in more than one artifact.  The path to the
    # used `Memora.yml` manifest is an implicit input for every artifact.
    inputs:
      - a
      - b
    # Outputs are the paths your build flow creates or modifies when it builds an artifact.  For
    # example, this could be executables or shared object files.  The list of outputs must contain
    # all files required to "use" the artifact but can (and should in most cases) omit intermediate
    # build products.
    outputs:
      - install/bin/a
      - install/lib/b

缓存目录

之后,请确保在 cache_root_dir 下指定的路径存在,并且 Memora 执行用户可读和可写。

从缓存获取工件

要从缓存获取工件,请执行 memora get <artifact name>(例如,示例清单中的 memora get foo)。如果缓存包含与 Git 存储库当前头版本相比输入没有变化的 foo 的输出,则此命令将返回零。如果缓存不满足这些要求或发生错误(例如 I/O),则命令将返回非零。如果您想在不获取其输出的情况下知道工件是否已缓存,请使用 memora lookup

将工件插入缓存

要将工件插入缓存,请执行 memora insert <artifact name>(例如,示例清单中的 memora insert foo)。如果输出可以被插入到缓存或缓存已包含这些输出(在上述匹配条件下),则此命令将返回零。如果发生错误(例如 I/O),则命令将返回非零。

示例 CI 配置

您可能想在以下示例中的 CI 作业中使用 Memora,其中 compiler 工件只有在需要时才会重建,否则从缓存中获取

build_and_run:
  script:
    - >
      if ! memora get compiler; then
        make compiler
        memora insert compiler
      fi
    - ./compile ...

就这样,您已经缓存了 compiler 工件,而不需要您的 CI 运行器或管理软件的任何特定功能。如果您想在某些 CI 运行(例如,夜间)中禁用 Memora,请将清单中的 disable_env_var 设置为在那些运行期间定义的环境变量。

依赖项

~5–15MB
~171K SLoC