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_ID 和 CI_PIPELINE_ID 环境中获取变量。这允许您通过 API List Pipeline Jobs。
遍历作业列表,直到找到 report-deployment 作业并保存作业 ID。使用项目 ID 和作业 ID,您现在可以触发 Play a Job API 调用。
如果你想摆脱神器创造,你可以玩一下。虽然 API 不允许您将变量传递给作业,但可能有办法绕过它。在我的脑海中,我可以想象 report_successful_deployment 和 report_failed_deployment 作业,您让脚本决定应该触发哪个作业。
【讨论】:
以上是关于Gitlab CI 作业在每次部署后运行以报告状态的主要内容,如果未能解决你的问题,请参考以下文章