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

5
我想向一个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。 问题截图

1
嗨。为什么不把API调用放到“deploy”阶段中呢? - Yasen
我希望 report-deployment 作业成为一个独立的作业(类似模板),可以在其他项目中使用。将 $IMAGE1 和 $IMAGE2 的依赖项合并起来并不是很干净。 - Hamidreza
1个回答

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 列出流水线作业

迭代作业列表,直到找到 report-deployment 作业并保存作业 ID。有了项目 ID 和作业 ID,现在可以触发 Play a Job API 调用。

如果您想摆脱构建产物的创建,可以尝试一下。虽然 API 不允许您将变量传递给作业,但可能有一种方法可以解决。我能想象出 report_successful_deploymentreport_failed_deployment 作业,您可以让脚本决定应该触发哪个作业。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接