常规作业状态集中的$CI_COMMIT_TAG(&Q;IF&Q;) [英] $CI_COMMIT_TAG in "if" statemets of regular job

查看:35
本文介绍了常规作业状态集中的$CI_COMMIT_TAG(&Q;IF&Q;)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试做一个非常基本的GitLab CI工作。
我想:
当我推送开发时,GitLab使用标签&Development&构建docker映像
当我推送到Main时,GitLab检查当前提交是否有标签,并使用它构建映像或作业未被触发。

Build and publish docker image:
  stage: build
  rules:
    - if:
        ($CI_COMMIT_BRANCH == "main" && $CI_COMMIT_TAG && $CI_PIPELINE_SOURCE == "push")
      variables:
        TAG: $CI_COMMIT_TAG
    - if:
        ($CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "push")
      variables:
        TAG: develop
  script:
    - echo $TAG
    - ...<another commands>

但是它没有像预期的那样工作。$CI_COMMIT_TAG-为空。尽管已提交,但触发器作业(合并提交)仍有标记。

我找到的解释that i found无助于使用";if";语句实现我的目标。
此处建议的解决方案based on workflow也没有帮助。

通过直观的方式使用名为COMMIT_TAG的变量似乎是相当常见的工作。
但它就是不起作用。请问有没有人能给我解释一下如何实现我的目标?

推荐答案

GitLab CI/CD有多个"管道源",并且某些Predefined Variables仅存在于某些源。

例如,如果您只将新提交推送到远程,CI_PIPELINE_SOURCE的值将为push。对于push管道,很多预定义变量将不存在,如CI_COMMIT_TAGCI_MERGE_REQUEST_SOURCE_BRANCH_NAMECI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_NAME等。

但是,如果您在GitLab UI中或通过git push --tags命令创建一个Git标记,它将创建一个标记管道,并且像CI_COMMIT_TAG这样的变量将会存在,但CI_COMMIT_BRANCH将不会存在。

无论是什么触发了管道,都将始终存在的一个变量是CI_COMMIT_REF_NAME。对于提交绑定到分支的推送源,此变量将保存分支名称。如果提交未绑定到分支(即,曾经有该提交的分支,但现在已将其删除),则它将保留完整提交SHA。或者,如果管道用于标记,则它将保存标记名称。

有关详细信息,请阅读不同的管道源(在CI_PIPELINE_SOURCE变量的说明中)和上面链接的文档中的其他变量。

我要做的是将此检查移到script部分,以便我们可以使其更加复杂,或者立即exit 0以便作业不会运行且不会失败,或者运行脚本的睡觉。

Build and publish docker image:
  stage: build
  script:
    - if [ $CI_PIPELINE_SOURCE != 'push' ]; then exit 0 fi
    - if [ $CI_COMMIT_REF_NAME != 'develop' && $CI_COMMIT_TAG == '' ]; then exit 0 fi
    - if [ $CI_COMMIT_TAG != '' ]; then git branch --contains $CI_COMMIT_TAG | grep main; TAG_ON_MAIN=$? fi
    - if [ $TAG_ON_MAIN -ne 0 ]; then exit 0 fi
    - echo $TAG
    - ...<other commands>

这有点混乱,所以这里是逐行的:

  1. 如果$CI_PIPELINE_SOURCE变量不是‘Push’,我们exit 0
  2. 如果$CI_COMMIT_REF_NAME(同样,提交SHA、标记名或分支名称)不是develop并且$CI_COMMIT_TAG为空,exit 0
  3. 如果$CI_COMMIT_TAG不为空,我们将运行一个命令来查看标记是否基于maingit branch --contains <tag_name>。这将返回此标记所属的所有分支(即创建该标记的分支,以及创建标记之后存在的所有分支)。然后,我们通过grep传递结果以查找main。如果main在结果列表中,则退出代码为0,我们可以通过特殊变量$?获得该代码(总是返回前一个命令的退出代码)。然后,我们将此退出代码设置为要在下一个条件中使用的变量。
  4. 我们检查步骤3.grep的退出代码是否是非0(即main<tag_name>分支列表中的不是的一部分),我们exit 0

完成所有这些操作后,我们可以确保管道源为push,或者存在标记并且位于main分支上,或者没有标记并且管道用于develop分支。

这篇关于常规作业状态集中的$CI_COMMIT_TAG(&Q;IF&Q;)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆