BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

GitHub-hosted runner を Azure の閉域ネットワークに入れる為に必要な databaseId 取得の Tips

GitHub Actions の GitHub-hosted runner を Azure の private network に繋げて閉域ネットワークで CI/CD の実現が可能です。
これを構成する際に必要な情報の一つが GitHub 側の databaseId です。

ドキュメントだと curl で Graph QL たたけとしか書いてないので、もう少し楽に取得できる方法のメモです。

あとは、GitHub-hosed runner に Azure の private network を紐づける際に、Organization レベルで構成する方法と Enterprise レベルで構成して Enterprise 配下の Organization を跨いで利用する2パターンがあります。
それに合わせて Organization の databaseId を使うのか Enterprise の databaseId を使うのかが異なりますので、両方の取得方法を記載してます。

1. GitHub の GraphQL Explorer を使って取得

GitHub の GraphQL Explorer を使うことが可能な環境であれば、認証周りを楽できるので最もシンプルです。

以下にアクセスします。

docs.github.com

画面右側にある "Sign in with GitHub" をクリックしてログインします。

Org の databaseId 取得

ドキュメント通りですが query のところに以下を入力します。

query(
  $login: String!
){
  organization (login: $login)
  {
    login
    databaseId
  }
}

下部の Variables に以下のように json を書きます。database Id を確認したい GHEC の organization が test-org の場合は以下のようになります。

{
  "login": "test-org"
}

これで右側に databaseId が表示されます。

Enterprise の databaseId 取得

こちらもドキュメント通りですが query のところに以下を入力します。

query(
  $slug: String!
){
  enterprise (slug: $slug)
  {
    slug
    databaseId
  }
}

下部の Variables に以下のように json を書きます。database Id を確認したい Enterprise アカウントが test-enterprise の場合は以下のようになります。

{
  "slug": "test-enterprise"
}

これで実行すると右側で databaseId が取得できます。

2. GitHub CLI での取得

private なネットワーク内だと上記の方法が使えないケースも出てきそうなので、そんな時は素直に GitHub CLI を使うのがいいかもです。

organization の databaseId 取得するなら curl に比べて認証の手間が少ないのでそこが利点ですかね。まーそれ以前に GitHub CLI は GitHub の管理者であれば何かと便利に利用できるからみんな使っているはずだから書いて無駄はないはず...と。

docs.github.com

GitHub CLI でログイン

以下のコマンドでログインができます。ログインはブラウザからのログイン、または Personal Access Token (Classic) (以降 PAT と略します) でのログインの2択です。

gh auth login

以下のコマンドで、現在ログインしているステータスが見れます。

gh auth status

この時どのパーミッションが割り当てられているかが重要になります。

  • Org の databaseId を取得したい場合:
    • read:org が必要ですが、gh auth login コマンド実行時、ブラウザーからのログインだと付与されているはずなので問題ないです。
    • この場合は PAT を取得する手間がいらないので楽です。
  • Enterprise の databaseId を取得したい場合:
    • これは read:enterprise を割り当てた PAT を作成し、それを使ってログインする必要があります。詳しくは後述します。

read:enterprise スコープの Personal access token (Classic) でログインする場合

Enterprise の databaseId を取得したいに read:enterprise のスコープ (ようは権限) が必要になります。
しかしブラウザーから自分の GitHub account でログインしても read:enterprise は付与されていません。
そのため、read:enterprise のスコープを持った PAT を利用する必要があります。
その作成方法は注意点がありますのでここで説明していきます。

まずは、以下の手順で PAT の作成画面に進みます。

  • GitHub の右上の自分のアバターアイコンをクリック → Settings → Personal access tokens → Tokens (classic) をクリック
  • "Generate new token → Generate new token (classic) から作成します。

gh auth login 用に PAT を作成する際の注意点として、Scopes には最小限のものがあるため、read:enterprise のトークンを作成するには以下3つの scope が必要です。

  • repo
  • read:org
  • read:enterprise

これで gh auth login 時に聞かれる "How would you like to authenticate GitHub CLI?" を **Paste an authentication token" にして進めて、作成した PAT を使えば OK です。

ログイン後に gh auth status を実行すると read:enterprise が付与された状態が確認できます。

databaseId の取得

ログインしたら databaseId 取得のコマンドを実行します。まー curl でやるのとほぼ変わりませんが😎。

org の databaseId 取得

例えば org の名称が "test-org" だったら以下のコマンドで取得できます。

gh api graphql -f query='{ organization(login: "test-org") { databaseId }}'

Enterprise の databaseId 取得

前述のとおり前提として PAT を作ってログイン後、gh auth status をたたいて read:enterprise が付与された状態が確認できていれば先に進めます。

org の時と query がちょっと異なります。例として enterprise が "test-enterprise" の場合は、以下で取得できます。

gh api graphql -f query='{ enterprise(slug: "test-enterprise") { databaseId }}'

参考