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 次下载
80KB
1.5K SLoC
Memora:Git 仓库的构建工件缓存
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