name: build-and-deploy on: # 仅 main 有提交(含 PR 合并入 main)时触发 push: branches: [main] workflow_dispatch: env: REMOTE_DIR: /home/workspace/sundynix-site jobs: deploy: runs-on: ubuntu-latest steps: - name: 检出代码 run: | git config --global --add safe.directory '*' git clone "http://token:${{ github.token }}@192.168.100.125:3000/${{ github.repository }}.git" . git checkout "${{ github.sha }}" - name: 安装 ssh 工具 run: | if command -v apt-get >/dev/null; then apt-get update && apt-get install -y sshpass openssh-client else apk add --no-cache sshpass openssh-client tar fi - name: 打包源码 run: tar czf /tmp/src.tar.gz --exclude=./.git --exclude=node_modules . - name: 传输源码到部署机 env: SSHPASS: ${{ secrets.DEPLOY_PASSWORD }} run: | H="${{ secrets.DEPLOY_HOST }}" U="${{ secrets.DEPLOY_USER }}" sshpass -e ssh -o StrictHostKeyChecking=no "$U@$H" "mkdir -p $REMOTE_DIR" sshpass -e scp -o StrictHostKeyChecking=no \ /tmp/src.tar.gz docker-compose.yml "$U@$H:$REMOTE_DIR/" - name: 部署机构建并重启 env: SSHPASS: ${{ secrets.DEPLOY_PASSWORD }} run: | H="${{ secrets.DEPLOY_HOST }}" U="${{ secrets.DEPLOY_USER }}" sshpass -e ssh -o StrictHostKeyChecking=no "$U@$H" ' set -e cd /home/workspace/sundynix-site rm -rf build && mkdir build tar xzf src.tar.gz -C build docker build -t sundynix-site:latest build docker compose up -d rm -rf build src.tar.gz docker image prune -f' - name: 健康检查 env: SSHPASS: ${{ secrets.DEPLOY_PASSWORD }} run: | H="${{ secrets.DEPLOY_HOST }}" U="${{ secrets.DEPLOY_USER }}" sshpass -e ssh -o StrictHostKeyChecking=no "$U@$H" ' for i in $(seq 1 20); do curl -sf http://127.0.0.1:8090/api/healthz && exit 0 sleep 3 done echo "健康检查失败"; docker logs --tail 50 sundynix-site; exit 1'