在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はとっても多機能だけど、使いこなせると便利そうですね