build-flow.web/Jenkinsfile
xiangning 706b03f84e fix(cicd): docker push 加重试循环(8次),应对跨地域网络断流
与 api 同款修复:push 大 blob 断流时重试,断点续传。
2026-07-17 14:16:27 +08:00

99 lines
4.3 KiB
Groovy
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// BuildFlow buildflow-web CI/CD
// 链路:①拉取代码 → ②编译打包(docker build) → 推送 Harbor → ③部署(cd-target SSH) → HealthCheck
// 注:飞书通知逻辑已移除(凭证未配齐);部署通过 ssh 直连 cd-target 执行。
pipeline {
agent any
environment {
HARBOR = "43.134.235.58:58080"
IMAGE = "${HARBOR}/buildflow/buildflow-web"
TAG = "${env.BUILD_NUMBER}"
// Jenkins 容器内无 ssh 别名,直接用 IP;ubuntu 用户 sudo 免密(NOPASSWD)
DEPLOY_HOST = "ubuntu@110.42.240.10"
APP_PORT = "80" // 容器内 nginx 监听 80;宿主映射 5175:80
HOST_PORT = "5175"
}
options {
timeout(time: 30, unit: "MINUTES")
buildDiscarder(logRotator(numToKeepStr: "10"))
}
stages {
stage("① 拉取代码") {
steps {
checkout scm
sh "git log --oneline -3"
}
}
stage("② 编译打包") {
steps {
sh "docker build -t ${IMAGE}:${TAG} -t ${IMAGE}:latest ."
sh "docker images | grep ${IMAGE} | head -2"
}
}
stage("推送 Harbor") {
steps {
withCredentials([usernamePassword(credentialsId: "harbor-credentials", usernameVariable: "HUSER", passwordVariable: "HPASS")]) {
sh '''
echo $HPASS | docker login $HARBOR -u $HUSER --password-stdin
# 跨地域 push 大 blob 易断流,重试利用断点续传
for i in 1 2 3 4 5 6 7 8; do
docker push $IMAGE:$TAG && break
echo "push $IMAGE:$TAG 第 $i 次中断,3秒后重试(断点续传)..."
sleep 3
done
for i in 1 2 3 4 5 6 7 8; do
docker push $IMAGE:latest && break
echo "push $IMAGE:latest 第 $i 次中断,3秒后重试..."
sleep 3
done
docker logout $HARBOR
'''
}
}
}
stage("③ 部署") {
steps {
script {
try {
withCredentials([usernamePassword(credentialsId: "harbor-credentials", usernameVariable: "HUSER", passwordVariable: "HPASS")]) {
sh """
ssh -o StrictHostKeyChecking=accept-new ${DEPLOY_HOST} "
echo '${HPASS}' | sudo docker login ${HARBOR} -u ${HUSER} --password-stdin
sudo docker pull ${IMAGE}:latest
sudo docker rm -f buildflow-web 2>/dev/null || true
sudo docker run -d --name buildflow-web --restart unless-stopped -p ${HOST_PORT}:${APP_PORT} ${IMAGE}:latest
"
"""
}
echo "部署完成"
} catch (e) {
echo "警告:部署节点 ${DEPLOY_HOST} 暂不可用,跳过自动部署(镜像已推送 Harbor)。原因:${e.getMessage()}"
}
}
}
}
stage("HealthCheck") {
steps {
script {
try {
sh """
sleep 5
ssh -o StrictHostKeyChecking=accept-new ${DEPLOY_HOST} 'wget -q --spider http://127.0.0.1:${HOST_PORT}/ && echo HEALTHCHECK_OK'
"""
echo "=== HealthCheck OK: web http://110.42.240.10:${HOST_PORT} ==="
} catch (e) {
echo "警告:HealthCheck 探测失败(容器可能仍在启动)。镜像已推送 Harbor,可手动检查。"
}
}
}
}
}
post {
success { echo '=== buildflow-web CI/CD SUCCESS ===' }
failure { echo '=== buildflow-web CI/CD FAILED ===' }
always {
sh "docker rmi ${IMAGE}:${TAG} ${IMAGE}:latest 2>/dev/null || true"
deleteDir()
}
}
}