update
This commit is contained in:
@@ -1,171 +0,0 @@
|
||||
## WorkFlows —— Build-images.yaml调用示例
|
||||
|
||||
### 示例 1: 根目录 Dockerfile(broccoli-api)
|
||||
|
||||
```yaml
|
||||
# .gitea/workflows/build.yml
|
||||
name: Build Docker Images
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- offline
|
||||
paths:
|
||||
- 'Dockerfile*'
|
||||
- 'requirements.txt'
|
||||
- '.gitea/workflows/build.yml'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-api:
|
||||
uses: your-org/common-workflows/.gitea/workflows/reusable-docker-build.yml@main
|
||||
with:
|
||||
dockerfile: 'Dockerfile.api'
|
||||
context: '.'
|
||||
image_name: 'broccoli-api'
|
||||
image_tag: 'v3.2.1'
|
||||
checkout_ref: 'offline'
|
||||
```
|
||||
|
||||
### 示例 2: 子目录 Dockerfile(broccoli-frontend)
|
||||
|
||||
```yaml
|
||||
# .gitea/workflows/build.yml
|
||||
name: Build Frontend Docker Image
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- 'Frontend/**'
|
||||
- '.gitea/workflows/build.yml'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-frontend:
|
||||
uses: your-org/common-workflows/.gitea/workflows/reusable-docker-build.yml@main
|
||||
with:
|
||||
dockerfile: 'Frontend/Dockerfile'
|
||||
context: 'Frontend/'
|
||||
image_name: 'broccoli-frontend'
|
||||
image_tag: 'v3.2.0'
|
||||
```
|
||||
|
||||
### 示例 3: 带构建参数
|
||||
|
||||
```yaml
|
||||
# .gitea/workflows/build.yml
|
||||
name: Build Docker Image
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
uses: your-org/common-workflows/.gitea/workflows/reusable-docker-build.yml@main
|
||||
with:
|
||||
dockerfile: 'Dockerfile'
|
||||
context: '.'
|
||||
image_name: 'my-app'
|
||||
image_tag: 'v1.0.0'
|
||||
build_args: |
|
||||
NODE_ENV=production
|
||||
APP_VERSION=v1.0.0
|
||||
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||||
```
|
||||
|
||||
### 示例 4: 多镜像构建
|
||||
|
||||
```yaml
|
||||
# .gitea/workflows/build-all.yml
|
||||
name: Build All Docker Images
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-api:
|
||||
uses: your-org/common-workflows/.gitea/workflows/reusable-docker-build.yml@main
|
||||
with:
|
||||
dockerfile: 'Dockerfile.api'
|
||||
context: '.'
|
||||
image_name: 'broccoli-api'
|
||||
image_tag: 'v3.2.1'
|
||||
|
||||
build-frontend:
|
||||
uses: your-org/common-workflows/.gitea/workflows/reusable-docker-build.yml@main
|
||||
with:
|
||||
dockerfile: 'Frontend/Dockerfile'
|
||||
context: 'Frontend/'
|
||||
image_name: 'broccoli-frontend'
|
||||
image_tag: 'v3.2.0'
|
||||
|
||||
build-worker:
|
||||
needs: [build-api] # 可以设置依赖关系
|
||||
uses: your-org/common-workflows/.gitea/workflows/reusable-docker-build.yml@main
|
||||
with:
|
||||
dockerfile: 'services/worker/Dockerfile'
|
||||
context: 'services/worker'
|
||||
image_name: 'broccoli-worker'
|
||||
image_tag: 'v1.0.0'
|
||||
```
|
||||
|
||||
### 示例 5: 禁用缓存
|
||||
|
||||
```yaml
|
||||
# .gitea/workflows/build.yml
|
||||
name: Build Docker Image (No Cache)
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
uses: your-org/common-workflows/.gitea/workflows/reusable-docker-build.yml@main
|
||||
with:
|
||||
dockerfile: 'Dockerfile'
|
||||
context: '.'
|
||||
image_name: 'my-app'
|
||||
image_tag: 'latest'
|
||||
enable_cache: false
|
||||
```
|
||||
|
||||
### 示例 6: 动态版本号
|
||||
|
||||
```yaml
|
||||
# .gitea/workflows/build.yml
|
||||
name: Build Docker Image
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
uses: your-org/common-workflows/.gitea/workflows/reusable-docker-build.yml@main
|
||||
with:
|
||||
dockerfile: 'Dockerfile'
|
||||
context: '.'
|
||||
image_name: 'my-app'
|
||||
image_tag: ${{ github.ref_name }} # 使用 tag 名称作为版本
|
||||
```
|
||||
|
||||
## 核心特性
|
||||
|
||||
✅ **简洁专注** - 只做镜像构建,没有额外复杂功能
|
||||
✅ **灵活路径** - 支持任意 Dockerfile 位置和构建上下文
|
||||
✅ **缓存优化** - 可选的 Docker 层缓存加速构建
|
||||
✅ **参数支持** - 支持传递构建参数
|
||||
✅ **完整验证** - 自动验证镜像构建成功
|
||||
✅ **详细日志** - 清晰的构建过程和结果展示
|
||||
✅ **自动清理** - 构建后自动清理悬空镜像
|
||||
|
||||
这个简化版本更聚焦,更易维护!
|
||||
@@ -114,14 +114,8 @@ jobs:
|
||||
echo "====== 开始构建 Docker 镜像 ======"
|
||||
echo "构建时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
echo "分支: ${{ github.ref_name }}"
|
||||
echo "提交: ${{ github.sha }}"
|
||||
|
||||
if [ -n "${{ github.event.head_commit.message }}" ]; then
|
||||
echo "提交信息: ${{ github.event.head_commit.message }}"
|
||||
echo "提交者: ${{ github.event.head_commit.author.name }}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
echo "====== 构建配置 ======"
|
||||
echo "镜像: ${{ steps.prepare.outputs.full_image }}"
|
||||
echo "Dockerfile: ${{ inputs.dockerfile }}"
|
||||
@@ -168,37 +162,9 @@ jobs:
|
||||
echo ""
|
||||
echo "✓ 镜像验证成功"
|
||||
|
||||
- name: Show image details
|
||||
run: |
|
||||
echo "====== 镜像详细信息 ======"
|
||||
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" | grep "${{ inputs.image_name }}" || true
|
||||
echo ""
|
||||
|
||||
echo "====== 镜像层信息(前10层)======"
|
||||
docker history "${{ steps.prepare.outputs.full_image }}" --format "table {{.CreatedBy}}\t{{.Size}}" | head -11
|
||||
|
||||
- name: Cleanup
|
||||
if: always()
|
||||
run: |
|
||||
echo "====== 清理悬空镜像 ======"
|
||||
docker image prune -f
|
||||
echo "✓ 清理完成"
|
||||
|
||||
- name: Build summary
|
||||
if: always()
|
||||
run: |
|
||||
echo "====== 构建摘要 ======"
|
||||
echo "镜像名称: ${{ steps.prepare.outputs.full_image }}"
|
||||
echo "Dockerfile: ${{ inputs.dockerfile }}"
|
||||
echo "构建上下文: ${{ inputs.context }}"
|
||||
echo "分支: ${{ github.ref_name }}"
|
||||
echo "提交: ${{ github.sha }}"
|
||||
echo "触发方式: ${{ github.event_name }}"
|
||||
echo "构建状态: ${{ job.status }}"
|
||||
echo ""
|
||||
|
||||
if [ "${{ job.status }}" == "success" ]; then
|
||||
echo "🎉 镜像构建成功!"
|
||||
else
|
||||
echo "❌ 镜像构建失败,请检查日志"
|
||||
fi
|
||||
@@ -0,0 +1,109 @@
|
||||
# .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
|
||||
Reference in New Issue
Block a user