You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:32:21