如何根据某个分支名称合并到 main 时触发 Gitlab 管道作业

问题描述 投票:0回答:1

我想创建一个部署作业,在从交付分支进行合并时更新产品测试服务器。我们不经常交付,这就是为什么我们有一个开发测试服务器和一个产品测试服务器。产品测试服务器是最新交付的版本,而开发测试服务器是 main 中最新的代码。

交货后,我们会按照

meta-delivery-x.x
meta-delivery-x.x.x
的格式进行分支。更新所有文档后,我们将该分支合并到主分支中。正是在这一点上,我想部署到产品测试服务器。

我尝试了

rules
的各种组合,但似乎无法获得正确的组合。我不希望只有在合并时才为对交付分支所做的每次提交运行该作业。我会放一些我尝试过的例子。

- if: '$CI_COMMIT_REF_NAME == "meta-delivery-x.x" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"'
- if: '$CI_MERGE_REQUEST_STATE == "merged" && $CI_COMMIT_REF_NAME == "meta-delivery-x.x" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"

当任何合并到 main 中时,我已经有一份部署到开发测试服务器的工作。我只是不知道如何让工作仅在合并来自特定分支时运行。这是我用于合并到 main 中的内容:

- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_REF_NAME == "main"'

我将使用正则表达式来处理 x.x.x,但我需要的只是正确的 Gitlab 变量组合。

git gitlab gitlab-ci
1个回答
0
投票

对于已经合并的MR没有明确的解决方案。合并时,

$CI_PIPELINE_SOURCE
$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
等变量不可用。有一些技巧可以解决它:

使用提交消息

如果合并请求创建提交,则合并提交消息的默认模板为:

Merge branch '%{source_branch}' into '%{target_branch}'...

因此,您可以制定以下形式的规则:

  - 'if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "main" && $CI_COMMIT_MESSAGE =~ /^Merge branch.*delivery.* into main/'

使用环境

另一个解决方案是使用环境。首先我们检测MR,然后当它被合并(或关闭)时,它被应用到

deploy
作业中。不幸的是,如果它也关闭,管道将运行。

pre_deploy:
  stage: deploy
  script:
    - echo "Only detect the MR to create the env"
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    on_stop: deploy
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /delivery/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"'

deploy:
  stage: deploy
  script:
    - echo "The logic for deploy"
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    action: stop
  rules:
    - if: $CI_MERGE_REQUEST_ID
© www.soinside.com 2019 - 2024. All rights reserved.