如何用Node.js脚本批量设置GitHub Actions密钥?
批量设置GitHub Actions密钥的Node.js方案
方案可行性
这个方案完全可行,GitHub提供了专门的API用于创建/更新仓库级别的Actions密钥,Node.js的跨平台特性能满足多系统兼容需求,且该API本身支持覆盖已存在的密钥(调用相同接口即可完成更新)。
实现示例
确保你的Node.js版本在12及以上,按以下步骤实现:
1. 安装依赖
使用官方GitHub API客户端octokit简化调用流程,避免手动处理加密和请求细节:
npm install @octokit/rest
2. 完整脚本(set-secrets.js)
const { Octokit } = require("@octokit/rest"); // 配置信息,替换为你自己的内容 const REPO_OWNER = 'your-username'; const REPO_NAME = 'your-repo'; const GITHUB_TOKEN = 'your-personal-access-token'; // 需拥有repo权限 // 批量密钥数据 const arrSecrets = [ ['KEY_NAME1', 'secretValue1'], ['KEY_NAME2', 'secretValue2'], // 可添加更多密钥 ]; // 初始化Octokit客户端 const octokit = new Octokit({ auth: GITHUB_TOKEN }); // 批量设置密钥的函数 async function setSecrets() { try { // 获取仓库公钥,用于加密密钥值 const { data: publicKey } = await octokit.rest.actions.getRepoPublicKey({ owner: REPO_OWNER, repo: REPO_NAME, }); // 遍历密钥数组,逐个设置/更新 for (const [secretName, secretValue] of arrSecrets) { // 用仓库公钥加密密钥值(GitHub要求必须加密后传输) const encryptedValue = encrypt(secretValue, publicKey.key); // 调用API设置密钥(已存在则自动覆盖) await octokit.rest.actions.createOrUpdateRepoSecret({ owner: REPO_OWNER, repo: REPO_NAME, secret_name: secretName, encrypted_value: encryptedValue, key_id: publicKey.key_id, }); console.log(`✅ 密钥 ${secretName} 设置/更新成功`); } console.log('\n🎉 所有密钥处理完成'); } catch (error) { console.error('❌ 处理过程中出现错误:', error.message); process.exit(1); } } // RSA加密函数(符合GitHub要求的加密方式) function encrypt(value, publicKey) { const crypto = require('crypto'); const buffer = Buffer.from(value, 'utf8'); const encrypted = crypto.publicEncrypt( { key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING, oaepHash: 'sha256', }, buffer ); return encrypted.toString('base64'); } // 执行脚本 setSecrets();
3. 使用说明
- 个人访问令牌(GITHUB_TOKEN)需拥有
repo权限,创建时在权限设置中勾选repo下的所有选项 - 替换脚本中的
REPO_OWNER、REPO_NAME和GITHUB_TOKEN为实际值 - 运行脚本:
node set-secrets.js
关键说明
- 跨平台兼容:Node.js的
crypto模块和octokit库均支持Windows、Linux/Unix、Mac系统 - 覆盖已有密钥:
createOrUpdateRepoSecret接口是幂等的,密钥已存在时会自动覆盖原有值 - 安全性:通过仓库公钥加密密钥值,避免明文传输,符合GitHub的安全要求
内容的提问来源于stack exchange,提问作者Jorge Mauricio
相关产品推荐
相关产品推荐

