背景
GitHubのRaw URLみたいな感じが一番理想でした。
以前はGitBucketを使っており、こちらはプライベートリポジトリで認証が必要でもGitHub互換APIのおかげで取れました。
そしてAzure Reposに移ることになりそうだったので、調べてみました。
Rest APIを使う
Rest APIでファイルの内容の取得もできます
See: https://docs.microsoft.com/ja-jp/rest/api/azure/devops/git/items/get?view=azure-devops-rest-4.1
# 最小限スタイル
https://dev.azure.com/組織名/_apis/git/repositories/リポジトリID/items?path=ファイルパス&api-version=4.1
# プロジェクト名を指定すると、リポジトリはIDではなくリポジトリ名で取れます(ドキュメントには書いてない模様)
https://dev.azure.com/組織名/プロジェクト名/_apis/git/repositories/リポジトリ名/items?path=ファイルパス&api-version=4.1
ちなみに、ブランチ名がない場合はデフォルトブランチになります。また、ファイルパスは/
始まりで、たとえばよく一番上にあるREADME.md
なら、/README.md
のようになります。
(download=true
も付けたほうがよさそうだけど、有無の違いがよくわからなかった…Acceptヘッダーで動きが変わるかも?)
ブランチ名かコミットIDを指定をしたい
versionDescriptor.version=ブランチ名
をクエリに足します。タグ名やコミットIDでも良いです。
https://dev.azure.com/組織名/プロジェクト名/_apis/git/repositories/リポジトリ名/items?path=ファイルパス&versionDescriptor.version=ブランチ名&api-version=4.1
そもそもrepositoryId(リポジトリID)はどこで見れるのか
リポジトリの一覧を取るRest APIがあるので、これで見れます。
https://dev.azure.com/組織名/プロジェクト名/_apis/git/repositories?api-version=4.1
JSONでリポジトリの数だけリストが返ってくるので、いい感じに読み解くと得られます。
一応、画面から見る方法があります。(今後も見れるかどうかは不明)
プロジェクトを開き、Project Setting → Code > Repositories → リポジトリ名の順に選択し、アドレスバーのURLを見る。
私はRest APIの存在を知った後にもかかわらず、愚かにも画面上から探して見つけました。
Privateリポジトリの場合は?
Privateリポジトリに対する操作について、ブラウザ上の場合はCookieが覚えてくれていると勝手に処理されるので気にせずとも使えます。しかし、curl等で使いたい場合は、認証情報を渡す必要があります。でも、個人の認証情報は気が引けますよね。
そこで、Personal Access Token(PAT)を発行することで、それを自分の認証情報の替わりとして使えます。
See: https://docs.microsoft.com/ja-jp/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=tfs-2017
設定方法は上記を見ていただくとして、権限を選択について。
Azure Reposなら「Code」の「Read」権限だけつければGitリポジトリの読み取りができます。許可する権限は必要最小限で行きましょう。
-
※PATの有効期間は最大で1年先までしか指定出来ないので注意が必要です
- 7日前には通知が来るようです
- 個人に紐づきます
- 有効期間の更新は一応できそうです
個人につくのと、期限の縛りが辛いので、プロジェクトorリポジトリ単位で作れないか、サービスプリンシパルが使えないか、とか他の方法がないか調べていますが、今のところなさそうです。「チーム用のユーザ」を作るしかないのか…?
それはともかく、使い方はこんな感じです。Basic認証の要領でいけます。
git cloneする例
git clone https://トークン名:トークン値@dev.azure.com/組織名/プロジェクト名/_git/Gitリポジトリ名
Rest APIで/README.md
コンテンツを得る例
curl https://トークン名:トークン値@dev.azure.com/組織名/_apis/git/repositories/リポジトリID/items?path=/README.md&api-version=4.1
終わり
ファイアウォールの都合でPull型のデプロイを採用しているため、こういうことがしたくなるんですが、あまり聞きませんね・・・デプロイの仕方については全然知見がない。
あと、PATの有効期間については、漏洩のリスクとかを考えての設定だと思うのですが、更新忘れで使えなくなるリスクのほうが現実的にはありそうなので、無期限も選べるようにして欲しい・・・。それに、サービスプリンシパルなら事実上の無期限を選べますよね。この差はなんだ?納得いかんぞ!