pipeline { agent { label "${env.JOB_BASE_NAME?.endsWith('-dev') ? 'java-dev' : 'java-test'}" } environment { DEVELOPMENT_COMPOSE_FILE = 'docker-compose.development.yml' REGISTRY_HOST = '172.31.198.7:10082' REGISTRY_CREDENTIALS = 'gitea-registry-token' NODE_BASE_IMAGE = '172.31.198.7:10082/html/node:22-alpine' NGINX_BASE_IMAGE = '172.31.198.7:10082/html/nginx:1.27-alpine' } options { timestamps() disableConcurrentBuilds() } stages { stage('确认提交版本') { steps { script { env.IS_DEVELOPMENT = env.JOB_BASE_NAME?.endsWith('-dev') ? 'true' : 'false' env.SOURCE_TAG = sh(script: 'git rev-parse --short=12 HEAD', returnStdout: true).trim() } sh 'git log -1 --oneline' } } stage('构建并部署测试前端') { when { expression { env.IS_DEVELOPMENT != 'true' } } steps { withCredentials([usernamePassword(credentialsId: env.REGISTRY_CREDENTIALS, usernameVariable: 'REGISTRY_USER', passwordVariable: 'REGISTRY_PASSWORD')]) { sh ''' set -eu export DOCKER_CONFIG="${WORKSPACE}@tmp/docker-auth" rm -rf "$DOCKER_CONFIG" mkdir -p "$DOCKER_CONFIG" cleanup_registry() { docker logout "$REGISTRY_HOST" >/dev/null 2>&1 || true rm -rf "$DOCKER_CONFIG" } trap cleanup_registry EXIT HUP INT TERM printf %s "$REGISTRY_PASSWORD" | docker login -u "$REGISTRY_USER" --password-stdin "$REGISTRY_HOST" docker compose -f docker-compose.test.yml build --pull=false docker compose -f docker-compose.test.yml up -d --remove-orphans ''' } } } stage('构建并部署开发前端') { when { expression { env.IS_DEVELOPMENT == 'true' } } steps { withCredentials([usernamePassword(credentialsId: env.REGISTRY_CREDENTIALS, usernameVariable: 'REGISTRY_USER', passwordVariable: 'REGISTRY_PASSWORD')]) { sh ''' set -eu export DOCKER_CONFIG="${WORKSPACE}@tmp/docker-auth" rm -rf "$DOCKER_CONFIG" mkdir -p "$DOCKER_CONFIG" cleanup_registry() { docker logout "$REGISTRY_HOST" >/dev/null 2>&1 || true rm -rf "$DOCKER_CONFIG" } trap cleanup_registry EXIT HUP INT TERM printf %s "$REGISTRY_PASSWORD" | docker login -u "$REGISTRY_USER" --password-stdin "$REGISTRY_HOST" image="admin-web-development:${SOURCE_TAG}" docker build \ --build-arg NODE_IMAGE="$NODE_BASE_IMAGE" \ --build-arg NGINX_IMAGE="$NGINX_BASE_IMAGE" \ --build-arg VITE_CLIENT_WEB_URL=http://8.163.49.32:9002 \ -t "$image" . export IMAGE_TAG="$SOURCE_TAG" docker compose -f "$DEVELOPMENT_COMPOSE_FILE" up -d --remove-orphans --pull never docker compose -f "$DEVELOPMENT_COMPOSE_FILE" ps docker compose -f "$DEVELOPMENT_COMPOSE_FILE" exec -T admin-web wget -qO- http://127.0.0.1/healthz ''' } } } stage('部署检查') { when { expression { env.IS_DEVELOPMENT != 'true' } } steps { sh ''' set -eu docker compose -f docker-compose.test.yml ps docker compose -f docker-compose.test.yml exec -T admin-web wget -qO- http://127.0.0.1/healthz ''' } } } post { failure { sh ''' if [ "${IS_DEVELOPMENT:-false}" = "true" ]; then docker logs --tail=100 admin-web-development || true else docker compose -f docker-compose.test.yml logs --tail=100 || true fi ''' } } }