Files
tianai-captcha-enhanced/.gitea/workflows/deploy-test.yml
T

113 lines
4.5 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =============================================================================
# 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, 带依赖缓存卷)
# 注意: job 容器内的路径对宿主机 daemon 不可见, 不能用 -v "$PWD" 挂载;
# 用 docker cp 流式传文件(与 build context 同机制)
run: |
set -e
docker volume create tianai-maven-cache >/dev/null 2>&1 || true
docker rm -f mvnbuild 2>/dev/null || true
docker run -d --name mvnbuild -v tianai-maven-cache:/root/.m2 -w /ws \
maven:3.9-eclipse-temurin-21 sleep infinity
docker cp "$GITHUB_WORKSPACE/." mvnbuild:/ws/
docker exec mvnbuild mvn -q package -DskipTests
docker cp mvnbuild:/ws/tianai-captcha-platform/target/tianai-captcha-platform-2.0.0-SNAPSHOT.jar \
"$GITHUB_WORKSPACE/tianai-captcha-platform/tianai-captcha-platform-2.0.0-SNAPSHOT.jar"
docker rm -f mvnbuild
ls -la tianai-captcha-platform/*.jar
- name: Build & push image
run: |
set -e
SHA=$(echo "$GITHUB_SHA" | cut -c1-8)
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, 校验 JSON code 而非 HTTP 状态)
env:
TEST_SITE_KEY: 6a062b70-c0b3-428e-8f1b-cca402e67ddd
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 -X POST 'http://127.0.0.1:18200/api/challenge/generate' -H 'X-Site-Key: $TEST_SITE_KEY'" | python3 -c "import json,sys; print(json.load(sys.stdin).get('code'))" 2>/dev/null || 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 (code=$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"