.gitlab-ci.yml缓存/工件配置,用于根据条件为以后的管道/阶段保存大型二进制文件

时间:2020-01-04 19:05:05

标签: python gitlab gitlab-ci devops

背景

我正在为文件夹foo/bar/c_code_src中具有c ++库依赖关系的python项目设置ci / cd。构建阶段运行python setup.py install并编译c ++库二进制文件并将其输出到foo/bar/bin/

然后我运行一个Python单元测试,如果foo/bar/bin不存在,它将失败。

下面的脚本是我第一次尝试使用.gitlab-ci.yml

stages:
  - build
  - test

build:
  stage: build
  script:
  - python setup.py install
  artifacts:
    paths:
      - foo/bar/c_code_src

test:
  stage: test
  dependencies:
    - build
  script:
 - python -m unittest foo/bar/test_bar.py 

这能够正常工作,因为编译c_code_src花费的时间相对较长,并且生成的bin相当大,并且c_code_src中的代码变化不大,我想能够缓存bin文件夹以用于将来的管道,并且仅在c_code_src中的代码更改时运行构建阶段。阅读documentation之后,似乎我想使用cache代替artifacts(或与之配合使用)。

这是我修改.gitlab-ci.yml的尝试:

stages:
  - build
  - test

build:
  stage: build
  script:
  - python setup.py install
  cache:
  - key: bar_cache
    paths:
    - foo/bar/bin
  
test_bar:
  stage: test
  dependencies:
    - build
  cache:
    key: bar_cache
    paths:
    - foo/bar/bin
    policy: pull
  script:
 - python -m unittest foo/bar/test_bar.py 

我不确定的是如何设置仅在c_code_src发生更改时才运行build的条件。

简而言之,我想要:

  • 仅在bin不存在或c_code_src发生更改的情况下运行构建
  • 缓存bin,以使测试阶段始终具有最新的bin,即使构建阶段未运行

1 个答案:

答案 0 :(得分:0)

不确定您是否会遇到bin不存在的情况,因为通常情况下,作业条件将查看提交中正在进行的更改,而无需遍历整个存储库代码。 / p>

不过,您可以相当轻松地对作业进行更改检查。您可以使用only:changesrules:changes。因此,对于相关工作,请添加:

  rules:
    changes:
    - foo/bar/c_code_src/*

关于缓存,您写的内容看起来不错。 Cache isn't always guaranteed to work,但会在必要时提取新版本,因此拥有最新版本应该不是问题。