Backstage CLI 模块 backstage/cli-module-github 实战用 create-github-app 一键创建组织级 GitHub App【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstagebackstage/cli-module-github是 Backstage CLI 的一个官方 CLI 模块为backstage-cli提供create-github-app命令帮助你在 GitHub 组织中快速创建专供 Backstage 使用的 GitHub App从而替代基于 Token 的 GitHub 集成方式。本文以该模块的源码、CLI 模块机制及官方集成文档为主线完整讲解命令用法、交互式创建流程、凭据文件结构、app-config.yaml接入方式与底层 Manifest 实现原理读者学完后可直接在项目中完成 GitHub App 的创建与配置。一、模块定位GitHub 集成的新一代接入方式backstage/cli-module-github当前仓库中版本为 0.1.4在 package.json 中声明backstage.role为cli-module生命周期标记为experimental所有者是tooling-maintainers见 catalog-info.yaml。它提供的唯一命令是create-github-app用于在你的 GitHub 组织中创建新的 GitHub App。它的核心价值在于官方文档 GitHub Apps for Backstage Authentication 指出相比 OAuth App 的 scope 模型GitHub App 带来了更清晰、更好的授权模型并且 Backstage 可以以应用而非用户或机器人账号的身份工作享有更高的 API 速率限制。模块在 CLI 中的命令注册非常简洁src/index.ts 中通过createCliModule将命令路径[create-github-app]注册进 CLI并采用按需加载loader的方式执行命令体export default createCliModule({ packageJson, init: async reg { reg.addCommand({ path: [create-github-app], description: Create new GitHub App in your organization., execute: { loader: () import(./commands/create-github-app) }, }); }, });二、命令用法与参数说明根据模块自带的 cli-report.md 与官方 CLI 命令索引 03-commands.mdcreate-github-app的完整用法为Usage: backstage-cli create-github-app github-org Options: -h, --helpgithub-org必填位置参数目标 GitHub 组织的名称是命令唯一的位置参数-h, --help显示命令帮助信息命令没有其他可选 flag创建过程中的选项全部通过交互式提示完成。执行入口是yarn backstage-cli create-github-app github-org参考 module-github.md。命令行解析在命令实现中通过cleye完成位置参数会被提取为org见 index.ts。三、交互式创建流程全解析命令启动后并不会立即调用 GitHub API 创建应用而是走完一套本地起服务 → 打开浏览器 → 由 GitHub 完成创建 → 回调拿凭据 → 落盘 YAML的自动化流程。整个流程实现在 index.ts 与 GithubCreateAppServer.ts 中可拆解为以下 4 步。1. 权限多选Permissions 选择命令首先通过inquirer弹出 checkbox 多选框要求至少选择一项权限否则输出红色提示并process.exit(1)index.ts#L44-L70。三个可选权限及其用途如下选项权限值适用场景Read access to content默认勾选readSoftware Catalog 从仓库摄取数据所需Read access to members默认勾选membersSoftware Catalog 摄取 GitHub 团队/用户数据所需Read and Write to content and actionswriteSoftware Templates 创建新仓库所需对应源码中的 choices 定义index.ts#L49-L64还提示权限之后可以在 GitHub 端修改但修改后需要所有已安装方审批。2. 组织存在性校验verifyGithubOrg拿到org后命令调用verifyGithubOrgindex.ts#L100-L146通过fetch请求https://api.github.com/orgs/org验证组织是否存在返回404弹出确认框询问是否新建组织若确认则用openBrowser打开 GitHub 的组织创建页面并提示创建完成后请重新运行本命令随后正常退出exit 0网络异常仅打印黄色警告不中断流程若组织不存在且用户拒绝创建则打印提示并以非零码退出。这也是 changelog 中记录的演进点v1.2.0 起命令会在组织参数是用户或不存在时抛出错误见 CHANGELOG.md 对应版本说明以及 v1.2.0-changelog.md。3. 本地回调服务与 GitHub App Manifest 流程随后进入核心的GithubCreateAppServer.runGithubCreateAppServer.ts#L51-L59其机制是 GitHub 官方的App Manifest 流程在本地用express监听随机端口app.listen(0)得到http://localhost:port作为baseUrl用openBrowser打开该本地地址本地服务根路径返回一个自动提交的 HTML 表单FORM_PAGE把构造好的 manifest JSON 以POST方式提交到https://github.com/organizations/org/settings/apps/newGitHub 完成创建后会重定向到 manifest 中声明的redirect_url即http://localhost:port/callback/callback处理器用octokit/request请求POST /app-manifests/{code}/conversions将临时 code 转换为正式的 App 配置GithubCreateAppServer.ts#L80-L100拿到client_id、client_secret、webhook_secret、pem私钥等信息后 resolve 给命令主体并 302 跳转到该 App 的安装页面/installations/new引导用户完成安装。Manifest 的构造细节见 GithubCreateAppServer.ts#L115-L141default_events[create, delete, push, repository]default_permissions恒为metadata: read勾选members时追加members: read勾选read时追加contents: read、checks: read勾选write时追加contents: write、actions: writechecks保持readname默认为Backstage-changeme需创建后自行修改public: false默认私有redirect_url指向本地回调地址hook_attributes.url指向自动生成的https://smee.io/随机ID且active: false仅供本地开发使用目前 Backstage 没有任何模块消费该 webhook。4. 凭据文件生成与落盘回调成功后命令以github-app-slug-credentials.yaml为文件名把配置写入仓库根目录通过targetPaths.resolveRoot见 index.ts#L78-L81并在文件头部写入一行# Name: name注释便于识别。随后终端会打印两条重要提示文件写入成功青色高亮文件名该文件包含敏感凭据不应提交到版本控制必须谨慎保管黄色高亮。四、生成的凭据文件结构从GithubAppConfig类型定义GithubCreateAppServer.ts#L36-L45可以确认落盘 YAML 包含以下字段字段说明appIdGitHub App 的应用 IDslugApp 的 slug仅用于文件名命名不写入配置主体nameApp 名称写入文件头注释# Name:webhookUrl指向 smee.io 的 webhook 地址默认停用clientIdOAuth Client IDclientSecretOAuth Client SecretwebhookSecretWebhook 签名密钥privateKeyApp 私钥PEM 格式供 Backstage 签名 JWT生成的凭据文件形如# Name: Backstage-changeme appId: 123456 clientId: Iv1.xxxxxxxxxxxx clientSecret: xxxxxxxxxxxxxxxx webhookSecret: xxxxxxxxxxxxxxxx privateKey: | -----BEGIN RSA PRIVATE KEY----- ...Key content... -----END RSA PRIVATE KEY-----五、将凭据接入 app-config.yaml命令执行完毕后终端会直接打印推荐写法在app-config.yaml的integrations.github下通过$include引用生成的凭据文件index.ts#L90-L97integrations: github: - host: github.com apps: - $include: github-app-backstage-credentials.yaml官方文档 github-apps.md 还补充了两种替代方式方式一环境变量注入适合密钥托管场景integrations: github: - host: github.com apps: - appId: ${AUTH_ORG_APP_ID} clientId: ${AUTH_ORG_CLIENT_ID} clientSecret: ${AUTH_ORG_CLIENT_SECRET} privateKey: ${AUTH_ORG1_PRIVATE_KEY} webhookSecret: ${AUTH_ORG_WEBHOOK_SECRET}方式二限制安装归属可选——通过allowedInstallationOwners白名单限定 Backstage 可见的 App 安装配置多个 App 时还能带来 URL 选择上的小性能收益appId: app id allowedInstallationOwners: [GlobexCorp] clientId: client id clientSecret: client secret webhookSecret: webhook secret privateKey: | -----BEGIN RSA PRIVATE KEY----- ...Key content... -----END RSA PRIVATE KEY-----文档特别强调apps是数组可以为不同的 GitHub 组织各配置一个 App同组织内不支持多个 Backstage App见下文注意事项凭据文件高度敏感切勿提交到版本控制。六、GitHub Enterprise 的手动创建方式create-github-app命令目前不支持 GitHub Enterprise。原因在源码注释中有明确说明index.ts#L28-L30GHE 不支持通过 Manifest 创建 App。官方文档 github-apps.md 给出 GHE 场景的替代路径在 GitHub Enterprise 控制台按官方指引手动创建 GitHub Application为应用生成私钥手工编写包含以下字段的 YAML 凭据文件注意privateKey的缩进是必须的appId: app id clientId: client id clientSecret: client secret webhookSecret: webhook secret privateKey: | -----BEGIN RSA PRIVATE KEY----- ...Key content... -----END RSA PRIVATE KEY-----七、权限模型与后续维护创建时的默认权限由 Manifest见上文第三节可知命令创建的 App 默认只授予metadata: read、contents: read等最小读取权限。更多权限需要到 GitHub Web 控制台手动调整——Backstage 目前不负责 App 权限的生命周期管理见 github-apps.md 的 Caveats。不同使用场景的权限建议官方文档 github-apps.md 给出了按用途划分的权限清单读取软件组件Contents: Read-only、Commit statuses: Read-only读取组织数据Members: Read-only发布软件模板Administration: Read write创建仓库、Contents: Read write、Metadata: Read-only、Pull requests: Read write、Issues: Read write以及按模板内容可选启用的Workflows、Variables、Secrets、Environments均 Read write。更新权限与审批调整权限的入口是https://github.com/organizations/{ORG}/settings/apps/{APP_NAME}/permissions注意修改权限后App 所有者会收到一封审批邮件必须先经所有者批准变更才会生效。八、注意事项与常见问题排查已知限制Caveats综合官方文档 github-apps.md 与源码注释使用前需了解该认证方式面向组织仓库不面向个人仓库同一 GitHub 组织下不支持安装多个由 Backstage 管理的 GitHub App——Backstage 目前只识别全局组织安装不会遍历所有已注册 App 判断某仓库对应哪个安装App 权限由 GitHub 端管理Backstage 不管理修改需在 GitHub 控制台完成创建的 App 默认私有public: false对 github.com 通常是期望行为若用于 GitHub Enterprise 建议设为公开以跨组织共享命令创建的 App 默认读取权限需要更高权限时需手动到 GitHub 设置中调整webhook 默认停用并指向 smee.io仅用于本地开发目前 Backstage 无模块消费它模块生命周期为experimental不适用于 GitHub Enterprise。常见报错官方文档给出了最典型的故障场景HttpError: This endpoint requires you to be authenticated.该错误内部通常包裹NotFoundError: No app installation found根因是App 没有在你的组织中完成安装。即使通过backstage-cli以组织成员和 App 管理员身份创建了 App它也不会自动安装。你必须是组织的Owner才能在 App 设置页看到Install菜单并手动点击Install完成授权。九、源码级原理CLI 模块如何被发现与执行create-github-app之所以能以backstage-cli create-github-app的形式直接调用依赖 Backstage 的 CLI 模块体系其机制在 05-modules.md 中有完整说明模块发现CLI 启动时会扫描项目根package.json的全部 dependencies 与 devDependencies对每个依赖检查其自身package.json中backstage.role是否为cli-module是则加载该模块并注册其命令默认聚合backstage/cli-defaults将包括 GitHub 模块在内的 13 个默认模块聚合成数组随 CLI 分发。如果项目依赖中找不到任何 cli-moduleCLI 会回退导入backstage/cli-defaults并打印弃用警告该回退未来会被移除建议显式安装依赖自定义与覆盖你可以单独安装backstage/cli-module-*子集或用同路径命令的内部模块覆盖默认模块单独安装的模块优先级更高冲突的默认模块被静默跳过模块注册 API模块本体通过backstage/cli-node的createCliModule构建createCliModule.ts其内部要求传入packageJson用于识别模块名并通过init回调把命令注册进commands列表。从架构上CLI 模块体系横跨三个包backstage/cli主入口与模块发现、backstage/cli-nodecreateCliModule、runCli与CliModule/CliCommand/CliCommandContext等公共类型、backstage/cli-defaults默认模块聚合。backstage/cli-module-github即是在这套体系上以极薄的一层命令注册 一个交互式命令实现挂载上去的。十、相关文档与延伸阅读模块官方文档module-github.mdCLI 模块体系总览05-modules.mdCLI 全部命令索引03-commands.mdGitHub App 认证集成完整指南github-apps.md命令实现源码create-github-app/index.ts、GithubCreateAppServer.ts模块演进记录CHANGELOG.md其中 v1.38.0 将create-github-app从主 CLI 拆分为独立模块、v1.49.0 完成模块首个正式发布、v1.3.0 将权限选择升级为带说明的多选并加入members权限【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考