fix(ci): 串行化生产部署防止并发 docker pull 竞争

多服务同时构建时 Deploy 阶段并发向同一台生产机 docker pull,
containerd content store 写入共享 layer 产生文件竞争导致 rename 失败。
加 lock('prod-deploy') 确保所有服务按序部署,并加 retry(3) 容忍偶发抖动。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
这个提交包含在:
XuqmGroup 2026-05-21 10:58:08 +08:00
父节点 25e9bef745
当前提交 af922ae420

16
Jenkinsfile vendored
查看文件

@ -55,12 +55,16 @@ pipeline {
stage('Deploy to Production') { stage('Deploy to Production') {
when { expression { return params.DEPLOY } } when { expression { return params.DEPLOY } }
steps { steps {
withCredentials([sshUserPrivateKey(credentialsId: 'PROD_SSH_KEY', keyFileVariable: 'SSH_KEY')]) { lock('prod-deploy') {
script { withCredentials([sshUserPrivateKey(credentialsId: 'PROD_SSH_KEY', keyFileVariable: 'SSH_KEY')]) {
def imageName = "${ACR_REGISTRY}/${ACR_NAMESPACE}/${params.SERVICE}:${params.IMAGE_TAG}" script {
bat """ def imageName = "${ACR_REGISTRY}/${ACR_NAMESPACE}/${params.SERVICE}:${params.IMAGE_TAG}"
ssh -i "%SSH_KEY%" -o StrictHostKeyChecking=no ${PROD_USER}@${PROD_HOST} "docker pull ${imageName} && docker compose -f ${COMPOSE_FILE} up -d --no-deps --force-recreate ${params.SERVICE} && docker image prune -f" retry(3) {
""" bat """
ssh -i "%SSH_KEY%" -o StrictHostKeyChecking=no ${PROD_USER}@${PROD_HOST} "docker pull ${imageName} && docker compose -f ${COMPOSE_FILE} up -d --no-deps --force-recreate ${params.SERVICE} && docker image prune -f"
"""
}
}
} }
} }
} }