diff --git a/Jenkinsfile b/Jenkinsfile index 1cfdd2e..3d9209c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,6 +1,12 @@ pipeline { agent any + environment { + DEVELOPMENT_SSH_TARGET = 'deploy@172.31.198.8' + DEVELOPMENT_SSH_KEY = '/var/jenkins_home/.ssh/dev_deploy' + DEVELOPMENT_DEPLOY_DIR = '/opt/firstleg/frontend/client-web' + } + options { timestamps() disableConcurrentBuilds() @@ -9,12 +15,16 @@ pipeline { stages { stage('确认提交版本') { steps { - sh 'echo "Jenkins 已拉取 release/test 分支代码"' + 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 @@ -24,7 +34,39 @@ pipeline { } } + 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 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 @@ -37,7 +79,14 @@ pipeline { post { failure { - sh 'docker compose -f docker-compose.test.yml logs --tail=100 || true' + sh ''' + if [ "${IS_DEVELOPMENT:-false}" = "true" ]; then + ssh -i "$DEVELOPMENT_SSH_KEY" -o BatchMode=yes -o StrictHostKeyChecking=yes \ + "$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 + ''' } } } diff --git a/docker-compose.development.yml b/docker-compose.development.yml new file mode 100644 index 0000000..9418d71 --- /dev/null +++ b/docker-compose.development.yml @@ -0,0 +1,11 @@ +services: + client-web: + image: client-web-development:${IMAGE_TAG:?IMAGE_TAG is required} + container_name: client-web-development + restart: unless-stopped + ports: + - "9002:80" + extra_hosts: + - "host.docker.internal:host-gateway" + environment: + API_UPSTREAM: "http://host.docker.internal:9000"