# .gitea/workflows/reusable-docker-deploy.yml name: Reusable Docker Compose Deploy on: workflow_call: inputs: compose_file: description: 'Docker Compose 文件路径(相对于仓库根目录)' required: true type: string compose_dir: description: 'Docker Compose 工作目录(相对于仓库根目录,默认为 compose_file 所在目录)' required: false type: string default: '' checkout_ref: description: '要检出的分支或标签' required: false type: string default: '' sparse_checkout: description: '稀疏检出路径列表(每行一个路径)' required: false type: string default: '' enable_sparse_checkout: description: '是否启用稀疏检出' required: false type: boolean default: false startup_wait: description: '服务启动后等待时间(秒)' required: false type: number default: 0 jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: ref: ${{ inputs.checkout_ref || github.ref }} sparse-checkout: ${{ inputs.enable_sparse_checkout && inputs.sparse_checkout || '' }} sparse-checkout-cone-mode: false fetch-depth: ${{ inputs.enable_sparse_checkout && 1 || 0 }} - name: Stop old services run: | echo "====== 停止旧服务 ======" cd "${{ steps.prepare.outputs.compose_dir }}" # 停止并移除容器 docker compose -f "${{ steps.prepare.outputs.compose_file }}" down || true echo "✓ 旧服务已停止" echo "" - name: Deploy services run: | echo "====== 部署服务 ======" cd "${{ steps.prepare.outputs.compose_dir }}" echo "启动服务..." docker compose -f "${{ steps.prepare.outputs.compose_file }}" up -d echo "✓ 服务已启动" echo "" - name: Wait for services if: ${{ inputs.startup_wait > 0 }} run: | echo "====== 等待服务初始化 ======" echo "等待时间: ${{ inputs.startup_wait }} 秒" sleep ${{ inputs.startup_wait }} echo "✓ 等待完成" echo "" - name: Verify services run: | echo "====== 验证服务状态 ======" cd "${{ steps.prepare.outputs.compose_dir }}" docker compose -f "${{ steps.prepare.outputs.compose_file }}" ps echo "" # 检查是否有失败的服务 FAILED_SERVICES=$(docker compose -f "${{ steps.prepare.outputs.compose_file }}" ps --status exited --format json | jq -r '.Service' 2>/dev/null || true) if [ -n "$FAILED_SERVICES" ]; then echo "⚠ 以下服务启动失败:" echo "$FAILED_SERVICES" echo "" echo "查看失败服务的日志:" for service in $FAILED_SERVICES; do echo "" echo "=== $service 日志 ===" docker compose -f "${{ steps.prepare.outputs.compose_file }}" logs --tail=50 "$service" done exit 1 else echo "✓ 所有服务运行正常" fi