🐙

Node.jsからGitHubにファイルを作成または更新する

2020/05/26に公開

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実際のコードがある ので、あわせて参考にしてみてください✋

GitHubで編集を提案

Discussion