From 501adf781938802c8c628b5bc2f837945395b9e4 Mon Sep 17 00:00:00 2001 From: xiaoquan <838115837@qq.com> Date: Mon, 1 Jun 2026 20:01:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=BF=E6=8D=A2=20GitLab=20=E4=B8=BA?= =?UTF-8?q?=20Gitea=20+=20Act=20Runner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 .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 --- .gitea/workflows/deploy.yml | 98 ++++++++++++++++ .gitlab-ci.yml | 151 ------------------------- Makefile | 13 +++ deploy/README.md | 74 ++++++------ deploy/docker/.env.example | 3 + deploy/docker/docker-compose.gitea.yml | 49 ++++++++ scripts/setup-server.sh | 54 +++++---- 7 files changed, 236 insertions(+), 206 deletions(-) create mode 100644 .gitea/workflows/deploy.yml delete mode 100644 .gitlab-ci.yml create mode 100644 deploy/docker/docker-compose.gitea.yml diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..b3958fa --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -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 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 66124d7..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -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" diff --git a/Makefile b/Makefile index fc39114..00dcbf5 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/deploy/README.md b/deploy/README.md index 1a032af..c0a4b77 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -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** 页面查看实时日志。 --- diff --git a/deploy/docker/.env.example b/deploy/docker/.env.example index 57abd4f..43736b0 100644 --- a/deploy/docker/.env.example +++ b/deploy/docker/.env.example @@ -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 diff --git a/deploy/docker/docker-compose.gitea.yml b/deploy/docker/docker-compose.gitea.yml new file mode 100644 index 0000000..6c681c7 --- /dev/null +++ b/deploy/docker/docker-compose.gitea.yml @@ -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 diff --git a/scripts/setup-server.sh b/scripts/setup-server.sh index 878ab7d..fadf5de 100644 --- a/scripts/setup-server.sh +++ b/scripts/setup-server.sh @@ -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 ""