如何在GitHub仓库文件变更/合并时调用外部.NET 6.0 REST API
用GitHub Actions实现文件变更触发外部API调用
核心思路
通过GitHub Actions监听main分支的push事件(包含PR合并到main的场景),筛选出变更的.txt文件,然后调用你的.NET 6.0 REST API发送文件内容。
分步实现
1. 编写工作流配置文件
在仓库的.github/workflows目录下创建sync-files.yml,内容如下:
name: Sync Changed TXT Files to API on: push: branches: [ main ] paths: [ '**.txt' ] # 仅监听所有.txt文件的增改操作 jobs: sync: runs-on: ubuntu-latest steps: - name: 拉取仓库代码 uses: actions/checkout@v4 with: fetch-depth: 2 # 拉取最近两次提交记录,用于对比变更文件 - name: 获取变更的.txt文件列表 id: changed-files run: | # 对比当前提交与上一次提交,筛选出所有变更的.txt文件 CHANGED_FILES=$(git diff --name-only HEAD^ HEAD | grep '\.txt$' | tr '\n' ' ') echo "files=$CHANGED_FILES" >> $GITHUB_OUTPUT - name: 发送文件到外部API if: steps.changed-files.outputs.files != '' # 仅当存在变更文件时执行 run: | for FILE in ${{ steps.changed-files.outputs.files }}; do # 读取文件内容并POST到指定API端点 curl -X POST \ -H "Content-Type: text/plain" \ -d @"$FILE" \ "${{ secrets.API_ENDPOINT }}" done env: API_ENDPOINT: ${{ secrets.API_ENDPOINT }}
2. 配置GitHub Secrets
进入仓库的Settings > Secrets and variables > Actions页面,新建一个名为API_ENDPOINT的Secret,填入你的.NET API完整地址(例如https://your-service/api/process-file)。
3. 处理API认证(可选)
如果你的API需要身份验证(比如Bearer Token):
- 新增一个
API_TOKEN的Secret,填入你的认证令牌 - 修改curl命令,添加认证头:
curl -X POST \ -H "Content-Type: text/plain" \ -H "Authorization: Bearer ${{ secrets.API_TOKEN }}" \ -d @"$FILE" \ "${{ secrets.API_ENDPOINT }}"
关键细节说明
- 触发场景覆盖:无论是直接在main分支手动修改推送,还是从功能分支合并PR到main,只要有.txt文件变更,工作流都会自动触发。
- 编码兼容处理:如果你的.txt文件使用非UTF-8编码(如GBK),可以先转码再发送,例如:
iconv -f GBK -t UTF-8 "$FILE" > temp.txt curl -X POST -d @temp.txt "${{ secrets.API_ENDPOINT }}"
- 失败重试机制:为避免网络波动导致API调用失败,可给curl添加重试参数:
curl --retry 3 --retry-delay 2 ...
替代方案:GitHub Webhooks
如果不想用GitHub Actions,也可以直接配置GitHub Webhooks:
- 在仓库
Settings > Webhooks页面新建Webhook,选择监听push事件,勾选content类型的payload。 - 开发一个中间服务,接收GitHub的Webhook请求,解析出变更的.txt文件,再转发到你的.NET API。
不过这种方式需要自己维护中间服务,不如GitHub Actions开箱即用。
内容的提问来源于stack exchange,提问作者S2S2
相关产品推荐
相关产品推荐

