现在公司代码一直是放在 Gogs(简化版的Git) 上的。老实说,心里一直挺羡慕 AWS CodeCommit / CodePipeline 那一套 —— 从代码提交、编译、打包到部署,一条流水线拉通,体验确实顺。
直到最近才认真看了一下,发现:
👉 Gogs 本身就支持 Webhook
👉 GitHub Actions 的 Workflow 足够灵活
于是突然意识到:
其实并不一定非要迁代码仓库
用 Gogs + GitHub Actions,也能拼出一套“准一站式”的 CI/CD
核心思路
整体流程很简单:
Gogs 提交 → GitHub Actions workflow 拉取最新代码 → 计算差异 → rsync/sftp 上传到服务器 → 执行 deploy.sh
关键点只有一个:
中间加一个 webhook 转发服务
为什么要转发?
- Gogs 的 webhook 和 GitHub 的 event 结构不完全一致
- GitHub Actions 没法直接“订阅”Gogs
- 所以中间写一个极简的转发服务,把 Gogs 的 webhook 转成 GitHub 能吃的格式
这个服务真的很简单,本质就是:
- 接收 Gogs webhook
- 校验签名(可选,不过不做问题不大,考虑到gogs只支持固定token,放在里面也就心理安慰;从配置上特定仓库转发到特定仓库,加上message确认,窃以为可以拦掉大部分恶意请求,且这个转发本身啥都没有)
- 调用 GitHub Repository Dispatch API
不用多少行代码就能搞定。配合AI Agent,我甚至使用不熟悉的Rust写了一个,带配置支持多平台,且根据 commit message 带特定文字才转发的 API。
GitHub Actions Workflow 示例
下面是一个简化版的 workflow.yml 示例:
name: Deploy from Gogs
on:
repository_dispatch:
types: [gogs-push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Sync code to server
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_SSH_KEY }}
script: |
mkdir -p /srv/myapp
- name: Rsync code to server
run: |
rsync -avz --delete \
--exclude='.git' \
./ ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:/srv/myapp/
- name: Run deploy script
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_SSH_KEY }}
script: |
cd /srv/myapp
chmod +x deploy.sh
./deploy.sh
几个必须注意的点
1,所有敏感信息一定放在 secrets 里
- SSH key
- Token
- Server IP
一个都别写死在yaml配置里
2,差分上传:
rsync -avz --delete会比较本地 Actions 仓库和服务器目录,只上传有变化的文件--exclude='.git'防止把本地 Git 仓库上传
3,安全性:
- 服务器只需要一个部署用户
- 所有敏感信息(IP、用户名、SSH key)放在 GitHub Secrets
4,一键部署:
- 上传完代码后直接执行
deploy.sh deploy.sh可以包含依赖安装、服务重启等操作
安全 & 权限设计(强烈建议)
我是这么做的,也建议都这么做。
1️⃣ Gogs 使用只读账号
- 专门建一个 只读账号
- 只允许
clone / pull - 不允许 push
这样即便部署机凭据泄露,影响面也有限。
2️⃣ 部署服务器使用单一部署用户
- 单独创建一个用户,比如
deploy - 只负责部署和运行该项目
- 不要给 sudo(能不用就不用)
- 项目目录只给这个用户权限
好处:
- 权限边界非常清晰
- 出问题也不会影响整台机器
总结
以前总觉得:
“一站式 CI/CD” 只能靠大厂全家桶
现在发现:
- Gogs + Webhook
- GitHub Actions
- 再加一点点 glue code
也能拼出一套:
从提交代码 → 编译 → 部署
完整、可控、成本极低 的流水线
有时候不是工具不行,
而是我们还没把它们连起来用。
如果你公司也还在用 Gogs,真的可以试试这套组合 👍