🐙
Node.jsからGitHubにファイルを作成または更新する
Node.jsからGitHub APIを使ってGitHub上にファイルを作成、または既存のファイルを更新する具体的な手順を解説します。
APIクライアント
Node.js用のGitHub APIの公式クライアントは octokit/rest.js です。リファレンスは こちら。
ファイルの作成または更新には、 octokit.repos.createOrUpdateFile()
を使います。
ファイルの新規作成
ファイルの新規作成の場合は、必須のパラメータは
-
owner
(リポジトリのオーナー名) -
repo
(リポジトリ名) -
path
(ルートからのファイルパス。先頭に/
は不要) -
message
(コミットメッセージ) -
content
(ファイルの内容。Base64エンコードした文字列として渡す)
です。
Node.jsで文字列をBase64エンコードするには、 Buffer
クラス を使います。
具体的なコードは以下のようになるでしょう。
octokit.repos.createOrUpdateFile({
owner: 'owner-name',
repo: 'repo-name',
path: 'path/to/file',
message: 'commit message',
content: Buffer.from('file content').toString('base64'),
})
既存ファイルの更新
既存ファイルの更新の場合は、 owner
repo
path
message
content
に加えて、
-
sha
(更新対象ファイルのファイルハッシュ値)
が必須となります。
なので、先に octokit.repos.getContents()
を使ってファイルハッシュ値を取得する必要があります。
octokit.repos.getContents({
owner: 'owner-name',
repo: 'repo-name',
path: 'path/to/file',
})
ただし、指定したパスにファイルが存在しない場合は404でエラーになってしまうので、以下のように404を無視して処理を続行するような実装が必要です。
let file
try {
file = await octokit.repos.getContents({
owner: 'owner-name',
repo: 'repo-name',
path: 'path/to/file',
})
} catch (e) {
if (e.status !== 404) {
throw e
}
file = null
}
octokit.repos.createOrUpdateFile({
owner: 'owner-name',
repo: 'repo-name',
path: 'path/to/file',
message: 'commit message',
content: Buffer.from('file content').toString('base64'),
sha: file ? file.data.sha : null,
})
See also
拙作の esa2github に 実際のコードがある ので、あわせて参考にしてみてください✋
Discussion