Skip to content

Commit f21dab7

Browse files
committed
feat: 添加GitHub Actions工作流以自动构建和部署Docker镜像
1 parent a5dda8a commit f21dab7

File tree

2 files changed

+221
-0
lines changed

2 files changed

+221
-0
lines changed

.github/README.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# GitHub Actions 自动构建部署说明
2+
3+
## 🚀 功能介绍
4+
5+
这个 GitHub Actions 工作流会在你推送 tag(以 `v` 开头)时自动构建和推送 Docker 镜像到 GitHub Container Registry。
6+
7+
## 📋 工作流特性
8+
9+
- ✅ 只在推送 tag 时触发(如:`v1.0.0``v2.1.0`
10+
- ✅ 自动构建前端和后端 Docker 镜像
11+
- ✅ 支持多架构构建(linux/amd64、linux/arm64)
12+
- ✅ 使用 GitHub Container Registry 存储镜像
13+
- ✅ 支持 Docker 缓存优化构建速度
14+
- ✅ 自动生成语义化版本标签
15+
- ✅ 构建完成后生成部署摘要
16+
17+
## 🔧 如何使用
18+
19+
### 1. 推送代码并创建 tag
20+
21+
```bash
22+
# 提交你的代码
23+
git add .
24+
git commit -m "feat: 添加新功能"
25+
git push origin main
26+
27+
# 创建并推送 tag
28+
git tag v1.0.0
29+
git push origin v1.0.0
30+
```
31+
32+
### 2. 查看构建状态
33+
34+
推送 tag 后,访问你的 GitHub 仓库的 "Actions" 标签页,可以看到自动触发的构建任务。
35+
36+
### 3. 使用构建的镜像
37+
38+
构建完成后,你可以使用以下命令拉取镜像:
39+
40+
```bash
41+
# 拉取后端镜像
42+
docker pull ghcr.io/你的用户名/chat-bi-api:v1.0.0
43+
44+
# 拉取前端镜像
45+
docker pull ghcr.io/你的用户名/chat-bi-frontend:v1.0.0
46+
```
47+
48+
## 🏷️ 标签说明
49+
50+
工作流会自动为每个镜像生成以下标签:
51+
52+
- `v1.0.0` - 具体版本号
53+
- `v1.0` - 主版本号.次版本号
54+
- `latest` - 最新版本
55+
56+
## 🔐 权限说明
57+
58+
这个工作流使用 `GITHUB_TOKEN` 自动认证,无需额外配置。GitHub 会自动为 Actions 提供必要的权限来推送到 GitHub Container Registry。
59+
60+
## 📦 镜像存储位置
61+
62+
- 后端镜像:`ghcr.io/你的用户名/chat-bi-api`
63+
- 前端镜像:`ghcr.io/你的用户名/chat-bi-frontend`
64+
65+
## 🔄 可选配置
66+
67+
### 同时推送到 Docker Hub
68+
69+
如果你想同时推送到 Docker Hub,可以:
70+
71+
1. 在仓库的 Settings → Secrets and variables → Actions 中添加:
72+
- `DOCKERHUB_USERNAME`: 你的 Docker Hub 用户名
73+
- `DOCKERHUB_TOKEN`: 你的 Docker Hub 访问令牌
74+
75+
2. 取消工作流文件中 Docker Hub 登录步骤的注释
76+
77+
### 修改镜像名称
78+
79+
在工作流文件的 `env` 部分修改:
80+
81+
```yaml
82+
env:
83+
REGISTRY: ghcr.io
84+
BACKEND_IMAGE_NAME: 你的后端镜像名
85+
FRONTEND_IMAGE_NAME: 你的前端镜像名
86+
```
87+
88+
## 🛠️ 故障排除
89+
90+
### 构建失败常见原因
91+
92+
1. **Docker 文件路径错误**: 确保 Dockerfile 路径正确
93+
2. **依赖安装失败**: 检查 package.json 或 requirements.txt
94+
3. **权限问题**: 确保仓库有访问 GitHub Container Registry 的权限
95+
96+
### 查看构建日志
97+
98+
在 GitHub 仓库的 Actions 页面点击具体的构建任务,可以查看详细的构建日志。
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
name: Build and Deploy Docker Images
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*' # 只在推送以 'v' 开头的 tag 时触发
7+
8+
env:
9+
# 使用 GitHub Container Registry
10+
REGISTRY: ghcr.io
11+
BACKEND_IMAGE_NAME: chat-bi-api
12+
FRONTEND_IMAGE_NAME: chat-bi-frontend
13+
14+
jobs:
15+
build-and-push:
16+
runs-on: ubuntu-latest
17+
permissions:
18+
contents: read
19+
packages: write
20+
21+
steps:
22+
- name: Checkout repository
23+
uses: actions/checkout@v4
24+
25+
- name: Set up Docker Buildx
26+
uses: docker/setup-buildx-action@v3
27+
28+
- name: Log in to GitHub Container Registry
29+
uses: docker/login-action@v3
30+
with:
31+
registry: ${{ env.REGISTRY }}
32+
username: ${{ github.actor }}
33+
password: ${{ secrets.GITHUB_TOKEN }}
34+
35+
# 可选:如果你想同时推送到 Docker Hub,取消注释以下步骤
36+
# - name: Log in to Docker Hub
37+
# uses: docker/login-action@v3
38+
# with:
39+
# username: ${{ secrets.DOCKERHUB_USERNAME }}
40+
# password: ${{ secrets.DOCKERHUB_TOKEN }}
41+
42+
- name: Extract tag version
43+
id: version
44+
run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
45+
46+
- name: Extract backend metadata
47+
id: backend-meta
48+
uses: docker/metadata-action@v5
49+
with:
50+
images: |
51+
${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.BACKEND_IMAGE_NAME }}
52+
tags: |
53+
type=ref,event=tag
54+
type=raw,value=latest
55+
type=semver,pattern={{version}}
56+
type=semver,pattern={{major}}.{{minor}}
57+
58+
- name: Extract frontend metadata
59+
id: frontend-meta
60+
uses: docker/metadata-action@v5
61+
with:
62+
images: |
63+
${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.FRONTEND_IMAGE_NAME }}
64+
tags: |
65+
type=ref,event=tag
66+
type=raw,value=latest
67+
type=semver,pattern={{version}}
68+
type=semver,pattern={{major}}.{{minor}}
69+
70+
- name: Build and push backend Docker image
71+
uses: docker/build-push-action@v5
72+
with:
73+
context: .
74+
file: ./deploy/Dockerfile
75+
platforms: linux/amd64,linux/arm64
76+
push: true
77+
tags: ${{ steps.backend-meta.outputs.tags }}
78+
labels: ${{ steps.backend-meta.outputs.labels }}
79+
build-args: |
80+
USE_CHINA_MIRROR=false
81+
cache-from: type=gha
82+
cache-to: type=gha,mode=max
83+
84+
- name: Build and push frontend Docker image
85+
uses: docker/build-push-action@v5
86+
with:
87+
context: ./web
88+
file: ./web/deploy/Dockerfile
89+
platforms: linux/amd64,linux/arm64
90+
push: true
91+
tags: ${{ steps.frontend-meta.outputs.tags }}
92+
labels: ${{ steps.frontend-meta.outputs.labels }}
93+
cache-from: type=gha
94+
cache-to: type=gha,mode=max
95+
96+
- name: Generate deployment summary
97+
run: |
98+
echo "## 🚀 部署成功!" >> $GITHUB_STEP_SUMMARY
99+
echo "" >> $GITHUB_STEP_SUMMARY
100+
echo "### 📦 镜像信息" >> $GITHUB_STEP_SUMMARY
101+
echo "" >> $GITHUB_STEP_SUMMARY
102+
echo "**Tag版本:** \`${{ steps.version.outputs.VERSION }}\`" >> $GITHUB_STEP_SUMMARY
103+
echo "" >> $GITHUB_STEP_SUMMARY
104+
echo "**后端镜像:**" >> $GITHUB_STEP_SUMMARY
105+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
106+
echo "${{ steps.backend-meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
107+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
108+
echo "" >> $GITHUB_STEP_SUMMARY
109+
echo "**前端镜像:**" >> $GITHUB_STEP_SUMMARY
110+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
111+
echo "${{ steps.frontend-meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
112+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
113+
echo "" >> $GITHUB_STEP_SUMMARY
114+
echo "### 📋 使用方法" >> $GITHUB_STEP_SUMMARY
115+
echo "" >> $GITHUB_STEP_SUMMARY
116+
echo "拉取镜像:" >> $GITHUB_STEP_SUMMARY
117+
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
118+
echo "# 后端" >> $GITHUB_STEP_SUMMARY
119+
echo "docker pull ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.BACKEND_IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}" >> $GITHUB_STEP_SUMMARY
120+
echo "" >> $GITHUB_STEP_SUMMARY
121+
echo "# 前端" >> $GITHUB_STEP_SUMMARY
122+
echo "docker pull ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.FRONTEND_IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}" >> $GITHUB_STEP_SUMMARY
123+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY

0 commit comments

Comments
 (0)