# 使用 Gitea 搭建私有 Git 服务器和 CI/CD

终于可以专注于文章内容了,应该暂时不需要再改代码了。

# 什么是 CI/CD,为什么要搞一套

现在搞完了发现其实没必要自己部署,Github Actions 可能完全够了。 但是搞了就是搞了,还能学到一些东西。

# 选择 Gitea 的理由

私有化部署的 Git 服务的选择其实不很多。如果对于企业来说,可能 Gitlab 更好(更重,功能更全)。

而对于我来说。使用更轻量的服务更为明智(毕竟自己的服务器 性能有限)

而之前使用的 gogs 没有集成 ci/cd。尝试配置 drone 后发现有一大堆坑。

https://github.com/gogs/gogs/issues/7172

例如这个。如果 drone 重启后则无法直接通过 oauth 登入。 这个 issue 这么长时间还没有 ok 也是醉了

# 安装 Gitea

直接用 Docker compose 安装 gitea.

使用 Dockge 管理 compose (Dockge 里面称作 stack,堆栈) 是更为方便的。(笔者已经使用很长时间了)

这是 Gitea 官方提供的 compose.yaml

yaml
version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:@version@
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"

注意修改上面的 version,可以直接去掉(获取 latest)

访问 3000 端口即可进行其他的配置。

配置 act-runner

如果要使用 action 功能,则必须配置 act-runner

参考 https://docs.gitea.com/zh-cn/usage/actions/act-runner 进行配置

# 编写 action

Gitea 的 action 被设计为与 Github Actions 兼容。但是也存在一些区别,详细请参考 https://docs.gitea.com/zh-cn/usage/actions/comparison

.gitea/workflows/NAME.yaml 里面写即可。

这是本项目编译和部署的 action:

yaml
name: build # 无所谓
on: [push] # 当 push 的时候执行。
jobs:
  build:
    runs-on: ubuntu-latest # 好像大家都用 ubuntu-latest,反正最后会自动清理,无所谓了
    env: # 暴露环境变量
      DATABASE_URL: ${{ secrets.DATABASE_URL }} # 这是从 secrets 里面拿,不会在 log 里面显示其内容。
      JWT_SECRET: ${{ secrets.JWT_SECRET }}
      UPLOAD_PATH: "/var/opt/uploads/" # 这个其实应该从 var 里面拿,懒,不改了
    steps:
      - name: Checkout the code # 就是把代码搞下来
        uses: actions/checkout@v4
        with:
          path: src
      - name: Install pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 9 # 指定版本
      - name: Build # 编译脚本
        run: |
          cd ./src/projects/app
          pnpm i
          pnpm prisma generate
          pnpm run build
      - name: Deploy # 通过 ssh 进行部署(其实是通过 rsync)
        uses: easingthemes/ssh-deploy@main # 参考
        with:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          ARGS: "-rlgoDzvc -i"
          SOURCE: "./src/projects/app/.output"
          REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
          REMOTE_USER: ${{ secrets.REMOTE_USER }}
          TARGET: ${{ secrets.REMOTE_TARGET }}
          SCRIPT_BEFORE: |
            echo 'BEFORE RSYNC'
          SCRIPT_AFTER: |
            echo 'AFTER RSYNC'
            sudo systemctl restart homesite.service