pipeline { agent any environment { DEVELOPMENT_SSH_TARGET = 'deploy@172.31.198.8' DEVELOPMENT_SSH_KEY = '/var/jenkins_home/.ssh/dev_deploy' DEVELOPMENT_SSH_KNOWN_HOSTS = '/var/jenkins_home/.ssh/known_hosts' DEVELOPMENT_DEPLOY_DIR = '/opt/firstleg/frontend/client-web' } 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 { sh ''' set -eu 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 { sh ''' set -eu image="client-web-development:${SOURCE_TAG}" ssh_args="-i ${DEVELOPMENT_SSH_KEY} -o BatchMode=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=${DEVELOPMENT_SSH_KNOWN_HOSTS} -o ConnectTimeout=10" docker build \ --build-arg VITE_ADMIN_WEB_ORIGIN=http://8.163.49.32:9001 \ -t "$image" . docker save "$image" | gzip -1 | ssh $ssh_args "$DEVELOPMENT_SSH_TARGET" 'gzip -dc | docker load' ssh $ssh_args "$DEVELOPMENT_SSH_TARGET" "install -d -m 750 '$DEVELOPMENT_DEPLOY_DIR'" scp $ssh_args docker-compose.development.yml \ "$DEVELOPMENT_SSH_TARGET:$DEVELOPMENT_DEPLOY_DIR/docker-compose.yml.tmp" ssh $ssh_args "$DEVELOPMENT_SSH_TARGET" \ "mv -f '$DEVELOPMENT_DEPLOY_DIR/docker-compose.yml.tmp' '$DEVELOPMENT_DEPLOY_DIR/docker-compose.yml'" ssh $ssh_args "$DEVELOPMENT_SSH_TARGET" sh -s -- "$DEVELOPMENT_DEPLOY_DIR" "$SOURCE_TAG" <<'REMOTE' set -eu cd "$1" export IMAGE_TAG="$2" docker compose -f docker-compose.yml up -d --remove-orphans --pull never docker compose -f docker-compose.yml ps docker compose -f docker-compose.yml exec -T client-web wget -qO- http://127.0.0.1/healthz REMOTE ''' } } 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 client-web wget -qO- http://127.0.0.1/healthz ''' } } } post { failure { sh ''' if [ "${IS_DEVELOPMENT:-false}" = "true" ]; then ssh -i "$DEVELOPMENT_SSH_KEY" -o BatchMode=yes -o StrictHostKeyChecking=yes \ -o UserKnownHostsFile="$DEVELOPMENT_SSH_KNOWN_HOSTS" \ "$DEVELOPMENT_SSH_TARGET" 'docker logs --tail=100 client-web-development || true' || true else docker compose -f docker-compose.test.yml logs --tail=100 || true fi ''' } } }