Gitlab pipelines为什么CI_COMMIT_分支存在时CI_COMMIT_TAG为null

mrphzbgm  于 2023-08-01  发布在  Git
关注(0)|答案(1)|浏览(165)

在作业规则中,您不能执行以下操作:

test_prod:
  stage: deploy
  environment: 
     name: $ENVIRONMENT
  script:
    - echo $ENVIRONMENT
    - echo $CI_COMMIT_TAG
  rules:
   - if: $CI_COMMIT_BRANCH == "main" && $CI_COMMIT_TAG

字符串
根据这篇文章:$CI_COMMIT_TAG in "if" statemets of regular job
例如,如果您只是将新提交推送到远程,则CI_PIPELINE_SOURCE的值将为push。对于推送流水线,许多预定义变量将不存在,诸如CI_COMMIT_TAG、CI_MERGE_REQUEST_SOURCE_分支_NAME、CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_NAME等。
但是,如果你在GitLab UI中或从git push --tags命令中创建一个Git Tag,它将创建一个Tag管道,并且CI_COMMIT_TAG等变量将存在,但CI_COMMIT_分支将不存在。
这是什么原因呢?

b1zrtrql

b1zrtrql1#

这是因为git使用树结构和指针进行操作。请参考这个gitlab issue以了解更多细节,并由Drew Stachon评论:https://gitlab.com/gitlab-org/gitlab/-/issues/34578#note_381469101
不幸的是,“分支上的标记”这个概念在Git中并不存在。v0.0.2和master只是两个不同的参考,其中一个恰好指向另一个参考的修订历史中的SHA。说v0.0.2在master上,就像说master在最新的特性分支上一样。您可以想象将此逻辑构建到CI作业中,但它将涉及检测标记ref并将SHA与master的修订历史中的每个SHA进行比较,然后继续作业或退出0-ing或其他任何操作。但我强烈建议不要这样做。我猜标签v0.0.2在master的修订历史中具有特殊的意义。如果是这样的话(例如:如果您使用标签发布版本),那么我建议对在master上创建的标签采用特定的命名约定,而不要在其他地方使用它们。CI规则会在$CI_COMMIT_TAG =~ /^v\d+.\d+.\d+$/上启动某个特定的作业,而且商业规则是这些标签只在master中的提交时创建。我们在一个较小的项目上使用这个工作流程,它对我们来说效果很好。如果您使用它们来发布内容,您还应该在存储库中将标记设置为protected。如果有帮助,请告诉我,或者有什么需要我澄清的。

相关问题