|
@@ -48,6 +48,7 @@ def pushOneHarborImage(def script, Map svc, String reg, String proj, String late
|
|
|
def imageLatest = "${reg}/${proj}/${svc.repo}:${latestTag}"
|
|
def imageLatest = "${reg}/${proj}/${svc.repo}:${latestTag}"
|
|
|
def imageBuild = "${reg}/${proj}/${svc.repo}:${buildTag}"
|
|
def imageBuild = "${reg}/${proj}/${svc.repo}:${buildTag}"
|
|
|
def withLibFlag = svc.withLib ? 'true' : 'false'
|
|
def withLibFlag = svc.withLib ? 'true' : 'false'
|
|
|
|
|
+ // Parallel branches share one Docker daemon; serialize docker ops to avoid containerd CreateDiff/lease races.
|
|
|
script.sh """
|
|
script.sh """
|
|
|
set -e
|
|
set -e
|
|
|
test -f ${workspace}/${svc.module}/target/${jarName}
|
|
test -f ${workspace}/${svc.module}/target/${jarName}
|
|
@@ -59,23 +60,38 @@ def pushOneHarborImage(def script, Map svc, String reg, String proj, String late
|
|
|
else
|
|
else
|
|
|
touch .jenkins_docker_ctx/lib/.keep
|
|
touch .jenkins_docker_ctx/lib/.keep
|
|
|
fi
|
|
fi
|
|
|
- cd .jenkins_docker_ctx
|
|
|
|
|
- if docker pull ${imageLatest} 2>/dev/null; then
|
|
|
|
|
- echo ">>> archive previous ${latestTag} -> ${buildTag}"
|
|
|
|
|
- docker tag ${imageLatest} ${imageBuild}
|
|
|
|
|
- docker push ${imageBuild}
|
|
|
|
|
- docker rmi ${imageBuild} ${imageLatest} 2>/dev/null || true
|
|
|
|
|
- fi
|
|
|
|
|
- docker build -f ${workspace}/${dockerfile} \\
|
|
|
|
|
- --build-arg BASE_IMAGE=${baseImage} \\
|
|
|
|
|
- --build-arg JAR_FILE=${jarName} \\
|
|
|
|
|
- --build-arg SERVER_PORT=${svc.port} \\
|
|
|
|
|
- --build-arg WITH_LIB=${svc.withLib} \\
|
|
|
|
|
- -t ${imageLatest} .
|
|
|
|
|
- docker push ${imageLatest}
|
|
|
|
|
- echo ">>> pushed ${imageLatest} (archived prior latest as ${buildTag} if any)"
|
|
|
|
|
- docker rmi ${imageLatest} 2>/dev/null || true
|
|
|
|
|
- docker image prune -f 2>/dev/null || true
|
|
|
|
|
|
|
+ DOCKER_LOCK=/tmp/jenkins-alien-cloud-docker.lock
|
|
|
|
|
+ flock "\${DOCKER_LOCK}" sh -c '
|
|
|
|
|
+ set -e
|
|
|
|
|
+ cd ${workspace}/${svc.module}/.jenkins_docker_ctx
|
|
|
|
|
+ if docker pull ${imageLatest} 2>/dev/null; then
|
|
|
|
|
+ echo ">>> archive previous ${latestTag} -> ${buildTag}"
|
|
|
|
|
+ docker tag ${imageLatest} ${imageBuild}
|
|
|
|
|
+ docker push ${imageBuild}
|
|
|
|
|
+ docker rmi ${imageBuild} ${imageLatest} 2>/dev/null || true
|
|
|
|
|
+ fi
|
|
|
|
|
+ build_ok=0
|
|
|
|
|
+ for attempt in 1 2 3; do
|
|
|
|
|
+ if docker build -f ${workspace}/${dockerfile} \\
|
|
|
|
|
+ --build-arg BASE_IMAGE=${baseImage} \\
|
|
|
|
|
+ --build-arg JAR_FILE=${jarName} \\
|
|
|
|
|
+ --build-arg SERVER_PORT=${svc.port} \\
|
|
|
|
|
+ --build-arg WITH_LIB=${svc.withLib} \\
|
|
|
|
|
+ -t ${imageLatest} .; then
|
|
|
|
|
+ build_ok=1
|
|
|
|
|
+ break
|
|
|
|
|
+ fi
|
|
|
|
|
+ echo ">>> WARN: docker build ${svc.repo} attempt \${attempt} failed, retrying..."
|
|
|
|
|
+ sleep "\$((attempt * 5))"
|
|
|
|
|
+ done
|
|
|
|
|
+ if [ "\${build_ok}" -ne 1 ]; then
|
|
|
|
|
+ echo ">>> ERROR: docker build ${svc.repo} failed after 3 attempts"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ fi
|
|
|
|
|
+ docker push ${imageLatest}
|
|
|
|
|
+ echo ">>> pushed ${imageLatest} (archived prior latest as ${buildTag} if any)"
|
|
|
|
|
+ docker rmi ${imageLatest} 2>/dev/null || true
|
|
|
|
|
+ '
|
|
|
cd ${workspace}/${svc.module}
|
|
cd ${workspace}/${svc.module}
|
|
|
rm -rf .jenkins_docker_ctx
|
|
rm -rf .jenkins_docker_ctx
|
|
|
"""
|
|
"""
|
|
@@ -212,7 +228,7 @@ pipeline {
|
|
|
booleanParam(
|
|
booleanParam(
|
|
|
name: 'HARBOR_PUSH_PARALLEL',
|
|
name: 'HARBOR_PUSH_PARALLEL',
|
|
|
defaultValue: true,
|
|
defaultValue: true,
|
|
|
- description: 'Parallel docker build/push per service (faster; needs enough CPU/disk on agent)'
|
|
|
|
|
|
|
+ description: 'Parallel per service (context prep); docker build/push serialized via flock on agent'
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|