概要
GitHubにてバッチで更新するリポジトリが何個かありましたが、毎回手動で実行してパスフレーズを入力していたものがあったので、自動化してみました。
GitHubからのCloneの種類
GitHubからCloneするときには3種類の方法があります。
SSH
git clone git@github.com:ch32-riscv-ug/CH32V103.git
デフォルトはSSHで上記のようなコマンドになります。普段はこちらを使っているのですが、事前に公開鍵をGitHubに登録してからの鍵認証になります。ポリシーとして毎回手打ちでパスフレーズを入力しているので自動化には使えません。
GitHub CLI
gh repo clone ch32-riscv-ug/CH32V103
GitHub CLIを使うと上記のようなちょっと違ったコマンドになります。通常のgit系の操作の他にGitHub特有の操作がCLIから実行可能になります。認証などもいい感じに処理してくれるのですが自動化にはちょっと向いていない気もします。
HTTPS
git clone https://github.com/ch32-riscv-ug/CH32V103.git
最後はHTTPSです。SSHと同じようなコマンドですが結構差があります。まずSSHはキーにパスフレーズを設定しているので、cloneするだけでもパスフレーズの入力が必要になります。
HTTPSだとcloneにはパスフレーズが必要なく、git pushなど変更があるときに認証が求められます。
Windowsの場合には上記のような画面がでてきます。
ブラウザー認証
ブラウザーを選択するとそのままGitHubのログイン画面に飛ぶか、現在ログイン中の認証をそのまま使います。非常に便利なのですがCLIで使っているLinuxだと利用できません。
Sine in with a code
上記のような画面がでてきて、このコードを
他のマシンなどでログインしている状態で「https://github.com/login/device」でコードを入力することでもログインできるようでした。
さらにコード入力の画面も閉じるとCLI画面からのログインが出てきました。今回はこちらも使いません。普通にユーザーログインすると全権限になって、自動化したいリポジトリだけに制限が面倒です。
トークンでのログイン
今回はトークンを使ってみたいと思います。ちなみにCLIの場合にはパスワードにトークンをそのままいれることでトークンでのログインができます。
トークンとは?
Settingの一番下にある「Developer setting」にあります。
2種類トークンがありますが、新しい方の「Fine-grained personal access tokens」を使ってみました。
重要なことはトークンには有効期限があることです。通常は90日ぐらいで、最長1年までになります。延長は可能ですので、残りが少なくなってくると延長するかの確認メールがGitHubから飛んできます。
あとはOrganizationが違うと別のトークンに分離する必要があります。私は個人用とCH32用の2つあるのでトークンも分離してしまっています。
そしてリポジトリは全部も指定可能ですが、自動更新するものだけに絞っています。Organizationの場合にはデフォルト設定だとトークンが許可されていないのでOrganization側の設定でトークンを許可をするところから必要でした。
重要なのは権限です。通常はmetadataの読み込みは許可されていますので、追加でContentsに書き込み権限を付けてあげることでコミットが可能になります。
ちなみにトークンは作成時にしか表示されませんので、なくした場合には再発行になりますので注意してください。
トークンでログインしてみる
git clone https://github.com/ch32-riscv-ug/CH32V103.git
cd CH32V103
git push
上記を実行するとログインができます。
Username for 'https://github.com': git
Password for 'https://git@github.com': [発行されたgithub_pat_ではじまる文字列]
上記でログイン可能です。「Everything up-to-date」と更新するものがないと表示されれば成功です。Usernameは何を入力しても大丈夫なのでgitか自分のアカウント情報を設定するのが良いと思います。
再度git pushしてみる
たぶんまたログインをするか聞かれたと思います。
git config --global credential.helper store
デフォルトでは認証情報を保存しない設定になっています。storeに変更すると保存されるようになります。この状態でgit pushなどをしてログインをすると保存されます。
cat ~/.git-credentials
上記の場所に保存されていると思います。なんと平文でパスワードが書かれています。パーミッション的には自分以外からは読み取りできないはずですが気を付けて管理しましょう。
複数のトークンを使い分ける
さて、トークンを使っての自動認証ができるようになったのですが、トークンの使い分けができません。local設定も私のバージョンだとできなかったのでglobal設定でGitHubで同じユーザー名の場合には最初にも使ったものを強制的に利用してしまう動きでした。
ユーザーを分離する
たぶんいちばん簡単なのはバッチ処理用のユーザーをトークン別に作って管理することです。これ一番確実な気がします。
認証ファイルを指定する
git config --global credential.helper store --file ~/.git-credentials-ch32
storeのオプションでファイル名指定ができるようなのですが私の使っている環境のgitが古いのかエラーになりました。
認証ファイルを都度コピーする
\cp -rfvp ~/.git-credentials-ch32 ~/.git-credentials
はい。すばらしいソリューションです。対象のリポジトリを触る前に.git-credentialsを上書きして、トークンを入れ替えています。
まとめ
トークンを使って、特定のリポジトリのみパスコードなしで自動更新できるようになりました。本来はGitHub Actionsとかを使ったほうがいいかもしれませんがまずは手元のサーバーから自動実行できるようにしてみました。
コメント