我有一个 Jenkins 多分支管道,它将分支的状态存储在共享 S3 Groovy 对象中。 Groovy 文件看起来像这样:
[["name":"def-123","current_status":"success"],"name":"abc-234","current_status":"success"]]
这里name字段表示我们的功能git分支,status是分支的状态,如果成功则表示功能分支已部署,如果删除则表示功能分支环境被破坏(分支还在)。
Pipeline 主要在部署和销毁(测试成功后)阶段更新此文件。
如果两个 Jenkins 分支同时更新上述文件,我们将面临问题。
例如:两个作业同时读取上述文件,但一个在部署阶段读取,一个在销毁阶段读取。 销毁作业会将其分支更新为已删除,但如果在销毁作业一段时间后更新它,它会被其他分支部署作业再次覆盖以成功。
如何防止这种情况,我知道现在有 S3 条件写入,但不知道如何使用它。
在 Jenkins 中进行互斥的一种方法是使用 lockable-resources 插件。从他们的文档页面:
echo 'Starting'
lock('my-resource-name') {
echo 'Do something here that requires unique access to the resource'
// any other build will wait until the one locking the resource leaves this block
}
echo 'Finish'