Github ActionsでGITHUB_TOKEN以外を使用する
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
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の取得方法
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
GITHUB_TOKENを書き換えてもダメっぽい
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
checkoutと同時にtokenがセットされるらしいので、checkoutをappのtokenにすればできるかもしれない。
本来自己リポジトリのcheckoutはGITHUB_TOKENでできるのに余計な権限を付ける事になるのが気持ち悪い
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
そもそもcheckout時にtokenセットしても同じエラー
checkout時のログを見ると.extraheader
を設定することで認証情報をセットしてるもよう
これだとchekoutしたリポジトリ自体はtokenで認証できても、Ansibleで持ってきたいリポジトリには及ばないので当然か。
ログをよく見ると、リポジトリ単体じゃなくて全体の設定になってるのでセットできてる?
いやgit config localだからダメなのか
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
pipenv install
するときにPrivateリポジトリ参照するときも同じ問題が起きそうだけどどうするの?
→.netrc
とやらにセットするらしい
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
Galaxyだとnetrc
かhttp.extraHeader
を使うことになりそう
http.extraHeader
をグローバルで設定すれば行けそうな気がする
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
ちなみにcheckout時にhttp.extraHeader
をセットしないオプションもあるらしい
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
ローカルで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な筈だが何故失敗したのか ↩︎
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
ちなみにローカルでの検証にはbitnami/git
を使用している
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
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取るところがなんかおかしいっぽい
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
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
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
PATとAppから生成するトークンはそもそも形式が違うみたいhttp.extraHeader "Authorization: Bearer $token"
にすれば良さそうだけど失敗する
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
JWT自体を使うんじゃなくて、JWTを使ってアクセストークンとやらを取るらしい
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
Actionの内容的にアクセストークンを取るところまでやってる気がする
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
これで単一リポジトリはCloneできたgit clone https://x-access-token:<token>@github.com/owner/repo.git
![sakojun](https://res.cloudinary.com/zenn/image/fetch/s--AK7thZ8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/7e90294464.jpeg)
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/"