fix(ci): 部署阶段加 lock(prod-deploy) 和 retry,防止并发 pull 失败
多个 Jenkins job 同时向同一服务器执行 docker pull 时,containerd ingest 目录存在 rename 竞争,会出现 "no such file or directory" 错误。通过全局锁 prod-deploy 序列化所有部署操作(与 Server Jenkinsfile 共享同一锁名),并加 retry(2) 兜底。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
这个提交包含在:
父节点
58f7fb4a44
当前提交
50eb60b895
16
Jenkinsfile
vendored
16
Jenkinsfile
vendored
@ -83,12 +83,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 fullImage = "${env.ACR_REGISTRY}/${env.ACR_NAMESPACE}/${env.IMAGE_NAME}:${params.IMAGE_TAG}"
|
script {
|
||||||
bat """
|
def fullImage = "${env.ACR_REGISTRY}/${env.ACR_NAMESPACE}/${env.IMAGE_NAME}:${params.IMAGE_TAG}"
|
||||||
ssh -i "%SSH_KEY%" -o StrictHostKeyChecking=no ${env.PROD_USER}@${env.PROD_HOST} "docker rm -f xuqm-${env.DEPLOY_SERVICE} 2>/dev/null || true; docker pull ${fullImage} || exit 1; docker compose -f ${env.COMPOSE_FILE} up -d --no-deps --force-recreate ${env.DEPLOY_SERVICE} || exit 1; docker image prune -f"
|
retry(2) {
|
||||||
"""
|
bat """
|
||||||
|
ssh -i "%SSH_KEY%" -o StrictHostKeyChecking=no ${env.PROD_USER}@${env.PROD_HOST} "docker image prune -f 2>/dev/null || true; docker pull ${fullImage} || exit 1; docker compose -f ${env.COMPOSE_FILE} up -d --no-deps --force-recreate ${env.DEPLOY_SERVICE} || exit 1; docker image prune -f"
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
正在加载...
在新工单中引用
屏蔽一个用户