在NodeJS中通过GitHub创建分支、提交变更并创建拉取请求

我稍微调查了一下,想知道能不能自动化。

想做的事情 zuò de

    • branchの作成

 

    • ファイルの更新・コミット

 

    pull-reqの作成

用NodeJS调用GitHub

使用 @octokit/rest 库。

GitHub的REST API的Node接口。
据说是从node-github迁移过来的。

文档

以下是API的文档链接:
https://octokit.github.io/rest.js/

然而,实际上它是GitHub API的封装,所以最好边进行比较边进行操作。

调试模式

要启用额外的调试日志,请将DEBUG设置为octokit:rest*。

听说只要设置环境变量就可以了。

试一试

初始化

import Octokit from '@octokit/rest'

const octokit = new Octokit()

在企業環境中,可能需要進行一些設定,但由於我們不是企業,所以不需要進行設定。

驗證

为了访问私有仓库和部分 API,需要进行身份验证。
虽然 ocktokit 提供了几种身份验证方法,但本次操作假定已经获取到了访问令牌,因此使用 AccessToken 进行操作。

需要通过官方渠道颁发AccessToken,或者使用OAuth来获取。
例如,使用koa+passport进行GitHub认证。

如果有AccessToken,只需要调用authenticate函数。

octokit.authenticate({
  type: 'token',
  token: accessToken,
})

没有特别的返回值。

请参考以下链接:https://github.com/octokit/rest.js#authentication

获取参考资料

换句话说,我们需要获取要创建分支的基于的分支的信息。

const origin = await octokit.gitdata.getReference({
  owner: 'rymizuki',
  repo: 'example',
  ref: 'heads/master',
})

我们在这里处理的只是参考资料,因此是指heads/分支名称。

请参考:https://octokit.github.io/rest.js/#api-Gitdata-getReference

创建参考

从已获取的参考资料中新建一个参考资料。

const ref = await octokit.gitdata.createReference({
  owner,
  repo,
  ref: 'refs/heads/test',
  sha: origin.data.object.sha,
})

从原来的分支SHA派生出来。
ref必须满足“以refs开头并且包含两个或更多”这个限制。

另外,如果尝试创建一个同名的参考资料,会出现错误。

请参考: https://octokit.github.io/rest.js/#api-Gitdata-createReference

获取文件

由于本次需求是“覆盖更新已存在的文件”,所以需要获取该文件。

const content = await octokit.repos.getContent({
  owner,
  repo,
  ref: 'heads/test', // さっき作ったブランチの情報をとってくる
  path: 'README.md', // ファイルパス
})

// とってきたデータをデコードする
const data = new Buffer(content.data.content, content.data.encoding).toString()

请参考以下链接获取更多详细信息:https://octokit.github.io/rest.js/#api-Repos-getContent。

文件的更新

通过调用以下API,可以在GitHub上发送文件并创建一个commit,然后提交(push)。

const updateResult = await octokit.repos.updateFile({
  owner,
  repo,
  branch: 'test', // これはreferenceではなくbranch
  message: 'docs(README): なんやかんや', // コミットメッセージ
  path: 'README.md',
  content: new Buffer(`${ data }\n\n更新したよ`).toString('base64'), // base64にエンコードする
  sha: content.data.sha,
})

请参考此链接:https://octokit.github.io/rest.js/#api-Repos-updateFile

创建PullRequest

const pullreq = await octokit.pullRequests.create({
  owner,
  repo,
  head: 'test', // マージしたいブランチ
  base: 'master', // マージされたいブランチ
  title: 'README.mdを更新した', // pull-reqのタイトル
  body: 'ほにゃらら', // pull-reqの本文
})

请参考:https://octokit.github.io/rest.js/#api-PullRequests-create

总结

    • ブランチの作成からPullReqの作成までの流れを紹介しました

 

    • authenticateはaccessToken使っとくのが一番わかり易い

 

    • refarenceとheadとbranchの関係を理解して使おう

 

    GitHub APIはとっても多機能だけど、使いこなせると便利そうですね
广告
将在 10 秒后关闭
bannerAds