Gitlab CI:如何使“rules.changes”将更改的文件与主分支进行比较?

Ore*_*tis 4 continuous-integration gitlab docker gitlab-ci

我正在尝试为我的存储库创建一个基础映像,当分支(合并请求)对依赖项进行更改时,可以选择重新构建该基础映像。

假设我有这个管道配置:

stages:
  - Test
  - Build

variables:
  - image: main

Changes A:
  stage: Test
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push"'
      changes:
        - path/to/a
  script:
    - docker build -t a .
    - docker push a
    - echo 'image=a' > dotenv
  artifacts:
    reports:
      dotenv: dotenv

Build:
  stage: Build
  image: $image
  script:
    - echo build from $image
Run Code Online (Sandbox Code Playgroud)

假设我推送到一个新分支并且第一次提交更改/path/to/a,构建并推送了 docker 映像,更新了 dotenv 并且Build作业成功使用了image=a.

现在,假设我将新提交推送到同一分支。但是,新提交不会更改,/path/to/a因此Changes A作业不会运行。现在,该Build阶段拉出了“错误”的默认值image=main,而我希望它仍然拉动image=a,因为它建立在上一次提交的基础上。

关于如何处理这个问题有什么想法吗?

  • 有没有办法可以rules.changes参考一下origin/main
  • 关于如何实现我想做的事情还有其他想法吗?

Von*_*onC 5

\n

有没有办法可以rules.changes参考一下origin/main

\n
\n

是的,从GitLab 15.3(2022 年 8 月)开始:

\n
\n

新分支改进了 CI/CD 变化的行为

\n

changes通过新分支改进 CI/CD 的行为

\n

将 CI/CD 作业配置为在更改某些文件时在管道上运行rules: changes对于合并请求管道非常有用。
\n它比较源分支和目标分支以查看发生了什么变化,并根据需要添加作业。

\n

不幸的是,changes它不适用于分支管道。
\n例如,如果管道针对新分支运行,changes则没有可比较的内容并且始终返回true,因此作业可能会意外运行。

\n

在此版本中,我们\xe2\x80\x99为作业和都添加compare_to了,以改进分支管道中的行为。rules:changesworkflow:rules

\n

您现在可以配置作业以检查新分支和定义的比较分支之间的更改。
\nrules:changes:compare与您定义的分支相比,使用的作业将按照您期望的方式工作。

\n

这对于单一存储库非常有用,其中可以将许多独立作业配置为根据存储库中正在处理的组件来运行。

\n
\n

请参阅文档问题

\n
\n

您只能将其用作作业的一部分,并且必须与规则:更改:路径结合使用。

\n
\n

例子:

\n
\n
docker build:\n script: docker build -t my-image:$CI_COMMIT_REF_SLUG .\n rules:\n   - if: $CI_PIPELINE_SOURCE == "merge_request_event"\n     changes:\n       paths:\n         - Dockerfile\n       compare_to: \'refs/heads/branch1\'\n
Run Code Online (Sandbox Code Playgroud)\n

Dockerfile在此示例中,仅当相对于refs/heads/branch1且管道源是合并请求事件发生更改时,才会包含 docker 构建作业。

\n
\n