Refactor Jenkinsfile to Harbor-based CI/CD with credentials
This commit is contained in:
parent
34321072d1
commit
26e48531e0
83
Jenkinsfile
vendored
83
Jenkinsfile
vendored
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user