![見出し画像](https://assets.st-note.com/production/uploads/images/124156947/rectangle_large_type_2_22104ec57d270c3a8d2fa0697d1476ba.jpeg?width=1200)
octokitでリポジトリのファイルを更新する(ひとまず成功)
今週は、技術書典のネタ用に作っていたシステムの改良の続きです。前回は、リポジトリに新規ファイルを登録するのはできたけれど、既存ファイルの更新ができていなかったので、それを解決したいと思います。
octokitでリポジトリ更新
技術書典用に作ったシステムでは、ワークフロー内でファイルの差分があればリポジトリにプッシュしていました。これを、ワークフロー内のジョブでGitHubのREST APIを使って更新するように修正します。
octokitでファイルの更新ができなかったのはなぜか?
ワークフロー実行時のエラーを確認すると、shaがnilだと言われていました。
data: {
message: "Invalid request.\n\nFor 'properties/sha', nil is not a string.",
しかし、csvファイルのshaは取得できていました。
![sha=取得できた文字列](https://assets.st-note.com/img/1702194736383-TIGfXz9jPZ.png)
ということは、対象ファイルの取得メソッドの結果のファイル情報が正しく取得できていないということのようです。試しに、ファイル存在確認メソッドをやめて、ファイル更新メソッドの中でファイル情報を取得して、更新するように変更してみました。
// GitHub REST APIでリポジトリのcsvファイルを更新する
async function createOrUpdate(filepath, content){
// 更新内容の読み込み
try{
const octokit = new Octokit({
auth: process.env.MY_PRIVATE_TOKEN,
});
let file;
file = await octokit.repos.getContent({
owner: 'tetrapod418',//'owner-name',
repo: 'GetQRCode',//'repo-name',
path: filepath,//'path/to/file',
});
const sha = !file.data.sha ? "null" : file.data.sha;
console.log(`sha=${sha}`);
// 新規登録または追加
octokit.repos.createOrUpdateFileContents({
owner: 'tetrapod418',//'owner-name',
repo: 'GetQRCode',//'repo-name',
path: 'public/url_list.csv',
message: 'Updated CSV File!',
content: Buffer.from(content).toString('base64'),
sha
});
}
catch(err){
console.error(`${err.message} status=${err.status}`);
};
修正した結果の確認
修正したワークフローを実行してみました。
今度は成功です。
![データの追加ログとshaのログ出力ができているログ](https://assets.st-note.com/img/1702195954472-6ttlpeiL61.png)
リポジトリのurl_list.csvファイルも、更新されていることが確認できました。
![リポジトリのurl_list.csvの更新結果確認できた](https://assets.st-note.com/img/1702196308872-IRDI31I3Zs.png?width=1200)
createOrUpdate(LIST_PATH, content);
期待通りの動作が確認できたけれど、もう少し調べたい
関数を整理した結果、期待した動作ができるようになりました。しかし、元の関数の何が問題だったのか?は解決できていません。今日はここまでにして、次回は、問題の原因を調べてきちんと解決したいと思います。