修改cicd为gitea action,简化操作

This commit is contained in:
编码猿
2025-10-07 00:59:16 +08:00
parent 7fb0f60ec0
commit cb8f7a4682
12 changed files with 235 additions and 128 deletions

View File

@@ -13,16 +13,16 @@
![架构图](./doc/jgt.png) ![架构图](./doc/jgt.png)
## CI/CD 自动化集群部署 ## CI/CD 自动化集群部署
![cicd](./doc/cicd.png) ![cicd](./doc/newci.png)
## 开发日记 ## 开发日记
- [x] 基于DDD理念改造 - [x] 基于DDD理念改造
- [x] 拆分领域模块为联邦模块,实现微前端 - [x] 拆分领域模块为联邦模块,实现微前端
- [x] 基于 Vue3+OOP+JSX 改造项目代码 - [x] 基于 Vue3+OOP+JSX 改造项目代码
- [ ] 开发Nacos的config-service实现代理访问Nacos服务
- [x] 基于 Nacos 开发 nacos-federation 插件,实现各模块的服务注册&发现,统一管理远程地址 - [x] 基于 Nacos 开发 nacos-federation 插件,实现各模块的服务注册&发现,统一管理远程地址
- [x] 修改 nacos-federation 插件实现其成为vite的插件进一步简化代码 - [x] 修改 nacos-federation 插件实现其成为vite的插件进一步简化代码
- [x] 修改 nacos-federation 插件,实现 接口请求基地址从 配置中心获取,并注入到环境变量中 - [x] 修改 nacos-federation 插件,实现 接口请求基地址从 配置中心获取,并注入到环境变量中
@@ -32,7 +32,7 @@
- [x] 将vite.config.ts中的base 改到插件 nacos-federation中实现简化代码 - [x] 将vite.config.ts中的base 改到插件 nacos-federation中实现简化代码
- [x] 增加控制台日志,方便访问各种服务 - [x] 增加控制台日志,方便访问各种服务
- [x] pnpm 统一管理集中项目依赖,运行&构建等 - [x] pnpm 统一管理集中项目依赖,运行&构建等
- [ ] 领域模块实现 docker 自动化构建部署上线 - [x] 领域模块实现 docker 自动化构建部署上线
- [ ] Deno集成GraphQL - [ ] Deno集成GraphQL
- [ ] .... - [ ] ....
- [ ] 爬快手api实现一个完整项目测试脚手架不足 - [ ] 爬快手api实现一个完整项目测试脚手架不足
@@ -254,4 +254,4 @@ export default class Header extends TSX<Props>()(Vue) implements Props {
**前端工作:** **前端工作:**
详细请看 **front-end/xxx/README.md** 内的帮助文档!!! 详细请看 [app-product的README.md](./front-end/app-product/README.md) 内的帮助文档!!!

Binary file not shown.

Before

Width:  |  Height:  |  Size: 779 KiB

BIN
doc/newci.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 734 KiB

20
doc/临时命令.md Normal file
View File

@@ -0,0 +1,20 @@
# 包含 [skip actions] 的提交会跳过工作流
git commit -m "修复样式问题 [skip actions]"
```bash
# 运行自动化集群部署脚本
./docker/deploy-swarm.sh
# --- 其他命令 ---
# 删除之前的部署(可选)
docker stack rm app-product
# 查看 app-product 集群运行情况
docker stack ps app-product
# 持续观察服务副本数是否达到预期
watch docker stack services app-product
```

View File

@@ -0,0 +1,75 @@
name: build and push
# 当代码推送到 main 分支时触发
on:
push:
branches: [ main ]
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: 拉取最新代码
uses: actions/checkout@v4
- name: 设置 Docker Buildx
uses: docker/setup-buildx-action@v3
- name: 登录到自己的 Docker 仓库
uses: docker/login-action@v3
with:
registry: registry.bmycode.help
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: 构建并推送镜像
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
registry.bmycode.help/app-product:latest
registry.bmycode.help/app-product:${{ github.sha }}
- name: 替换镜像标签为 github.sha
run: |
sed -i "s|{{IMAGE_TAG}}|${{ github.sha }}|g" app-product.yml
- name: 上传 app-product.yml 到前端集群管理机
uses: appleboy/scp-action@v1
with:
host: ${{ vars.SSH_MANAGE }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
source: "app-product.yml"
target: "/home/bmy/"
- name: 登录前端集群,拉镜像
uses: appleboy/ssh-action@v1
with:
# 统一登录三台前端集群的linux统一拉取刚推到仓库的最新镜像
# 解决 Swarm 无法控制 工作机拉取镜像的问题!
host: ${{ vars.SSH_HOST_LIST }}
sync: true
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
# 拉取刚打包的最新镜像
docker pull registry.bmycode.help/app-product:${{ github.sha }}
- name: 管理节点部署到 Swarm
uses: appleboy/ssh-action@v1
with:
host: ${{ vars.SSH_MANAGE }}
sync: true
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
# 切换到管理员,要不然没权限在服务器执行 docker 命令,部署到 Swarm 集群
sudo docker stack deploy -c /home/bmy/app-product.yml app-product

View File

@@ -14,6 +14,7 @@ RUN npx vite build --base=/app-product/
FROM nginx:alpine FROM nginx:alpine
# 构建产物放到 /usr/share/nginx/html/app-product # 构建产物放到 /usr/share/nginx/html/app-product
# nginx.conf 也需要修改
COPY --from=builder /app/dist /usr/share/nginx/html/app-product COPY --from=builder /app/dist /usr/share/nginx/html/app-product
# 覆盖 Nginx 配置,支持 SPA 子路径 # 覆盖 Nginx 配置,支持 SPA 子路径
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf COPY docker/nginx.conf /etc/nginx/conf.d/default.conf

View File

@@ -10,7 +10,9 @@
## 运行 ## 运行
下面文档分为**开发**和**上线**两部分进行说明! 下面文档分为**开发**和**上线**两部分进行说明!**默认前端已经在电脑上安装过 Docker 环境!!**
> 想要【开发阶段运行】,必须 先参考下面 【上线】-【任务1】配置好两个前端自己的环境变量文件很简单
### 开发 ### 开发
@@ -30,34 +32,125 @@ npm run dep
### 上线 ### 上线
**docker/ 文件夹说明** 代码 到 仓库的 **main 分支** 后会触发 全程自动化实现自动打包前端代码构建镜像自动部署到公司内网的Linux服务器集群中
- `app-product.yml` - Dcoker Swarm 集群部署配置 提交到其他分支不触发自动化操作!具体什么规则,以 技术负责人 说的为准!请遵守规则!
- `deploy-swarm.sh` - 自动化部署脚本
- `docker-compose.yml` - 开发阶段容器编排
- `Dockerfile` - 打包构建前端代码为镜像 **根目录核心文件说明**
- `nginx.conf` - 镜像内前端被访问的Nginx配置
- `app-product.yml` - Dcoker Swarm 集群部署配置【不准动】
- `docker-compose.yml` - 开发阶段容器编排【可选,不要就删除】
- `Dockerfile` - 打包构建前端代码为镜像【根据需求改动】
- `nginx.conf` - 镜像内前端被访问的Nginx配置【根据需求改动】
- `act-runner.yml` - gitea action 的 runner【根据需求改动】
前端工作: 前端工作:
- 1: 编辑 前端 .env.development 和 .env.production 环境变量(只需修改一次) 前期大致工作内容如下,改好后,以后就不用再动了,很简单:
- 2: 确认或编辑 docker/Dockerfiledocker/nginx.conf
- 3: 编辑 docker/deploy-swarm.sh
还有很多细节未展开,后面再详细说,大致确认无误后。 - 任务1: 编辑 前端 .env.development 和 .env.production 环境变量(只需修改一次)
在前端集群的管理机上进入项目根目录,执行下面命令部署: - 任务2: 确认或编辑 Dockerfilenginx.conf
- 任务3: 编辑 act-runner.yml
---
详细展开说明:
**任务1**
主要修改两个环境变量文件 `.env.development`,`.env.production` 中的:
```bash ```bash
# 运行自动化集群部署脚本
./docker/deploy-swarm.sh
# --- 其他命令 --- # 找技术负责人要
# 情况1: 【内网模块】填写 Nacos 内网 ip 或 域名 即可
# 情况2: 【外网模块】填写 traefik 公网 ip 或 域名 即可
# .env.development, .env.production 中 可以不一样!
VITE_NACOS_ADDRESS=????
# 删除之前的部署(可选)
docker stack rm app-product
# 查看 app-product 集群运行情况 # 这个参数很重要,前端可以自定义填写,填写后不允许再改,填完给 技术负责人 即可
docker stack ps app-product # 微前端应用的名称,遵守 app-xxxxx
# .env.development, .env.production 中 必须一样!
VITE_SERVER_NAME=app-???
# 持续观察服务副本数是否达到预期 #【ps】其他参数看环境变量内说明
watch docker stack services app-product
``` ```
---
**任务2**
主要修改两个 `Dockerfile``nginx.conf`,改起来也很简单:
Dockerfile 修改教程:
```bash
# 将 VITE_SERVER_NAME 替换为 上一步设置的 VITE_SERVER_NAME 的 数值 即可
RUN npx vite build --base=/VITE_SERVER_NAME/
# 将 VITE_SERVER_NAME 替换为 上一步设置的 VITE_SERVER_NAME 的 数值 即可
COPY --from=builder /app/dist /usr/share/nginx/html/VITE_SERVER_NAME
```
nginx.conf 修改教程:
```bash
# 看仔细了,有三处 VITE_SERVER_NAME 需要替换成 值!!
location /VITE_SERVER_NAME/ {
alias /usr/share/nginx/html/VITE_SERVER_NAME/;
try_files $uri $uri/ /VITE_SERVER_NAME/index.html;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
}
```
---
**任务3**
act-runner.yml 是 Gitea Action 的核心Gitea会将Job委托给Runner来运行**所以我们前端本地必须要先运行 act-runner.yml 文件**,这样在我们提交代码的时候 Gitea Action 的自动构建才会运行!!
但是,运行 act-runner.yml 之前,需要先对 act-runner.yml 文件进行简单的配置:
```bash
# 核心 需要改动的配置
# 可以直接让 仓库 的管理员 给你把下面参数之间配置好,当然你也可以自己配
# GITEA_INSTANCE_URL=这个前端项目模块的 git仓库地址
# 格式:协议://域名 即可例如https://git.bmycode.help 或 https://gitee.com 等
# 项目仓库首页-设置-Actions-Runner 右上角可复制令牌
# GITEA_RUNNER_REGISTRATION_TOKEN=注册令牌,来源三选一:实例,组织,全存储库
environment:
- GITEA_INSTANCE_URL=https://git.bmycode.help
- GITEA_RUNNER_REGISTRATION_TOKEN=WFiO5JDwz7CHnk7fMGJYMcSITU81CLXuI7Ofg10e
```
改好后,在**项目文件夹根目录**打开终端,通过下面命令运行 act-runner.yml 文件:
```bash
docker-compose -f act-runner.yml up -d
# 运行后,如果 在 docker desktop 的容器中找到 名字叫gitea-act-runner 的容器,查看日志:
# 有下面这行,则表示 runner 成功启动docker desktop 可以关闭了或者放后台,不用管了!
# level=debug msg="Successfully pinged the Gitea instance server"
# 如果出问题了,找 技术负责人!
```
---
**到这一步,上线 配置已经搞完,很简单吧!剩下的,你提交代码到仓库就行,项目会自动构建,自动打包发布到公司内网集群中部署和运行,不用你管了!!**

View File

@@ -0,0 +1,17 @@
version: '3.8'
services:
gitea-actions-runner:
image: gitea/act_runner:latest
container_name: gitea-act-runner
restart: unless-stopped
volumes:
- runner-data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- GITEA_INSTANCE_URL=https://git.bmycode.help
- GITEA_RUNNER_REGISTRATION_TOKEN=WFiO5JDwz7CHnk7fMGJYMcSITU81CLXuI7Ofg10e
- GITEA_RUNNER_LABELS=ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest
volumes:
runner-data:

View File

@@ -2,7 +2,7 @@ version: "3.8" # Docker Compose 文件版本3.8 支持 Swarm 模式的所有
services: services:
app-product: app-product:
image: app-product:latest image: registry.bmycode.help/app-product:{{IMAGE_TAG}}
ports: ports:
- target: 80 # 容器内部端口 - target: 80 # 容器内部端口
published: 1301 # 宿主机对外暴露端口 published: 1301 # 宿主机对外暴露端口

View File

@@ -6,7 +6,7 @@ services:
context: .. context: ..
dockerfile: docker/Dockerfile dockerfile: docker/Dockerfile
image: app-product:1.0.0 image: registry.bmycode.help/app-product:latest
container_name: app-product container_name: app-product
ports: ports:
- "1301:80" - "1301:80"

View File

@@ -1,100 +0,0 @@
#!/bin/bash
# deploy-swarm.sh
set -e
# 仓库用户名
USER_NAME="bmy"
# 仓库密码
USER_PASSWORD="lb714500."
# 仓库地址
REGISTRY="registry.bmycode.help"
# 镜像名称
IMAGE_NAME="${REGISTRY}/app-product"
# tag 标签
TAG="v$(date +%Y%m%d-%H%M%S)"
# 完整路径
FULL_IMAGE="${IMAGE_NAME}:${TAG}"
# 工作服务器列表(多个服务器)
WORKER_HOSTS=("192.168.139.120" "192.168.139.242")
WORKER_USER="root"
WORKER_PASSWORD="lb714500."
echo "=== 1 登录私有镜像仓库 ==="
if ! echo "${USER_PASSWORD}" | docker login ${REGISTRY} -u ${USER_NAME} --password-stdin; then
echo "错误: 无法登录到私有仓库 ${REGISTRY}"
exit 1
fi
echo "=== 2 构建 app-product 镜像 ==="
docker build \
-f docker/Dockerfile \
-t ${FULL_IMAGE} \
-t ${IMAGE_NAME}:latest \
.
echo "=== 3 推送镜像到私有仓库 ==="
docker push ${FULL_IMAGE}
docker push ${IMAGE_NAME}:latest
echo "=== 4 在工作服务器上拉取最新镜像 ==="
for WORKER_HOST in "${WORKER_HOSTS[@]}"; do
echo ""
echo "正在连接到工作服务器: ${WORKER_HOST}"
if sshpass -p "${WORKER_PASSWORD}" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${WORKER_USER}@${WORKER_HOST} "
echo '在工作服务器 ${WORKER_HOST} 上登录私有仓库...'
if echo '${USER_PASSWORD}' | docker login ${REGISTRY} -u ${USER_NAME} --password-stdin; then
echo '拉取最新镜像...'
docker pull ${FULL_IMAGE}
docker pull ${IMAGE_NAME}:latest
echo '镜像拉取完成'
echo '清理旧的 app-product 镜像...'
# 删除除了本次 FULL_IMAGE 和 latest 之外的所有 app-product 镜像
docker images ${IMAGE_NAME} --format 'table {{.Repository}}:{{.Tag}}' | \
grep -v '${FULL_IMAGE}' | \
grep -v '${IMAGE_NAME}:latest' | \
grep '${IMAGE_NAME}' | \
xargs -r docker rmi -f || true
else
echo '错误: 无法在工作服务器上登录私有仓库'
exit 1
fi
"; then
echo "✓ 服务器 ${WORKER_HOST} 镜像拉取成功"
else
echo "✗ 服务器 ${WORKER_HOST} 镜像拉取失败"
exit 1
fi
done
echo "=== 5 更新 docker-compose 文件中的镜像标签 ==="
sed "s|image: app-product:latest|image: ${FULL_IMAGE}|g" docker/app-product.yml > docker/app-product-deploy.yml
echo "=== 6 部署到 Swarm 集群 ==="
docker stack deploy -c docker/app-product-deploy.yml app-product
echo "=== 7 恢复原始配置文件 ==="
rm -f docker/app-product-deploy.yml
echo "=== 8 清理本地多余镜像 ==="
# 清理本地:删除除了本次 FULL_IMAGE 和 latest 之外的所有 app-product 镜像
echo "清理本地旧的 app-product 镜像..."
docker images ${IMAGE_NAME} --format 'table {{.Repository}}:{{.Tag}}' | \
grep -v "${FULL_IMAGE}" | \
grep -v "${IMAGE_NAME}:latest" | \
grep "${IMAGE_NAME}" | \
xargs -r docker rmi -f || true
# 清理悬空镜像
docker image prune -f
echo "=== 9 验证部署状态 ==="
docker stack ps app-product
echo "=== 部署完成 ==="

View File

@@ -2,6 +2,7 @@ server {
listen 80; listen 80;
server_name *.ddd.com; server_name *.ddd.com;
location /app-product/ { location /app-product/ {
alias /usr/share/nginx/html/app-product/; alias /usr/share/nginx/html/app-product/;
try_files $uri $uri/ /app-product/index.html; try_files $uri $uri/ /app-product/index.html;