common-workflows/.gitea/workflows/deploy-docker.yaml
2025-12-19 05:31:18 +00:00

110 lines
3.4 KiB
YAML

# .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