接受合并请求而无需运行手动阶段

时间:2020-04-10 12:16:23

标签: gitlab gitlab-ci pipeline

我有一个包含3个阶段的管道:builddeploy-testdeploy-prod。我希望阶段具有以下行为:

  • 始终运行build
  • deploy-test上自动运行master或在其他分支上手动运行
  • 手动运行deploy-prod,仅在master分支上可用

我的管道配置似乎实现了这一点,但是在尝试将分支合并到master时遇到了问题。我不想在进行合并之前在每个分支上执行deploy-test阶段。现在,我必须这样做,因为已通过消息Pipeline blocked. The pipeline for this merge request requires a manual action to proceed禁用了合并按钮。项目中的设置Pipelines must succeed已禁用。

我尝试添加其他规则,以防止deploy-test阶段在合并请求中运行,但它没有任何改变:

rules:
   - if: '$CI_MERGE_REQUEST_ID'
     when: never
   - if: '$CI_COMMIT_BRANCH == "master"'
     when: on_success
   - when: manual

完整的管道配置:

stages:
  - build
  - deploy-test
  - deploy-prod

build:
  stage: build
  script:
    - echo "build"

deploy-test:
  stage: deploy-test
  script:
    - echo "deploy-test"
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: on_success
    - when: manual

deploy-prod:
  stage: deploy-prod
  script:
    - echo "deploy-prod"
  only:
    - master

2 个答案:

答案 0 :(得分:0)

我已使用以下.gitlab-ci.yml打开了分支“ mybranch”到“ master”的合并请求:

image: alpine

stages:
  - build
  - deploy-test
  - deploy-prod

build:
  stage: build
  script:
    - echo "build"

# run deploy-test automatically when on master or manually when on other branches
# Don't run on merge requests

deploy-test:
  stage: deploy-test
  script:
    - echo "deploy-test"
  rules:
    - if: $CI_MERGE_REQUEST_ID
      when: never
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: on_success
    - when: manual


# run deploy-prod manually, only available on master branch

deploy-prod:
  stage: deploy-prod
  script:
    - echo "deploy-prod"
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: manual

注意:

  • only已过时,因此我将其替换为if
  • 我添加了Alpine图片,以使作业运行更快(容器较薄);不会影响逻辑

当我将更改推送到分支“ mybranch”时,GitLab执行了以下操作:

  • 在我的MR上显示了蓝色的“管道成功时合并”按钮
  • 进入“构建”阶段
  • 跳过了“部署生产”阶段(仅在“ master”分支上可用)
  • 给我一个手动的“播放”按钮,以便在“ mybranch”上运行该工作
  • 这时,管道状态为“已阻止”,并且MR显示为“管道已阻止。此合并请求的管道需要手动操作才能继续”
  • 现在,我通过在“管道”屏幕中选择“播放”图标来手动启动“部署测试”阶段
  • 管道状态指示器变为“正在运行”,然后变为“通过”
  • 我的合并请求显示通过的管道,并给我绿色的“合并”按钮

答案 1 :(得分:0)

有许多变量在运行时可用于管道 - Predefined variables reference 有些专门用于与合并请求相关的管道 - Predefined variables for merge request pipelines

您可以利用这些变量中的一个或多个来确定是否要为该合并请求运行部署测试作业。

例如,您可以在合并请求标题中提及短语 "skip_cicd",使用 CI_MERGE_REQUEST_TITLE 变量访问它并创建规则。您的管道看起来有点像这样(请测试规则,我已经对管道进行了编辑,可能是错误的)-

stages:
  - build
  - deploy-test
  - deploy-prod

build:
  stage: build
  script:
    - echo "build"

deploy-test:
  stage: deploy-test
  script:
    - echo "deploy-test"
  rules:
    - if: '$CI_MERGE_REQUEST_TITLE == *"skip_cicd"*'
      when: never
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: on_success
    - when: manual

deploy-prod:
  stage: deploy-prod
  script:
    - echo "deploy-prod"
  only:
    - master