Refactor Jenkinsfile to Harbor-based CI/CD with credentials

This commit is contained in:
xiangning 2026-07-02 13:59:06 +08:00
parent 34321072d1
commit 26e48531e0

83
Jenkinsfile vendored
View File

@ -1,18 +1,15 @@
// BuildFlow CICD 流水线
// 结构对齐 rag-frontend,新增质量门禁(内嵌于 docker build)+ 部署后 HealthCheck。
// 链路:Checkout → Build(lint+check+build) → Push(私有 Registry 双 tag) → Deploy(host compose) → HealthCheck(5173)
pipeline {
agent any
environment {
CI_REGISTRY = '192.168.1.154:31010'
REGISTRY_USER = 'docker'
REGISTRY_PASS = credentials('docker-registry-credentials') // Jenkins 凭证;无则用下方硬编码登录
DOCKER_IMAGE = 'docker/buildflow-web'
DOCKER_TAG = "${BUILD_NUMBER}"
DEPLOY_DIR = '/home/xiangning/deploy/buildflow'
APP_PORT = '5173'
HARBOR = '43.134.235.58:58080'
IMAGE = "${HARBOR}/buildflow/buildflow-portal"
TAG = "${env.BUILD_NUMBER}"
}
options {
timeout(time: 30, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '10'))
}
stages {
@ -23,67 +20,41 @@ pipeline {
}
}
stage('Build') {
// docker build 内部执行 pnpm install → lint → check → build
// 任一步失败则本 stage 失败(质量门禁随构建同源,不依赖 agent 的 Node 环境)
stage('Build Image') {
steps {
sh """
docker build -t ${DOCKER_IMAGE}:${DOCKER_TAG} .
docker tag ${DOCKER_IMAGE}:${DOCKER_TAG} ${DOCKER_IMAGE}:latest
docker build -t ${IMAGE}:${TAG} .
docker tag ${IMAGE}:${TAG} ${IMAGE}:latest
"""
}
}
stage('Push') {
stage('Push Harbor') {
steps {
sh """
echo 'dockerxn001624.' | docker login -u docker --password-stdin ${CI_REGISTRY}
docker tag ${DOCKER_IMAGE}:${DOCKER_TAG} ${CI_REGISTRY}/${DOCKER_IMAGE}:${DOCKER_TAG}
docker tag ${DOCKER_IMAGE}:latest ${CI_REGISTRY}/${DOCKER_IMAGE}:latest
docker push ${CI_REGISTRY}/${DOCKER_IMAGE}:${DOCKER_TAG}
docker push ${CI_REGISTRY}/${DOCKER_IMAGE}:latest
"""
withCredentials([usernamePassword(credentialsId: 'harbor-credentials', usernameVariable: 'HARBOR_USER', passwordVariable: 'HARBOR_PASS')]) {
sh """
echo "\$HARBOR_PASS" | docker login -u "\$HARBOR_USER" --password-stdin ${HARBOR}
docker push ${IMAGE}:${TAG}
docker push ${IMAGE}:latest
docker logout ${HARBOR}
"""
}
}
}
stage('Deploy') {
steps {
// 生成 host 网络的生产 compose:容器 5173 直接暴露在宿主,与 rag-frontend(80) 互不冲突
sh """
mkdir -p ${DEPLOY_DIR}
cd ${DEPLOY_DIR}
cat > docker-compose.yml << 'DCOF'
services:
buildflow-web:
image: ${CI_REGISTRY}/${DOCKER_IMAGE}:latest
container_name: buildflow-web
network_mode: host
restart: unless-stopped
DCOF
docker compose pull
docker compose down --remove-orphans || true
docker compose up -d
docker image prune -f
docker compose ps
"""
}
}
stage('HealthCheck') {
steps {
// 等待 Nginx 起来后探测本机 5173
sh """
sleep 3
wget -q --spider http://127.0.0.1:${APP_PORT}/ || exit 1
echo "=== HealthCheck OK: http://192.168.1.154:${APP_PORT} ==="
"""
echo 'Deploy 待 Agent 就绪后启用'
}
}
}
post {
success { echo '=== BuildFlow CI/CD SUCCESS ===' }
failure { echo '=== BuildFlow CI/CD FAILED ===' }
always { deleteDir() }
success { echo '=== build-flow.portal CI/CD SUCCESS ===' }
failure { echo '=== build-flow.portal CI/CD FAILED ===' }
always {
sh "docker rmi ${IMAGE}:${TAG} ${IMAGE}:latest || true"
deleteDir()
}
}
}