name: build-and-deploy on: push: branches: [dev] workflow_dispatch: env: IMAGE: sundynix-site:latest REMOTE_DIR: /home/workspace/sundynix-site jobs: deploy: runs-on: ubuntu-latest steps: - name: 检出代码 uses: actions/checkout@v4 - name: 构建镜像 run: docker build -t "$IMAGE" . - name: 导出镜像为压缩包 run: docker save "$IMAGE" | gzip > image.tar.gz - name: 安装 ssh 工具 run: | if command -v apt-get >/dev/null; then apt-get update && apt-get install -y sshpass openssh-client elif command -v apk >/dev/null; then apk add --no-cache sshpass openssh-client fi - name: 传输镜像与 compose 到部署机 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 \ image.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" "\ cd $REMOTE_DIR && \ gunzip -c image.tar.gz | docker load && \ rm -f image.tar.gz && \ docker compose up -d && \ 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 15); do \ wget -qO- http://127.0.0.1:8090/api/healthz && exit 0; \ sleep 2; \ done; \ echo '健康检查失败'; docker logs --tail 50 sundynix-site; exit 1"