现在公司代码一直是放在 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,真的可以试试这套组合 👍

最后修改日期: 2026年1月23日

作者