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

the*_*tor 2 gitlab gitlab-ci

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

我有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
...
Run Code Online (Sandbox Code Playgroud)

这是因为project_b 依赖于project_a。

不过,据我了解,这意味着project_b是project_a的下游。

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

我已经看到了大量有关为依赖项目触发下游管道的信息,但我唯一能找到的似乎与我的案例相关的是不久前提出的关于 gitlab 缺乏触发上游管道的功能的问题: 上游在 Gitlab-CI 中触发,又名管道依赖项

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

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

wed*_*edm 5

Gitlab CI/CD多项目管道没有上游和下游的内在概念,因此您只需在关键字中引用项目名称即可创建一个触发另一个管道的管道trigger

# inside project B .gitlab-ci.yml

# this stage will trigger project A pipeline to run
merge_requests:
  stage: test
  trigger: my/project_a
Run Code Online (Sandbox Code Playgroud)

您还可以使用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"
Run Code Online (Sandbox Code Playgroud)

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