如何配置Linux服务器以GitHub App身份自动推送代码至GitHub仓库
实现GitHub App身份的自动化仓库推送方案
一、先完成GitHub App的创建与配置
登录GitHub后台创建新的GitHub App
- 填写名称、主页URL(任意合法地址即可)
- 在Repository permissions中,将Contents权限设为Read and write
- 选择App安装范围(仅当前账号/任意账号,根据仓库归属选择)
- 创建后记录App ID,并在设置页的"Private keys"生成并下载私钥,保存为
github-app.pem
将App安装到目标仓库所属账号
- 在App页面点击"Install App",选择目标账号后勾选要操作的公开仓库
- 从安装后的页面URL中提取Installation ID(例如URL中
installations/后的数字)
二、Ubuntu服务器环境配置
安装所需工具:
sudo apt update && sudo apt install -y curl openssl git jq
三、编写令牌自动生成脚本
创建get_installation_token.sh,用于自动生成短期的GitHub App安装令牌(有效期1小时,每次推送前自动获取新令牌):
#!/bin/bash # 替换为你的实际参数 APP_ID="你的GitHub App ID" INSTALLATION_ID="你的安装ID" PRIVATE_KEY_PATH="/绝对路径/github-app.pem" # 生成JWT签名 JWT_EXPIRATION=$(($(date +%s) + 600)) JWT_HEADER=$(echo -n '{"alg":"RS256","typ":"JWT"}' | base64 | tr -d '\n' | tr '/+' '_-' | tr -d '=') JWT_PAYLOAD=$(echo -n "{\"iat\":$(date +%s),\"exp\":$JWT_EXPIRATION,\"iss\":\"$APP_ID\"}" | base64 | tr -d '\n' | tr '/+' '_-' | tr -d '=') JWT_SIGNATURE=$(echo -n "$JWT_HEADER.$JWT_PAYLOAD" | openssl dgst -sha256 -sign "$PRIVATE_KEY_PATH" | base64 | tr -d '\n' | tr '/+' '_-' | tr -d '=') JWT_TOKEN="$JWT_HEADER.$JWT_PAYLOAD.$JWT_SIGNATURE" # 获取安装令牌 INSTALLATION_TOKEN=$(curl -s -X POST \ -H "Authorization: Bearer $JWT_TOKEN" \ -H "Accept: application/vnd.github.v3+json" \ "https://api.github.com/app/installations/$INSTALLATION_ID/access_tokens" | jq -r '.token') echo "$INSTALLATION_TOKEN"
给脚本添加执行权限:
chmod +x get_installation_token.sh
同时确保私钥文件权限安全:
chmod 600 /绝对路径/github-app.pem
四、配置Git提交身份为GitHub App
进入仓库目录(如果还没克隆先跳过这步,后续脚本会处理),设置提交的用户名和邮箱为GitHub App专属身份:
cd repository git config user.name "你的GitHub App名称[bot]" git config user.email "你的AppID+你的GitHub App名称@users.noreply.github.com"
五、编写自动化推送脚本
创建auto_push.sh,整合全流程:
#!/bin/bash # 替换为你的实际参数 REPO_URL="https://github.com/你的用户名/你的仓库名.git" REPO_FOLDER="repository" TOKEN_SCRIPT_PATH="/绝对路径/get_installation_token.sh" # 获取最新令牌 INSTALLATION_TOKEN=$($TOKEN_SCRIPT_PATH) # 克隆仓库(如果不存在) if [ ! -d "$REPO_FOLDER" ]; then git clone "https://x-access-token:$INSTALLATION_TOKEN@${REPO_URL#https://}" $REPO_FOLDER fi cd $REPO_FOLDER # 执行你的操作:创建文件夹、文件 mkdir -p new_folder touch new_folder/test.txt # 提交并推送 git add . git commit -m "Automated commit via GitHub App" # 替换main为你的仓库默认分支(如master) git push "https://x-access-token:$INSTALLATION_TOKEN@${REPO_URL#https://}" HEAD:main
给脚本添加执行权限:
chmod +x auto_push.sh
六、可选:设置定时自动执行
如果需要定期运行,编辑crontab任务:
crontab -e
添加一行(示例为每天凌晨1点执行,日志输出到指定文件):
0 1 * * * /绝对路径/auto_push.sh >> /var/log/auto_push.log 2>&1
内容的提问来源于stack exchange,提问作者Coollector
相关产品推荐
相关产品推荐

