はじめに
Azure Container Apps Jobを使って、GitHub ActionsのSelf-Hosted Runnerを動かします。
導入方法については公式チュートリアルがあるため、これに沿って進めることで基本的には実装可能です。
ただし、以下の点についてはチュートリアル上で言及されておらず、実装時に躓きました。
- Organization配下のリポジトリに実装する
- Azure Portal上の操作で実装する
そこで、本記事ではこれらをポイントとしつつ、導入方法について紹介していきます。
実装手順
前提
以下が作成されていることを前提とします。
- リソースグループ
- ワークフローを実行するためのGitHubリポジトリ
実装手順
前提
以下が作成されていることを前提とします。
- リソースグループ
- ワークフローを実行するためのGitHubリポジトリ ※Organization配下
PATの生成
リポジトリにSelf-Hosted Runnerを登録する手順は、リポジトリの [Setting] > [Actions] > [Runners] > [New self-hosted runner] から確認できます。
その中で、以下のようにconfig.shを実行するのですが、この時「OrganizationにRunnerを登録するためのToken」が必要になります。
Tokenの値はREST API経由で取得できます。
GitHub REST API - Create a registration token for an organization
この際、必要な権限を付与したPATが必要になるので、以下の流れに沿ってPATを作成します。
ポイントは以下です。
■ Resource owner
対象リポジトリのOrganizationを指定してください。
※事前にPATがOrganizationにアクセスすることを許可する必要があります。
■ Repository access
[Only select repositories] から対象リポジトリを選択してください。
■ Permissions
以下の権限を追加します。
permission | access |
---|---|
Actions | Read-only |
Administration | Read and write |
Metadata | Read-only |
■ Organization permissions
以下の権限を追加します。
permission | access |
---|---|
Administration | Read and write |
Custom organization roles | Read and write |
Self-hosted runners | Read and write |
[Generate token] を押下するとトークンが発行されます。
表示された文字列を控えておきます。
ランナーのコンテナイメージのビルド
ACA Jobs上でSelf-Hosted Runnerを動かすために、コンテナレジストリの作成と、コンテナーイメージのビルド及びレジストリへのプッシュを行います。
1. コンテナレジストリの作成
az acr create --name "$CONTAINER_REGISTRY_NAME" --resource-group "$RESOURCE_GROUP" --location "$LOCATION" --sku Basic --admin-enabled true
上記のコマンドと同じことをPortal上で行います。
作成画面まで進んだら、[基本] タブでサブスクリプション、リソースグループ、レジストリ名、ロケーション、プラン(Basic)をそれぞれ指定して、作成します。
この他、作成したコンテナイメージをAzure Container Apps Jobから参照するために「管理者ユーザの有効化」が必要になります。
コマンドでは--admin-enabled true
で有効化していますが、Portalの場合は作成時に設定ができないため、作成後に [設定] > [アクセスキー] から「管理者ユーザ」を有効化しておきます。
2. イメージのビルド
Runnerのイメージはチュートリアル内で紹介されている以下のリポジトリを使って作成できます。
ただし今回はRunnerに一部カスタマイズを加えたいので、上記のリポジトリを参考に別途リポジトリを作成しました。
作成したら、以下のコマンドを叩いてイメージをビルドします。
az acr build `
--registry "<作成したコンテナレジストリ名>" `
--image github-actions-runner:1.0 `
--file "Dockerfile.github" `
"https://github.com/<作成したリポジトリ>.git"
ビルドの完了後、イメージが作成されていることをPortal上で確認できます。
ランナーのデプロイ
CLIの場合は以下のコマンドでContainer Apps 環境とJobを作成できます。
az containerapp job create -n "$JOB_NAME" -g "$RESOURCE_GROUP" --environment "$ENVIRONMENT"
--trigger-type Event
--replica-timeout 1800
--replica-retry-limit 0
--replica-completion-count 1
--parallelism 1
--image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME"
--min-executions 0
--max-executions 10
--polling-interval 30
--scale-rule-name "github-runner"
--scale-rule-type "github-runner"
--scale-rule-metadata "githubAPIURL=https://api.github.com" "owner=$REPO_OWNER" "runnerScope=repo" "repos=$REPO_NAME" "targetWorkflowQueueLength=1"
--scale-rule-auth "personalAccessToken=personal-access-token"
--cpu "2.0"
--memory "4Gi"
--secrets "personal-access-token=$GITHUB_PAT"
--env-vars "GITHUB_PAT=secretref:personal-access-token" "GH_URL=https://github.com/$REPO_OWNER/$REPO_NAME" "REGISTRATION_TOKEN_API_URL=https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/actions/runners/registration-token"
--registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io"
こちらもPortal上の操作で実行します。
-
[基本] タブで各情報を入力します。
[トリガーの種類] は [イベントドリブン] を選択します。
続いて、Container Apps 環境を作成するために [新規作成] をクリックします。 -
Container Apps 環境の作成画面が開きます。とりあえず環境名だけ入力したら、その他は特にいじらなくて大丈夫です。
-
Jobの作成画面に戻ってきたら、 [コンテナー] タブで各種設定を行います。
-
コンテナ―の詳細
先ほど作成したコンテナレジストリとビルドしたイメージを指定します。
この時、「管理者ユーザの有効化」を行っていない場合はエラーになります。
-
コンテナリソースの割り当て
CPUとメモリを指定します。チュートリアルのコマンドでは「2コア」「4GBメモリ」を指定していたので、その通りに指定しています。 -
環境変数
--env-vars "GITHUB_PAT=secretref:personal-access-token" "GH_URL=https://github.com/$REPO_OWNER/$REPO_NAME" "REGISTRATION_TOKEN_API_URL=https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/actions/runners/registration-token"
名前 値 GH_URL https://github.com/{Oranization名}
REGISTRATION_TOKEN_API_URL https://api.github.com/orgs/{Organization名}/actions/runners/registration-token
今回はリポジトリではなくOrganizationにRunnerを登録するため、チュートリアルとは少し設定値が異なっています。
GITHUB_PAT
は最初に作成したPATを指定しますが、直接入力するのではなく、「シークレット」に保存した上でその値を参照します。ただし、この時点では「シークレット」への保存がPortalからは行えないため、リソースの作成後に設定します。 -
スケールルール
[+ 追加] ボタンからスケールルールを追加できます。--scale-rule-name "github-runner" --scale-rule-type "github-runner" --scale-rule-metadata "githubAPIURL=https://api.github.com" "owner=$REPO_OWNER" "runnerScope=repo" "repos=$REPO_NAME" "targetWorkflowQueueLength=1" --scale-rule-auth "personalAccessToken=personal-access-token"
名前 値 githubAPIURL https://api.github.com
owner Organization名
runnerScope org
targetWorkflowQueueLength 1 各メタデータの意味はgithub-runner スケールルールのドキュメントから確認できます。
OrganizationにRunnerを登録するため、owner
とrunnerScope
の設定値がチュートリアルとは異なっています。また、repos
は設定不要です。
--scale-rule-auth
についてはシークレットに保存したPATを参照する形にしたいのですが、先ほどと同様この時点で設定できないため、リソースの作成後に設定します。
-
-
以上が設定できたらリソースを作成します。
以上でAzure側の設定は完了です。
ワークフロー
GitHub ActionsではJobを実行するランナーを指定することができます。
今回実装したSelf-Hosted Runnerを利用する場合は、runs-on
を以下の通り指定します。
runs-on: self-hosted
実装内容に問題なければActionをスタートするとAzure側でRunnerコンテナが起動して、30秒程度でJobの処理が開始します。