我刚刚解决了与此类似的问题,每个人都建议使用 API,而我正在为我的管道使用 API。
我的管道有两个阶段:第一阶段 第二阶段
Stage1 is triggered when MR is created (MR status: open)
Stage2 is triggered when MR (MR status: open) is merged (MR status: merged)
现在的问题是这两个阶段是在不同的管道中触发的。不同的管道意味着 GitLab 的所有可变世界仅限于管道本身。什么都没有出去。
然后我用gitlab API. Stage1 将获取 api 列表中第一个最新的开放合并请求 ID,这显然是触发 Stage1 的 MR。由于 Stage1 管道在 MR 的状态变为“打开”时立即开始执行,因此它始终位于打开 MR 列表的顶部。
我通过获取第一个最新的“合并”合并请求 ID 为 Stage2 所做的相同。
一切正常,但使用 api 的问题是时间:(
它有一个窗口,当 gitlab api 使用新的最新合并 id 更新并且您的 Stage1 尚未从 gitlab api 获取合并 id 时,可能会出现问题,无论何时它都会获得合并 id 的新值。这个问题适用于使用 gitlab api 作为合并 ID 的两个阶段。
由于这两个阶段在不同的管道中,他们正在为它们旋转单独的 docker 容器,这一次窗口直到阶段将执行并从 gitlab api 获取合并 id 是问题所在。
所以 gitlab api 数据在这种情况下是不可靠的。然后我转向了gitlab的可变世界。
我从变量 CI_MERGE_REQUEST_IID 获得了 Stage1 中的合并 ID
第一阶段很好。
现在,Stage2 在新管道中运行,并且该管道显示 CI_MERGE_REQUEST_IID 为空。在检查了尽可能多的 CI 变量的值后,我发现我最终在 GitLab 中使用了 export 命令。
我在 .gitlab-ci.yml 中添加了export:
script:
- export
export把所有东西都交出来了!!
export 命令给出了所有变量及其值的列表,可供当前管道中的阶段使用。
我比较了 Satge1 和 Satge2 的变量列表。然后我发现
CI_COMMIT_MESSAGE
虽然它的价值不同在两个阶段之间,我发现合并编号在其中用于 Stage2。
所以对于我的问题,这是只要新管道中可用的变量有一些参考合并 id 并在 Stage2 的这个新管道的变量世界中可用。
尽管管线不同,但它们连接到相同的合并请求并在其不同事件上触发,例如
merge_request_status = "open"
merge_request_status = "merged"
默认情况下 CI_COMMIT_MESSAGE 的值为:
Merge branch '%{source_branch}' into '%{target_branch}'
%{title}
%{issues}
See merge request %{reference}
此消息来自默认模板 (more info)。
%{reference} 默认模板中的变量的值是合并 ID 的路径。所以我从 CI_COMMIT_MESSAGE 中切出了合并的 id
merge_id=$(echo $CI_COMMIT_MESSAGE|awk -F! '{print $2}')
所以现在我的两个管道都在变量中提供合并 id,供两个阶段使用。所以现在管道不再依赖于来自 gitlab api 的第一条信息。相反,现在他们已经有了合并 ID,他们可以从中浏览它下面的所有内容,如管道、提交、作业等,使用 gitlab api 很容易,数据是可靠的。
merge id 是一种父变量,它连接到所有管道、提交、作业等,同时使用 gitlab api 获取数据,并且在 merged MR 事件中很难找到该变量是可悲的。这是一个重要的变量,应该在触发管道的所有类型的事件中可用。
希望这可以帮助。