使用--follow-tags选项防止gitlab多管道推送

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

我正在寻找一种方法来防止Gitlab为一个push命令创建多个管道(目前跳过不是一个选项),例如:

git add .
git commit -m "Patch something"
git tag -a v1.0.2 -m "Releasing version v1.0.2"
git push --follow-tags

字符串
当前的Gitlab行为是创建两个管道,一个是因为我推到了一个分支,另一个是因为我添加了一个标签。
为了示例起见,假设我的管道有两个阶段:

  • tests(在常规推送和标签上运行)
  • deploy(仅在标记上运行)。

在本例中,这意味着**tests将为该推送运行两次**(每个管道一次)。
我曾经有两个命令:git push -o ci.skip && git push --tag也不好,因为我跳过了一个管道,还有一个bug with badges and skipped pipelines in Gitlab。由于这个bug,我在每个标记上都有unknown状态的标记(即使管道成功了)。
请注意,我希望tests在推送和标记上都运行,我只是不希望它们在同一个推送中发生两次。
现在我只是接受我的一些阶段将在同一个代码库上运行两次,因为我喜欢徽章是正确的。但我很乐意避免无缘无故地使用资源。我目前的管道看起来像这样:

stages:
    - tests
    - deploy

tests:
    stage: tests
    script:
        - echo "Tests"

k8s-stage:
    stage: deploy
    script:
        - echo "Staging"
    only:
        - tags


我读过一些关于workflow keyword的文章,但我不明白它如何在这种情况下使用。我想答案就在这里,但我看不到。
有一个相关的问题here on gitlab,但似乎没有得到解决。

u0sqgete

u0sqgete1#

我希望我把你的问题解决了,这是朝着预期的方向发展的。根据GitLab的说法,使用workflow功能或尽可能精确地使用作业规则是您的选择。例如,对于后面提到的选项,最小化的.gitlab-ci.yml可以如下所示:

stages:
 - tests
 - deploy

my_test_job:
  stage: tests
  script:
    - ./gradlew clean build #sample command that would run tests in Java project managed with Gradle
  rules:
   - if: $CI_COMMIT_TAG == null && $CI_PIPELINE_SOURCE != "merge_request_event"

my_deploy_job:
  stage: deploy
  script:
    - helm install <MY_HELM_RELEASE_NAME> -n <MY_K8S_NAMESPACE> #some sample deploy command via Helm (to a Kubernetes cluster)
  rules:
    - if: $CI_COMMIT_TAG && $CI_PIPELINE_SOURCE != "merge_request_event"

字符串
为了简单起见,在上面的示例中,每个阶段只有一个作业。你当然应该根据自己的需要调整工作规则。请注意,更改作业规则会对其执行逻辑/行为产生影响,并可能再次导致重复的管道出现。
如上所述为两个作业配置规则,作业将以以下方式运行:
1.my_test_job:仅在未设置标记且作业的触发器不是合并请求事件(例如创建或更新/推送到已经打开的合并请求)时运行=>因此,它仅用于分支管道
1.my_deploy_job:仅在设置了标记且作业的触发器不是合并请求事件时运行=>仅为标记事件运行
因此,不应再存在重复的管道。

相关问题