如何在GitHub创建仓库时自动添加.workflow/config.yml配置文件?
解决思路:GitHub Actions无法直接触发仓库创建事件,换用外部监听+API写入
GitHub Actions是依附于具体仓库运行的,新仓库刚创建时没有任何Actions配置,所以没法直接用Actions触发仓库创建后的操作。得通过监听仓库创建的webhook事件,再调用GitHub API写入目标文件。
具体实现步骤
1. 创建GitHub App并配置权限
- 注册一个GitHub App,勾选Repository contents权限(设置为“读写”),确保拥有操作仓库文件的权限。
- 在App的Webhook设置里,添加接收事件的URL(可以用ngrok临时测试,或者部署简单的云函数/服务器),并勾选Repository事件中的
created选项。 - 生成App的私钥并保存,用于后续API鉴权。
2. 编写webhook处理逻辑
当收到repository.created事件时,调用GitHub API向新仓库写入.workflow/config.yml文件:
- 解析webhook请求中的仓库信息(所有者、仓库名)。
- 用App私钥生成访问令牌,调用
PUT /repos/{owner}/{repo}/contents/.workflow/config.yml接口,上传你的配置文件内容。
示例伪代码(Node.js):
const { Octokit } = require("@octokit/rest"); const jwt = require("jsonwebtoken"); // 生成GitHub App访问令牌 async function getInstallationToken(appId, privateKey, installationId) { const payload = { iss: appId, exp: Math.floor(Date.now() / 1000) + 60 * 10, iat: Math.floor(Date.now() / 1000), }; const token = jwt.sign(payload, privateKey, { algorithm: "RS256" }); const octokit = new Octokit({ auth: `Bearer ${token}` }); const res = await octokit.apps.createInstallationAccessToken({ installation_id: installationId }); return res.data.token; } // 写入配置文件 async function addWorkflowConfig(owner, repo, token) { const octokit = new Octokit({ auth: token }); await octokit.rest.repos.createOrUpdateFileContents({ owner, repo, path: ".workflow/config.yml", message: "Add default workflow config", content: Buffer.from("你的GitHub Actions配置内容").toString("base64"), }); } // 处理webhook请求 app.post("/webhook", async (req, res) => { const { action, repository } = req.body; if (action === "created") { const token = await getInstallationToken(你的AppID, 你的私钥, repository.owner.id); await addWorkflowConfig(repository.owner.login, repository.name, token); } res.sendStatus(200); });
3. 替代方案:用个人访问令牌(PAT)定时检查
如果不想部署服务器,也可以在现有仓库中设置定时Actions,定期检查账户下的新仓库并写入配置:
- 创建带
repo权限的个人访问令牌(PAT),存入仓库Secrets(命名为REPO_PAT)。 - 编写Actions工作流,定时运行脚本获取新仓库列表,写入配置文件。
示例Actions配置:
name: Add Default Workflow Config on: schedule: - cron: '0 0 * * *' # 每天凌晨运行 workflow_dispatch: # 支持手动触发 jobs: add-config: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Install dependencies run: npm install @octokit/rest - name: Add config to new repos env: PAT: ${{ secrets.REPO_PAT }} run: node ./add-config.js
对应的add-config.js核心逻辑:
- 调用API获取所有仓库,筛选出最近创建的(比如24小时内)。
- 对每个新仓库,检查
.workflow/config.yml是否存在,不存在则调用API写入。
注意事项
- 令牌权限要最小化,且妥善保管,避免泄露。
- 若为组织账户,需将GitHub App安装到整个组织,才能监听组织内的仓库创建事件。
内容的提问来源于stack exchange,提问作者mbt
相关产品推荐
相关产品推荐

