我可以在 gitlab 管道中引用另一个项目而不是克隆它吗?

时间:2021-07-19 14:02:34

标签: gitlab gitlab-ci

我对 gitlab 管道完全陌生,所以我不确定这样做的最佳方法是什么。我已经阅读了关于子模块和依赖项、触发其他管道的内容,但我很难理解什么有助于我在这里尝试实现的目标。

我有 project_b,它是 project_a 的子模块。在 project_b 的 .gitlab-ci.yml 中,当前正在克隆 project_a,然后将 project_b 移动到 project_a 中子模块通常所在的位置:

...
default:
...
    before_script:
        - git clone (project_a)
        - mv project_a /src
        - rm -rf /src/submodules/project_b/*
        - mount --bind /src/submodules/project_b
...

这是因为 project_b 依赖于 project_a。

不过,据我所知,这意味着 project_b 位于 project_a 的下游。

我不想每次运行 project_b 管道时都必须克隆整个 project_a 存储库。

我已经看到了很多关于为相关项目触发下游管道的信息,但我唯一能找到的似乎与我的案例有关的信息是这个问题前一段时间问到的关于 gitlab 缺乏触发上游管道的功能反而: Upstream triggering in Gitlab-CI aka pipeline dependencies

是否添加了此功能?因为我肯定在网上找不到任何信息。否则,关于如何绕过克隆整个 project_a 存储库的任何建议?我可能完全不在这儿,但我想知道的一件事是,是否有某种方法可以让 project_b 触发 project_a 的特定管道,它只执行我需要做的事情来测试 project_b?

任何建议将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:1)

Gitlab CI/CD multi-project pipelines 没有上游和下游的内在概念,因此您可以通过在 trigger 关键字中引用项目名称来创建触发另一个管道的管道:

# inside project B .gitlab-ci.yml

# this stage will trigger project A pipeline to run
merge_requests:
  stage: test
  trigger: my/project_a

您还可以使用 rules 关键字在下游管道中运行特定阶段。

# in project A .gitlab-ci.yml

# this will never run when triggered by project B
merge_requests:
  stage: test
  script: echo "test some things"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "trigger"'
      when: never

# this stage will always run when triggered by project B
merge_request_downstream:
  stage: test
  rules:
    - if: '$CI_PIPELINE_SOURCE == "trigger"'
  script: echo "test some specific project B things"

因此您可以将项目 B 特定的测试放在 merge_request_downstream 的脚本中。希望这能回答你的问题。我不太确定这是否比在项目 B 脚本中克隆项目 A 更好,但这是使用多项目管道完成它的方式。