【问题标题】:GitLab CI - avoid build when adding tagGitLab CI - 添加标签时避免构建
【发布时间】:2020-06-06 15:23:57
【问题描述】:

如何防止在添加 git 标签时触发 gitlab ci 管道?我在本地运行这个命令(而不是在 gitlab-ci 作业中)

git tag -a "xyz"

然后推送标签;这会触发各种管道。我想排除其中一些管道运行。

我正在尝试对来自this 等问题的想法进行变体;该问题仅使用,我想排除,所以我正在尝试除外。那里的答案有两种变体,一种带有 refs 一种没有。

build:  
  # ... my work here ...  
  except:
    - tags


build:  
  # ... my work here ...  
  except:
    refs:
      - tags

似乎都没有任何效果;我添加了一个标签,构建仍然发生。

我的理解在这里可能完全是错误的,因为 tags 这个词似乎有三种可能的含义,并且在阅读文档或示例时,我并不总是确定哪种含义适用:

  1. 使用 git tag 应用的 Git 标记
  2. 用于确定哪些跑步者选择工作的 Gitlab CI 标签
  3. 提交的 ref 标识符用于通过 REST API 触发管道。这通常是一个分支名称,但也可以是一个 git 标签。

我有兴趣控制在第一种情况下会发生什么。到目前为止,从 cmets 看来,“除了:-tags”与我的情况无关,那么有没有可行的方法?

【问题讨论】:

  • Per docs.gitlab.com/ee/ci/yaml/#onlyexcept-basic 这指的是 git 标签。您还可以在该页面上查看有关 refs 策略的信息。请注意,标记提交将有两个构建;一个用于提交,一个用于标记。
  • 谢谢@jonrsharpe。我同意这就是文档所说的“标签”的含义。有什么方法可以防止 git 标签导致这些构建?
  • 您是在本地使用git tag -a TAG,然后是git push origin TAG?或者git tag 命令是您的.gitlab-ci.yml 工作的一部分?
  • @Nicolas Pepinster - 在本地运行并推送,补充说明

标签: git gitlab gitlab-ci


【解决方案1】:

(注意:这是一个格式化的评论而不是一个答案)

为了调试触发管道的条件:

gitlab's doc 提到了运行 CI 作业时设置的几个变量,其中:

  • CI_COMMIT_REF_NAME : 为其构建项目的分支或标签名称
  • CI_COMMIT_BRANCH :提交分支名称。仅在构建分支时出现。
  • CI_COMMIT_TAG :提交标签名称。仅在构建标签时出现。

让您的构建作业输出其中一些变量(例如:echo "triggered by ref : " $CI_COMMIT_REF_NAME)以查看触发您的作业的原因。

【讨论】:

    【解决方案2】:

    Except tags 正是您想要跳过构建标签时应该使用的。

    你一定要了解commit vs branches vs tags

    为了说明将标记提交推送到 gitlab 时会发生什么,我做了如下操作:

    1. 创建了.gitlab-ci.yml,内容如下:
    tests_always_run:
        script:
          - echo I should always execute
    tests_except_tags:
        script:
          - echo I skip tagged triggers
        except:
          - tags
    
    1. 提交的更改、标记的提交并使用--follow-tags 推送以确保标记也传播到服务器:
    git add .gitlab-ci.yml
    git commit -m 'my great yml with except tags'
    git tag -a "abc" -m "Test tag"
    git push --follow-tags
    

    图示结果:

    如果您想为选定的提交跳过 CI,那么您可以使用 git push -o ci.skip,灵感来自 this article

    【讨论】:

      【解决方案3】:

      看起来 GitLab 建议使用 rules 而不是 except 根据 the documentation

      only 和 except 没有被积极开发。规则是 控制何时向管道添加作业的首选关键字。

      原来如此

      your_job:
        stage: your_stage
        script:
          - echo "Hello"
        rules:
          - if: $CI_COMMIT_TAG
            when: never 
          - when: always
      

      【讨论】:

      • @diegosaw,谢谢。我们仍在 v12 上,文档说:“注意:规则语法现在是设置作业策略的首选方法。只有和除外是弃用的候选者,将来可能会被删除。”很高兴你引起了我的注意。
      【解决方案4】:

      我也遇到了同样的情况,我的解决办法是这样的:

      之前::

      之后:

      两个阶段都在我的 .gitlab-ci.yml 文件中配置,名称不同 “Dev-UnitTests”,它只在有人提交到存储库时执行,对分支“test”的tags没有影响 p>

      Dev-UnitTests:
        stage: pruebas 
        script:
          - mvn $MAVEN_CLI_OPTS test
        artifacts:
          when: always
          reports:
            junit: 
              - target/surefire-reports/*Test.xml
              - target/failsafe-reports/*Test.xml
            cobertura: target/site/jacoco/jacoco.xml
        tags:
          - shell 
        except: 
          - test 
          - tags   
      

      单元测试,仅在分支上完成合并时运行 test

      Unit Tests:
        stage: pruebas 
        script:
          - mvn $MAVEN_CLI_OPTS test
        artifacts:
          when: always
          reports:
            junit: 
              - target/surefire-reports/*Test.xml
              - target/failsafe-reports/*Test.xml
            cobertura: target/site/jacoco/jacoco.xml
        tags:
          - shell 
        only: 
          - test
      

      创建标签时没有再次运行任何管道,希望对您有所帮助。

      关键是:

      ...
       except:  
          - tags   
      ...
      

      【讨论】:

        猜你喜欢
        • 2021-05-12
        • 2021-05-05
        • 2021-12-17
        • 2019-08-11
        • 2017-09-24
        • 1970-01-01
        • 2021-03-08
        • 2022-11-13
        • 2019-02-12
        相关资源
        最近更新 更多