feat: 替换 GitLab 为 Gitea + Act Runner
- 删除 .gitlab-ci.yml - 新增 .gitea/workflows/deploy.yml (Gitea Actions 工作流) - 新增 deploy/docker/docker-compose.gitea.yml (Gitea + Act Runner) - 更新 scripts/setup-server.sh 初始化脚本 - 更新 deploy/README.md 部署文档 - 更新 Makefile 新增 gitea-* 命令 - 更新 .env.example 新增 GITEA_RUNNER_TOKEN Gitea 内存占用约 100MB,适合 4GB 小内存服务器 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
name: Deploy
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- prod
|
||||
- test
|
||||
|
||||
env:
|
||||
NODE_ENV: production
|
||||
|
||||
jobs:
|
||||
install:
|
||||
runs-on: [self-hosted, rent-deploy]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install -g pnpm
|
||||
pnpm config set store-dir .pnpm-store
|
||||
pnpm install --frozen-lockfile
|
||||
|
||||
- name: Cache pnpm store
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: .pnpm-store
|
||||
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
|
||||
|
||||
build:
|
||||
runs-on: [self-hosted, rent-deploy]
|
||||
needs: install
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Restore pnpm cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: .pnpm-store
|
||||
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
|
||||
|
||||
- name: Build shared packages
|
||||
run: |
|
||||
npm install -g pnpm
|
||||
pnpm config set store-dir .pnpm-store
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm --filter @rent/shared-types build
|
||||
pnpm --filter @rent/shared-utils build
|
||||
|
||||
- name: Build server
|
||||
run: pnpm --filter @rent/server build
|
||||
|
||||
- name: Build merchant-admin
|
||||
run: pnpm --filter @rent/merchant-admin build
|
||||
|
||||
- name: Build platform-admin
|
||||
run: pnpm --filter @rent/platform-admin build
|
||||
|
||||
- name: Build website
|
||||
run: pnpm --filter @rent/official-website build
|
||||
|
||||
deploy-production:
|
||||
runs-on: [self-hosted, rent-deploy]
|
||||
needs: build
|
||||
if: github.ref == 'refs/heads/prod'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Deploy to production
|
||||
run: |
|
||||
echo "部署到生产环境..."
|
||||
cd deploy/docker
|
||||
docker-compose -f docker-compose.prod.yml down --remove-orphans
|
||||
docker-compose -f docker-compose.prod.yml build --parallel
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
docker image prune -f
|
||||
echo "等待服务启动..."
|
||||
sleep 10
|
||||
docker-compose -f docker-compose.prod.yml ps
|
||||
|
||||
deploy-test:
|
||||
runs-on: [self-hosted, rent-deploy]
|
||||
needs: build
|
||||
if: github.ref == 'refs/heads/test'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Deploy to test
|
||||
run: |
|
||||
echo "部署到测试环境..."
|
||||
cd deploy/docker
|
||||
docker-compose -f docker-compose.test.yml down --remove-orphans
|
||||
docker-compose -f docker-compose.test.yml build --parallel
|
||||
docker-compose -f docker-compose.test.yml up -d
|
||||
docker image prune -f
|
||||
echo "等待服务启动..."
|
||||
sleep 10
|
||||
docker-compose -f docker-compose.test.yml ps
|
||||
-151
@@ -1,151 +0,0 @@
|
||||
stages:
|
||||
- install
|
||||
- build
|
||||
- deploy
|
||||
|
||||
variables:
|
||||
NODE_ENV: production
|
||||
|
||||
# prod 和 test 分支触发
|
||||
workflow:
|
||||
rules:
|
||||
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH == "prod"
|
||||
- if: $CI_COMMIT_BRANCH == "test"
|
||||
|
||||
# pnpm store 缓存
|
||||
cache:
|
||||
key:
|
||||
files:
|
||||
- pnpm-lock.yaml
|
||||
paths:
|
||||
- .pnpm-store
|
||||
|
||||
# ==================== INSTALL ====================
|
||||
install_dependencies:
|
||||
stage: install
|
||||
tags:
|
||||
- rent-deploy
|
||||
script:
|
||||
- npm install -g pnpm
|
||||
- pnpm config set store-dir .pnpm-store
|
||||
- pnpm install --frozen-lockfile
|
||||
artifacts:
|
||||
paths:
|
||||
- node_modules/
|
||||
- apps/*/node_modules/
|
||||
- packages/*/node_modules/
|
||||
expire_in: 1 hour
|
||||
|
||||
# ==================== BUILD ====================
|
||||
build_server:
|
||||
stage: build
|
||||
tags:
|
||||
- rent-deploy
|
||||
needs: [install_dependencies]
|
||||
script:
|
||||
- npm install -g pnpm
|
||||
- pnpm config set store-dir .pnpm-store
|
||||
- pnpm --filter @rent/shared-types build
|
||||
- pnpm --filter @rent/shared-utils build
|
||||
- pnpm --filter @rent/server build
|
||||
artifacts:
|
||||
paths:
|
||||
- apps/server/dist/
|
||||
expire_in: 1 hour
|
||||
|
||||
build_merchant:
|
||||
stage: build
|
||||
tags:
|
||||
- rent-deploy
|
||||
needs: [install_dependencies]
|
||||
script:
|
||||
- npm install -g pnpm
|
||||
- pnpm config set store-dir .pnpm-store
|
||||
- pnpm --filter @rent/shared-types build
|
||||
- pnpm --filter @rent/shared-utils build
|
||||
- pnpm --filter @rent/merchant-admin build
|
||||
artifacts:
|
||||
paths:
|
||||
- apps/merchant-admin/dist/
|
||||
expire_in: 1 hour
|
||||
|
||||
build_platform:
|
||||
stage: build
|
||||
tags:
|
||||
- rent-deploy
|
||||
needs: [install_dependencies]
|
||||
script:
|
||||
- npm install -g pnpm
|
||||
- pnpm config set store-dir .pnpm-store
|
||||
- pnpm --filter @rent/shared-types build
|
||||
- pnpm --filter @rent/shared-utils build
|
||||
- pnpm --filter @rent/platform-admin build
|
||||
artifacts:
|
||||
paths:
|
||||
- apps/platform-admin/dist/
|
||||
expire_in: 1 hour
|
||||
|
||||
build_website:
|
||||
stage: build
|
||||
tags:
|
||||
- rent-deploy
|
||||
needs: [install_dependencies]
|
||||
script:
|
||||
- npm install -g pnpm
|
||||
- pnpm config set store-dir .pnpm-store
|
||||
- pnpm --filter @rent/official-website build
|
||||
artifacts:
|
||||
paths:
|
||||
- apps/official-website/out/
|
||||
expire_in: 1 hour
|
||||
|
||||
# ==================== DEPLOY ====================
|
||||
deploy_production:
|
||||
stage: deploy
|
||||
tags:
|
||||
- rent-deploy
|
||||
needs:
|
||||
- build_server
|
||||
- build_merchant
|
||||
- build_platform
|
||||
- build_website
|
||||
script:
|
||||
- echo "部署到生产环境..."
|
||||
- cd deploy/docker
|
||||
- docker-compose -f docker-compose.prod.yml down --remove-orphans
|
||||
- docker-compose -f docker-compose.prod.yml build --parallel
|
||||
- docker-compose -f docker-compose.prod.yml up -d
|
||||
- docker image prune -f
|
||||
- echo "等待服务启动..."
|
||||
- sleep 10
|
||||
- docker-compose -f docker-compose.prod.yml ps
|
||||
environment:
|
||||
name: production
|
||||
rules:
|
||||
- if: $CI_COMMIT_BRANCH == "prod"
|
||||
|
||||
deploy_test:
|
||||
stage: deploy
|
||||
tags:
|
||||
- rent-deploy
|
||||
needs:
|
||||
- build_server
|
||||
- build_merchant
|
||||
- build_platform
|
||||
- build_website
|
||||
script:
|
||||
- echo "部署到测试环境..."
|
||||
- cd deploy/docker
|
||||
- docker-compose -f docker-compose.test.yml down --remove-orphans
|
||||
- docker-compose -f docker-compose.test.yml build --parallel
|
||||
- docker-compose -f docker-compose.test.yml up -d
|
||||
- docker image prune -f
|
||||
- echo "等待服务启动..."
|
||||
- sleep 10
|
||||
- docker-compose -f docker-compose.test.yml ps
|
||||
environment:
|
||||
name: test
|
||||
rules:
|
||||
- if: $CI_COMMIT_BRANCH == "test"
|
||||
@@ -2,11 +2,13 @@
|
||||
prod-build prod-up prod-down prod-restart prod-logs prod-logs-server prod-ps prod-deploy \
|
||||
test-build test-up test-down test-restart test-logs test-logs-server test-ps test-deploy \
|
||||
gateway-up gateway-down gateway-reload \
|
||||
gitea-up gitea-down gitea-logs \
|
||||
init deploy clean
|
||||
|
||||
DOCKER_PROD = docker-compose -f deploy/docker/docker-compose.prod.yml
|
||||
DOCKER_TEST = docker-compose -f deploy/docker/docker-compose.test.yml
|
||||
DOCKER_GATEWAY = docker-compose -f deploy/docker/docker-compose.gateway.yml
|
||||
DOCKER_GITEA = docker-compose -f deploy/docker/docker-compose.gitea.yml
|
||||
|
||||
help: ## 显示帮助信息
|
||||
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \
|
||||
@@ -97,4 +99,15 @@ clean: ## 清理所有容器、数据卷和悬空镜像
|
||||
$(DOCKER_PROD) down -v
|
||||
$(DOCKER_TEST) down -v
|
||||
$(DOCKER_GATEWAY) down
|
||||
$(DOCKER_GITEA) down
|
||||
docker image prune -f
|
||||
|
||||
# ===== Gitea =====
|
||||
gitea-up: ## 启动 Gitea + Act Runner
|
||||
$(DOCKER_GITEA) up -d
|
||||
|
||||
gitea-down: ## 停止 Gitea + Act Runner
|
||||
$(DOCKER_GITEA) down
|
||||
|
||||
gitea-logs: ## 查看 Gitea 日志
|
||||
$(DOCKER_GITEA) logs -f --tail=100
|
||||
|
||||
+40
-34
@@ -107,66 +107,72 @@ make test-deploy
|
||||
|
||||
---
|
||||
|
||||
## 二、GitLab CI/CD 自动化
|
||||
## 二、Gitea + Act Runner 自动化
|
||||
|
||||
> Gitea 内存占用约 100MB,适合 4GB 小内存服务器。
|
||||
|
||||
### 前提条件
|
||||
|
||||
- 服务器已运行初始化脚本
|
||||
- 代码已推送到 GitLab 仓库
|
||||
- 服务器已运行初始化脚本(Gitea 和 Act Runner 已自动启动)
|
||||
- Gitea 已完成初始配置
|
||||
|
||||
### 第 1 步:安装 GitLab Runner
|
||||
### 第 1 步:配置 Gitea
|
||||
|
||||
首次初始化已自动启动 Gitea,访问 `http://服务器IP:3002` 完成:
|
||||
|
||||
1. 设置管理员账号密码
|
||||
2. 创建仓库 `rent-platform`
|
||||
|
||||
### 第 2 步:注册 Act Runner
|
||||
|
||||
1. Gitea → **Settings → Actions → Runners → Create new Runner**
|
||||
2. 复制 Registration Token
|
||||
3. 编辑 `.env` 填入 token:
|
||||
|
||||
```bash
|
||||
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
|
||||
sudo apt install gitlab-runner
|
||||
vi deploy/docker/.env
|
||||
# 将 GITEA_RUNNER_TOKEN=change_me 改为真实 token
|
||||
```
|
||||
|
||||
### 第 2 步:注册 Runner
|
||||
|
||||
1. GitLab → **Settings → CI/CD → Runners** → 复制 token
|
||||
2. 在服务器执行:
|
||||
4. 重启 Runner:
|
||||
|
||||
```bash
|
||||
sudo gitlab-runner register
|
||||
docker compose -f deploy/docker/docker-compose.gitea.yml restart act-runner
|
||||
```
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|------|
|
||||
| GitLab URL | `http://你的GitLab地址/` |
|
||||
| Token | 从页面复制 |
|
||||
| Description | `rent-deploy-runner` |
|
||||
| Tags | `rent-deploy` |
|
||||
| Executor | `shell` |
|
||||
|
||||
### 第 3 步:配置 Runner 权限
|
||||
5. 验证 Runner 状态:
|
||||
|
||||
```bash
|
||||
sudo usermod -aG docker gitlab-runner
|
||||
sudo -u gitlab-runner npm install -g pnpm
|
||||
docker logs rent-act-runner
|
||||
```
|
||||
|
||||
### 第 4 步:配置 CI/CD 变量
|
||||
在 Gitea → **Settings → Actions → Runners** 页面应能看到 `rent-deploy-runner` 已注册并在线。
|
||||
|
||||
GitLab → **Settings → CI/CD → Variables**:
|
||||
### 第 3 步:推送代码到 Gitea
|
||||
|
||||
| 变量名 | 说明 | Masked |
|
||||
|--------|------|--------|
|
||||
| `PROD_DB_PASSWORD` | 生产数据库密码 | ✅ |
|
||||
| `PROD_JWT_SECRET` | 生产 JWT 密钥 | ✅ |
|
||||
| `TEST_DB_PASSWORD` | 测试数据库密码 | ✅ |
|
||||
| `TEST_JWT_SECRET` | 测试 JWT 密钥 | ✅ |
|
||||
```bash
|
||||
# 添加 Gitea 远程仓库
|
||||
git remote add gitea http://服务器IP:3002/用户名/rent-platform.git
|
||||
|
||||
### 第 5 步:推送代码触发部署
|
||||
# 推送分支
|
||||
git push gitea master
|
||||
git push gitea test
|
||||
git push gitea prod
|
||||
```
|
||||
|
||||
### 第 4 步:自动部署触发
|
||||
|
||||
```bash
|
||||
# 推送 test 分支 → 自动部署测试环境
|
||||
git push origin test
|
||||
git push gitea test
|
||||
|
||||
# 推送 prod 分支 → 自动部署生产环境
|
||||
git push origin prod
|
||||
git push gitea prod
|
||||
```
|
||||
|
||||
流水线:install → build(并行构建 4 个应用)→ deploy
|
||||
流水线:install → build → deploy
|
||||
|
||||
在 Gitea → **仓库 → Actions** 页面查看实时日志。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -5,3 +5,6 @@ PROD_JWT_SECRET=change_me_in_production
|
||||
# ===== 测试环境 =====
|
||||
TEST_DB_PASSWORD=change_me_in_test
|
||||
TEST_JWT_SECRET=change_me_in_test
|
||||
|
||||
# ===== Gitea Act Runner =====
|
||||
GITEA_RUNNER_TOKEN=change_me
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
gitea:
|
||||
image: gitea/gitea:latest
|
||||
container_name: rent-gitea
|
||||
restart: always
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
- GITEA__server__ROOT_URL=http://localhost:3002/
|
||||
- GITEA__server__HTTP_PORT=3000
|
||||
- GITEA__server__SSH_PORT=2222
|
||||
- GITEA__server__SSH_LISTEN_PORT=2222
|
||||
ports:
|
||||
- "3002:3000"
|
||||
- "2222:2222"
|
||||
volumes:
|
||||
- gitea_data:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
networks:
|
||||
- gitea
|
||||
|
||||
act-runner:
|
||||
image: gitea/act_runner:latest
|
||||
container_name: rent-act-runner
|
||||
restart: always
|
||||
depends_on:
|
||||
- gitea
|
||||
environment:
|
||||
- GITEA_INSTANCE_URL=http://gitea:3000
|
||||
# 注册后在 Gitea Web 界面获取 token,填入下面配置
|
||||
- GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_TOKEN:-change_me}
|
||||
- GITEA_RUNNER_NAME=rent-deploy-runner
|
||||
- GITEA_RUNNER_LABELS=rent-deploy:docker://node:18-alpine
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- act_runner_data:/data
|
||||
networks:
|
||||
- gitea
|
||||
|
||||
volumes:
|
||||
gitea_data:
|
||||
act_runner_data:
|
||||
|
||||
networks:
|
||||
gitea:
|
||||
name: gitea
|
||||
+33
-21
@@ -6,6 +6,9 @@ echo " 品居会 - 服务器首次初始化"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
|
||||
# ===== 1. 系统更新 =====
|
||||
echo ">>> 更新系统包..."
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
@@ -45,8 +48,6 @@ else
|
||||
fi
|
||||
|
||||
# ===== 6. 配置环境变量 =====
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
ENV_FILE="$PROJECT_DIR/deploy/docker/.env"
|
||||
|
||||
if [ ! -f "$ENV_FILE" ]; then
|
||||
@@ -72,9 +73,17 @@ echo ">>> 创建 Docker 网络..."
|
||||
docker network create rent-prod 2>/dev/null || echo " rent-prod 网络已存在。"
|
||||
docker network create rent-test 2>/dev/null || echo " rent-test 网络已存在。"
|
||||
|
||||
# ===== 8. 启动网关 =====
|
||||
echo ">>> 启动 Gateway Nginx..."
|
||||
# ===== 8. 启动 Gitea =====
|
||||
echo ">>> 启动 Gitea + Act Runner..."
|
||||
cd "$PROJECT_DIR"
|
||||
docker compose -f deploy/docker/docker-compose.gitea.yml up -d
|
||||
|
||||
echo ""
|
||||
echo " 等待 Gitea 启动(约 30 秒)..."
|
||||
sleep 30
|
||||
|
||||
# ===== 9. 启动 Gateway =====
|
||||
echo ">>> 启动 Gateway Nginx..."
|
||||
docker compose -f deploy/docker/docker-compose.gateway.yml up -d
|
||||
|
||||
echo ""
|
||||
@@ -83,25 +92,28 @@ echo " 初始化完成!"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
echo "后续步骤:"
|
||||
echo " 1. 确认 .env 中的密码已正确填写"
|
||||
echo " 2. 部署生产环境:make prod-deploy"
|
||||
echo " 3. 部署测试环境:make test-deploy"
|
||||
echo ""
|
||||
echo " 配置以下 DNS 记录指向本服务器 IP:"
|
||||
echo " 1. 配置 Gitea:"
|
||||
echo " 访问 http://服务器IP:3002 完成初始设置"
|
||||
echo " 创建管理员账号,创建仓库"
|
||||
echo ""
|
||||
echo " 生产环境:"
|
||||
echo " api.pinzhuhui.com"
|
||||
echo " www.pinzhuhui.com"
|
||||
echo " merchant.pinzhuhui.com"
|
||||
echo " platform-admin.pinzhuhui.com"
|
||||
echo " 2. 注册 Act Runner:"
|
||||
echo " Gitea → Settings → Actions → Runners → Create Runner"
|
||||
echo " 复制 Registration Token"
|
||||
echo " 编辑 $PROJECT_DIR/deploy/docker/.env"
|
||||
echo " 将 GITEA_RUNNER_TOKEN 替换为真实 token"
|
||||
echo " 然后重启:docker compose -f deploy/docker/docker-compose.gitea.yml restart act-runner"
|
||||
echo ""
|
||||
echo " 测试环境:"
|
||||
echo " api-test.pinzhuhui.com"
|
||||
echo " test.pinzhuhui.com"
|
||||
echo " merchant-test.pinzhuhui.com"
|
||||
echo " platform-admin-test.pinzhuhui.com"
|
||||
echo " 3. 推送代码到 Gitea:"
|
||||
echo " git remote add gitea http://服务器IP:3002/用户名/rent-platform.git"
|
||||
echo " git push gitea master"
|
||||
echo " git push gitea test"
|
||||
echo ""
|
||||
echo " 4. (可选)配置 SSL 证书:"
|
||||
echo " sudo apt install certbot"
|
||||
echo " sudo certbot certonly --standalone -d api.pinzhuhui.com -d www.pinzhuhui.com ..."
|
||||
echo " 4. 部署服务:"
|
||||
echo " make prod-deploy # 生产环境"
|
||||
echo " make test-deploy # 测试环境"
|
||||
echo ""
|
||||
echo " 5. 配置 DNS 记录指向本服务器 IP:"
|
||||
echo " 生产:api/www/merchant/platform-admin.pinzhuhui.com"
|
||||
echo " 测试:api-test/test/merchant-test/platform-admin-test.pinzhuhui.com"
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user