Gitlab CI 作业在每次部署后运行以报告状态

Posted

技术标签:

【中文标题】Gitlab CI 作业在每次部署后运行以报告状态【英文标题】:Gitlab CI job to run after each deployment for reporting status 【发布时间】:2020-08-01 19:24:11 【问题描述】:

我想向 REST API 发送有关部署状态的报告。 它应该独立于部署作业(因为 $IMAGE2 依赖项),因为我想在其他项目中使用报告作业。 所以我在 Gitlab CI 中创建了两个工作,如下所示:

deploy:
  stage: deploy
  image: $IMAGE1
  script:
    - cd $CI_PROJECT_DIR && echo 'Failed' > deployment-status
    # some codes to deploy and exit 1 if not successful
    - cd $CI_PROJECT_DIR && echo 'Passed' > deployment-status  #This line run only when deployment is successful
  when: manual
  artifacts:
    when: always
    paths:
      - deployment-status

report-deployment:
  stage: post-deploy
  image: $IMAGE2
  script:
    - cd $CI_PROJECT_DIR && cat deployment-status
    # some codes to report the status of deployment to an API
  when: always
  needs: ["deploy"]

在上述解决方案中,取决于部署,我将deployment-status 填充为Passed/Failed,并在下一个作业中使用deployment-status 工件文件来获取有关部署状态的信息并进行报告。

上面的解决方案有一些问题: - 除非我触发手动作业,否则管道状态将为running。 (因为report-deployment 需要deploy 的工作) - 如果我尝试触发 deploy 作业两次,则只有一份报告被发送到 API。Image of problems

【问题讨论】:

嗨。为什么不把 API 调用放到deploy 阶段呢? 我希望 report-deployment 工作是一个单独的工作(类似模板),可以在其他项目中使用。并且合并 $IMAGE1 和 $IMAGE2 依赖项并不干净。 【参考方案1】:

更新:我刚刚意识到他的旧帖子,但这个解决方案可能仍然对其他人有所帮助。

根据我对管道的理解,一旦作业完成,它不可能再次自动触发。

我们遇到了类似的问题,我们使用gitlab job API 解决了这个问题:

您可以做的是创建一个调用Play a Job 端点的脚本。 这个脚本应该在after_script 中的部署作业中调用,因此只有在部署完成后才会触发。

您还必须将 report-deployment 作业设置为手动执行。

deploy:
  stage: deploy
  image: $IMAGE1
  script:
    - cd $CI_PROJECT_DIR && echo 'Failed' > deployment-status
    # some codes to deploy and exit 1 if not successful
    - cd $CI_PROJECT_DIR && echo 'Passed' > deployment-status
  after_script:
    - <path_to_report_deployment_script>
  when: manual
  artifacts:
    when: always
    paths:
      - deployment-status

report-deployment:
  stage: post-deploy
  image: $IMAGE2
  script:
    - cd $CI_PROJECT_DIR && cat deployment-status
  when: manual # changed to manual
  needs: ["deploy"]

调用 report_deployment 作业的脚本只需要项目 id 和管道 id,您可以从 CI_PROJECT_IDCI_PIPELINE_ID 环境中获取变量。这允许您通过 API List Pipeline Jobs。

遍历作业列表,直到找到 report-deployment 作业并保存作业 ID。使用项目 ID 和作业 ID,您现在可以触发 Play a Job API 调用。

如果你想摆脱神器创造,你可以玩一下。虽然 API 不允许您将变量传递给作业,但可能有办法绕过它。在我的脑海中,我可以想象 report_successful_deploymentreport_failed_deployment 作业,您让脚本决定应该触发哪个作业。

【讨论】:

以上是关于Gitlab CI 作业在每次部署后运行以报告状态的主要内容,如果未能解决你的问题,请参考以下文章

GitLab CI 手动启动作业(部署)

GitLab CI 对 Docker 构建作业的无效参数

如何排除 gitlab-ci.yml 更改触发作业

gitlab-ci.yml、before_script 和 artifact

Gitlab-CI:测试作业失败

如何使用 gitlab-ci 作业推送到 gitlab 存储库?