Writing archive
使用 Gitea 搭建私有 Git 服务器和 CI/CD
使用 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
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:
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