如何仅在标记分支上运行gitlab-ci.yml作业?

Car*_*ole 42 gitlab gitlab-ci gitlab-ci-runner

如何仅在标记的Master分支上运行.gitlab-ci.yml作业?

job:
  script:
  - echo "Do something"
  only:
  - master
  - tags
Run Code Online (Sandbox Code Playgroud)

如果存在任何条件,则上述代码将运行:主分支或标记的提交.

我的目标是让这个生产部署运行,但它需要它在Master分支上并且它被标记(带有版本).否则,我将有另一个工作,如果它缺少一个标签将推送到暂存.

Ser*_*llo 11

此行为将在版本12中引入。

未解决的问题最近已更新:

Jason Lenny @jlenny将标题从{-Update .gitlab-ci.yml更改为支持构建条件的连接逻辑-}更改为构建条件的合并逻辑MVC·2天前

Jason Lenny @jlenny更改里程碑至12.0·2天前

(手指交叉)

一种解决方案是使用except关键字排除所有分支,再结合only在标签上运行,这样,您就可以仅在master分支中的标签上运行管道:

  only:
    - tags
  except:
    - branches
Run Code Online (Sandbox Code Playgroud)

我正在使用版本 11.3.4

  • 该示例还将在受保护的分支之后的其他分支上运行。 (6认同)
  • 这如何只在主分支上的标签上运行?我们不能标记任何分支吗? (3认同)

Eri*_*son 8

感谢其他人,例如Matt Alioto,他发表了有关公开发行的文章(该标签被贴上了Product Vision 2019这样的标签,希望他们能在今年淘汰)。

对于Carlson Cole的问题,这将起作用:

job_for_master_no_tags:
  stage: deploy
  script:
  - echo "Release to Staging"
  only:
  - master

job_for_master_tags_only:
  stage: deploy
  script:
  - echo "Release to Production"
  only:
  - tags
  except:
  - /^(?!master).+@/    # Ruby RegEx for anything not starting with 'master'
Run Code Online (Sandbox Code Playgroud)
  • 要查看此RegEx的工作方式,请查看https://rubular.com/r/1en2eblDzRP5Ha
  • 我在GitLab 11.7.0版上对此进行了测试,并且可以正常工作
    • 注意:如果您尝试使用- /^(?!master).+/(不使用@),则此方法无效-了解到了困难的方法

  • 从11.9.4开始,“危险”正则表达式(如否定的反正号(?!))不再起作用。请参见https://docs.gitlab.com/ee/ci/yaml/#supported-onlyexcept-regexp-syntax尽管可以手动启用它们。 (3认同)

Mil*_*tje 8

我有同样的问题。我想在推送或合并时触发部署到我们的临时环境,并且仅在应用标签时将其部署到我们的生产环境。

为此我们需要 2 个变量:$CI_COMMIT_BRANCH$CI_COMMIT_TAG。通过这些变量,我们可以推断管道是否是由提交或标签触发的。不幸的是,第一个变量仅在提交分支时设置,而第二个变量仅在应用标签时设置。所以这不是解决方案......

因此,我选择了下一个最佳设置,仅在按指定约定和手动触发器设置标签时才进行生产发布。这是我的 .gitlab-ci.yml 文件:

stages:
  - deploy:staging
  - deploy:prod

deploy-to-staging:
  stage: deploy:staging
  rules:
    - if: $CI_COMMIT_BRANCH == 'master'
  script:
    - echo "Deploying to Staging..."

deploy-to-production:
  stage: deploy:prod
  rules:
    - if: $CI_COMMIT_TAG =~ /^v(?:\d+.){2}(?:\d+)$/
      when: manual
  script:
    - echo "Deploying to Production..."
Run Code Online (Sandbox Code Playgroud)

如果您确实想自动执行此操作,则必须编写一些脚本来查明应用的标记是否实际上属于主分支上的提交。查看 GitLab 问题跟踪器上的评论以获取更多信息:https://gitlab.com/gitlab-org/gitlab-foss/-/issues/31305#note_28580169


han*_*ach 7

我成功了,这是我的工作代码段,其他所有代码都不适合我

only:
 - tags  # please mention the 's' compared to Sergio Tomasello's solution
except:
 - branches
Run Code Online (Sandbox Code Playgroud)

我用11.4.3

  • 仅标签...此解决方案不检查标签是否仅在指定分支上设置。 (5认同)

Fra*_*nck 7

多年后,仍在尝试在 master 分支上的标签上启动工作......

Gitlab 的问题已关闭:https://gitlab.com/gitlab-org/gitlab-foss/-/issues/27818

不可能在 master 分支上发现标签,因为 Git 不以这种方式工作。分支和标签是单独的引用,每个引用都指向一个提交。因此,标签与分支没有关系。

我的解决方案是检查标签名称以检测它是否代表生产版本:

deploy-prod:
  stage: deploy-manual
  only:
    variables:
      - $CI_COMMIT_TAG =~ /^v\d+.\d+.\d+-?.*$/
  when: manual
Run Code Online (Sandbox Code Playgroud)

正则表达式匹配 semver 标签名称,例如:

  • v1.2.0
  • v2.0.0-beta.1
  • ...


Mat*_*oto 5

gitlab-ci尚不支持此行为,尽管有一个开放的问题要添加。

同时,我也听到了一些传闻,

only:
  - master
only:
  - tags
Run Code Online (Sandbox Code Playgroud)

将完成这项工作(以及传闻不会完成)。

  • 根据https://gitlab.com/gitlab-org/gitlab-ce/issues/27818#note_38463332,第二个仅覆盖第一个。 (3认同)
  • @MattAlioto太糟糕了以至于链接不再存在,请尝试尝试提供简短的示例,以防原始源消失了;) (2认同)

小智 5

文档实际上是这样说的,only并且except尚未开发,用户应该使用它rules
这是一个仅在标签上运行的示例。

deploy-to-prod:
  stage: deploy
  rules:
    - if: $CI_COMMIT_TAG
  environment:
    name: production
  variables:
    API_ENVIRONMENT: prod
  when: manual
Run Code Online (Sandbox Code Playgroud)