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

4
Jenkinsfile vendored
查看文件

@ -55,9 +55,11 @@ pipeline {
stage('Deploy to Production') { stage('Deploy to Production') {
when { expression { return params.DEPLOY } } when { expression { return params.DEPLOY } }
steps { steps {
lock('prod-deploy') {
withCredentials([sshUserPrivateKey(credentialsId: 'PROD_SSH_KEY', keyFileVariable: 'SSH_KEY')]) { withCredentials([sshUserPrivateKey(credentialsId: 'PROD_SSH_KEY', keyFileVariable: 'SSH_KEY')]) {
script { script {
def imageName = "${ACR_REGISTRY}/${ACR_NAMESPACE}/${params.SERVICE}:${params.IMAGE_TAG}" def imageName = "${ACR_REGISTRY}/${ACR_NAMESPACE}/${params.SERVICE}:${params.IMAGE_TAG}"
retry(3) {
bat """ 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" 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"
""" """
@ -66,6 +68,8 @@ pipeline {
} }
} }
} }
}
}
post { post {
success { echo "✅ ${params.SERVICE}:${params.IMAGE_TAG} 构建部署成功" } success { echo "✅ ${params.SERVICE}:${params.IMAGE_TAG} 构建部署成功" }