Github ActionsでGITHUB_TOKEN以外を使用する
checkout時に別のtokenを使う方法
- name: Checkout private tools
uses: actions/checkout@v3
with:
repository: my-org/my-private-tools
token: ${{ secrets.GH_PAT }} # `GH_PAT` is a secret that contains your PAT
path: my-tools
他のstepで別のtokenを使う方法
分からない
ユースケース
ansible-galaxy install -r requirements.yml
で別のPrivateリポジトリから取得したい(Publicリポジトリから取得できることは確認済み)
tokenの取得方法
GITHUB_TOKENを書き換えてもダメっぽい
checkoutと同時にtokenがセットされるらしいので、checkoutをappのtokenにすればできるかもしれない。
本来自己リポジトリのcheckoutはGITHUB_TOKENでできるのに余計な権限を付ける事になるのが気持ち悪い
そもそもcheckout時にtokenセットしても同じエラー
checkout時のログを見ると.extraheader
を設定することで認証情報をセットしてるもよう
これだとchekoutしたリポジトリ自体はtokenで認証できても、Ansibleで持ってきたいリポジトリには及ばないので当然か。
ログをよく見ると、リポジトリ単体じゃなくて全体の設定になってるのでセットできてる?
いやgit config localだからダメなのか
pipenv install
するときにPrivateリポジトリ参照するときも同じ問題が起きそうだけどどうするの?
→.netrc
とやらにセットするらしい
Galaxyだとnetrc
かhttp.extraHeader
を使うことになりそう
http.extraHeader
をグローバルで設定すれば行けそうな気がする
ちなみにcheckout時にhttp.extraHeader
をセットしないオプションもあるらしい
ローカルでhttp.extraHeader
を使用してpullできることは確認した[1]
$ b64_token=$(echo -n "${token}" | base64)
$ git config --global http.extraHeader "Authorization: Basic ${b64_token}"
$ git clone target-repo
同じことをGithub Actionsでやると失敗する。checkout時の設定のほうが優先されてる?[2]
→できた
もっと具体的なURLを指定すればいいかと思ったが、そもそもローカルでcheckoutと同様にセットしても認証できなかった
git config --global http.https://github.com/.extraheader "Authorization: Basic ${b64_token}"
↓と同じようなことをしようとしてるだけなのになぜ・・・?
→なんかGitHub Actions上だといけた
-
Azureのドキュメントのコマンドだと余計なコロンが入ってて失敗した。なんでそういう記述になってるのか不明 ↩︎
-
git config --local
が効いているのだとすれば、checkoutをtoken使ってやればOKな筈だが何故失敗したのか ↩︎
ちなみにローカルでの検証にはbitnami/git
を使用している
GitHub Actions上でPATを使って認証するのをちゃんと試してなかったのでPATに変えてみたところ成功した
- name: Set app token
run: |
b64_token=$(echo -n "${{ secrets.TMP_PAT }}" | base64)
git config --global http.extraheader "Authorization: Basic ${b64_token}"
git clone target-repo
http.extraheader
を使えばできるのは合ってたけど、GitHub Appからtoken取るところがなんかおかしいっぽい
GitHub Actions上だとhttp.https://github.com/.extraheader
指定でもいけた
なんでローカルで失敗したのか不明
- name: Set app token
run: |
b64_token=$(echo -n "${{ secrets.TMP_PAT }}" | base64)
git config --global http.https://github.com/.extraheader "Authorization: Basic ${b64_token}"
git clone target-repo
PATとAppから生成するトークンはそもそも形式が違うみたいhttp.extraHeader "Authorization: Bearer $token"
にすれば良さそうだけど失敗する
JWT自体を使うんじゃなくて、JWTを使ってアクセストークンとやらを取るらしい
Actionの内容的にアクセストークンを取るところまでやってる気がする
これで単一リポジトリはCloneできたgit clone https://x-access-token:<token>@github.com/owner/repo.git
insteadOfを設定したらいけた
- name: Set app token
run: |
git config --global url."https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/".insteadOf "https://github.com/"