GITLAB CI 管道,仅使用 git 标签运行作业

Posted

技术标签:

【中文标题】GITLAB CI 管道,仅使用 git 标签运行作业【英文标题】:GITLAB CI pipeline, run job only with git tag 【发布时间】:2022-01-03 18:28:31 【问题描述】:

需要 GitLab 专家的帮助。我在下面有一个以下管道。 我希望“sync_s3:prod”作业只有在我推送新的 git 标签时才会运行。但是gitlab同时触发了 工作。为什么它的行为是这样的?我只为一项工作创建 $git_commit_tag 规则。有什么想法吗?

stages:
  - sync:nonprod
  - sync:prod

.sync_s3:
  image:
    name: image
    entrypoint: [""]
  script:
    - aws configure set region eu-west-1
    - aws s3 sync $FOLDER_ENV s3://img-$AWS_ENV --delete

sync_s3:prod:
  stage: sync:prod
  rules:
    - if: $CI_COMMIT_TAG
      changes:
        - prod/*
  extends: .sync_s3
  variables:
    AWS_ENV: prod
    FOLDER_ENV: prod/
  tags:
    - gaming_prod

sync_s3:nonprod:
  stage: sync:nonprod
  rules:
    - changes:
        - pp2/*
  extends: .sync_s3
  variables:
    AWS_ENV: nonprod
    FOLDER_ENV: pp2/
  tags:
    - gaming_nonprod

【问题讨论】:

好吧,我误解了你的问题。查看此链接:***.com/questions/42796018/… But gitlab trigger both jobs 什么时候?在标签管道上还是在提交管道上? @KamilCuk 当我执行“git push origin newtag”时,它会触发这两个工作。但正如你所见,我只为一项工作编写了这条规则。 所以你推送了一个标签?您说I expect "sync_s3:prod" job will run only when i will push new git tag,这是真的,您的工作是在标签上运行的,似乎您的要求得到了满足。所以你想在标签上运行other作业? 是的,我不想在标签上运行其他作业。我想要完全执行的操作: - 仅当我更改“pp2”文件夹中的文件时才运行非生产作业。 - 仅当有新的 git 标签时才运行 prod 作业。 【参考方案1】:

正如@slauth 在他的answer 中已经提到的,规则需要在管道的每个步骤中进行调整。我仅将此作为答案发布,作为上述原始答案的补充。 为了防止在存在 git-tag 时运行管道步骤,您需要为相应的作业显式设置规则。

stages:
  - sync:nonprod
  - sync:prod

.sync_s3:
  image:
    name: image
    entrypoint: [""]
  script:
    - aws configure set region eu-west-1
    - aws s3 sync $FOLDER_ENV s3://img-$AWS_ENV --delete

sync_s3:prod:
  stage: sync:prod
  rules:
    - if: $CI_COMMIT_TAG
      changes:
        - prod/*
  extends: .sync_s3
  variables:
    AWS_ENV: prod
    FOLDER_ENV: prod/
  tags:
    - gaming_prod

sync_s3:nonprod:
  stage: sync:nonprod
  rules:
    - changes:
        - pp2/*
    - if: $CI_COMMIT_TAG
      when: never
  extends: .sync_s3
  variables:
    AWS_ENV: nonprod
    FOLDER_ENV: pp2/
  tags:
    - gaming_nonprod

进一步说明:

以下rule 的计算结果类似于逻辑与,因此如果$CI_COMMIT_TAGprod/* 发生变化,则计算结果为true。因此,只有同时满足这两个条件时,才会将其添加到管道中。

rules:
    - if: $CI_COMMIT_TAG
      changes:
        - prod/*

【讨论】:

【参考方案2】:

如果我正确理解了这个问题,您不想在运行 sync_s3:prod 的情况下运行 sync_s3:nonprod 作业。 (?)

要实现这一点,在 sync_s3:nonprod 作业上,您应该能够从 sync_s3:prodwhen: never 复制相同的规则:

stages:
  - sync:nonprod
  - sync:prod

.sync_s3:
  image:
    name: image
    entrypoint: [""]
  script:
    - aws configure set region eu-west-1
    - aws s3 sync $FOLDER_ENV s3://img-$AWS_ENV --delete

sync_s3:prod:
  stage: sync:prod
  rules:
    - if: $CI_COMMIT_TAG
      changes:
        - prod/*
  extends: .sync_s3
  variables:
    AWS_ENV: prod
    FOLDER_ENV: prod/
  tags:
    - gaming_prod

sync_s3:nonprod:
  stage: sync:nonprod
  rules:
    - if: $CI_COMMIT_TAG
      changes:
        - prod/*
      when: never
    - changes:
        - pp2/*
  extends: .sync_s3
  variables:
    AWS_ENV: nonprod
    FOLDER_ENV: pp2/
  tags:
    - gaming_nonprod

【讨论】:

我想要完全执行的操作: - 仅当我更改“pp2”文件夹中的文件时才运行非生产作业。 - 仅当有新的 git 标签时才运行 prod 作业。

以上是关于GITLAB CI 管道,仅使用 git 标签运行作业的主要内容,如果未能解决你的问题,请参考以下文章

问:Gitlab CI 谁重试旧管道

仅当 git 标签不以字符串“Release”或“Test”开头时才在 Gitlab CI 中启动管道

如何让 Gitlab CI 管道始终运行一些作业,而其他作业仅在合并请求上运行?

GitLab 仅手动而不是自动运行管道

如何在 Gitlab 中基于管道变量运行作业?

Gitlab - CI 分支与 HEAD 分支之间的 Git 差异