# ============================================================================= # TIANAI CAPTCHA PLATFORM — 测试环境自动部署 # 触发:push 到 master(或手动 workflow_dispatch) # 流程:checkout → Maven 容器构建 jar → docker build → 推 Registry(:test + :sha-x) # → SSH 到测试机(156.233.226.86) 重建容器 → 健康检查 # 架构参考:perler-lab deploy-test.yml # ============================================================================= name: deploy-test on: push: branches: [master] workflow_dispatch: concurrency: group: deploy-test-master cancel-in-progress: false env: REGISTRY: 156.233.226.46:5000 IMAGE: 156.233.226.46:5000/tianai-captcha-platform jobs: build-and-deploy-test: runs-on: ubuntu-latest steps: - name: Checkout master uses: actions/checkout@v4 with: ref: master - name: Setup SSH key (from secrets) run: | mkdir -p ~/.ssh printf '%s\n' "${{ secrets.CAPTCHA_DEPLOY_KEY }}" > ~/.ssh/id_ed25519_deploy chmod 600 ~/.ssh/id_ed25519_deploy ssh-keyscan -H ${{ secrets.CAPTCHA_TEST_HOST }} >> ~/.ssh/known_hosts 2>/dev/null ssh-keyscan -H ${{ secrets.CAPTCHA_PROD_HOST }} >> ~/.ssh/known_hosts 2>/dev/null echo "SSH 密钥就绪" - name: Build jar (Maven + JDK21 in docker, 带依赖缓存卷) run: | set -e docker volume create tianai-maven-cache >/dev/null 2>&1 || true docker run --rm -v "$PWD":/ws -v tianai-maven-cache:/root/.m2 -w /ws \ maven:3.9-eclipse-temurin-21 mvn -q package -DskipTests ls -la tianai-captcha-platform/target/*.jar - name: Build & push image run: | set -e SHA=$(echo "$GITHUB_SHA" | cut -c1-8) # Dockerfile 约定 jar 在构建上下文根目录 cp tianai-captcha-platform/target/tianai-captcha-platform-*.jar \ tianai-captcha-platform/tianai-captcha-platform-2.0.0-SNAPSHOT.jar docker build -t $IMAGE:test -t $IMAGE:sha-$SHA tianai-captcha-platform docker push $IMAGE:test docker push $IMAGE:sha-$SHA echo "已推送 $IMAGE:test 和 $IMAGE:sha-$SHA" - name: Deploy to test env run: | set -e SSH_CMD="ssh -i $HOME/.ssh/id_ed25519_deploy root@${{ secrets.CAPTCHA_TEST_HOST }}" $SSH_CMD ' set -e echo "===== 拉取镜像 =====" docker pull 156.233.226.46:5000/tianai-captcha-platform:test echo "===== 重建容器 =====" docker rm -f tianai-captcha 2>/dev/null || true docker run -d --name tianai-captcha \ --network mw \ --restart unless-stopped \ -p 127.0.0.1:18200:18200 \ -v /opt/tianai/config:/app/config \ 156.233.226.46:5000/tianai-captcha-platform:test sleep 15 docker ps --filter name=tianai-captcha --format "{{.Names}} {{.Status}}" docker logs tianai-captcha 2>&1 | tail -3 ' - name: Health check (generate API) run: | set -e SSH_CMD="ssh -i $HOME/.ssh/id_ed25519_deploy root@${{ secrets.CAPTCHA_TEST_HOST }}" OK=0 CODE=000 for i in $(seq 1 24); do CODE=$($SSH_CMD 'curl -s -o /dev/null -w "%{http_code}" -X POST "http://127.0.0.1:18200/api/challenge/generate" -H "X-Site-Key: 6a062b70-c0b3-428e-8f1b-cca402e67ddb"' || echo 000) if [ "$CODE" = "200" ]; then OK=1; break; fi sleep 5 done if [ "$OK" != "1" ]; then echo "健康检查失败 (code=$CODE)" $SSH_CMD 'docker logs tianai-captcha --tail 30' || true exit 1 fi echo "测试环境健康检查 OK (HTTP $CODE)" - name: Deployment summary if: always() run: | echo "commit: $GITHUB_SHA" echo "test 访问: test 机 127.0.0.1:18200 (mw 网络: tianai-captcha:18200)" echo "晋升生产: Gitea → 仓库 → Actions → promote-prod → 输入 yes"