GitLab Runner が使うイメージを管理するのに Azure Container Registry を使いたい。
諸事情により GitLab Container Repository が使えない。
前提
- 以下の環境が構築済みであること
Azure CLI 用のコンテナ準備
Azure CLI 用のコンテナを起動し、 Docker をインストールする。 必要に応じてこの作業の結果をイメージ化するのが良さそう。
Azure CLI 用のコンテナ起動
docker run -it --rm -v "/var/run/docker.sock:/var/run/docker.sock" microsoft/azure-cli
Docker のインストール
apk update
apk add docker
Azure 側の準備
- Azure へログイン
- リソースグループの作成
- コンテナレジストリ作成
- サービスプリンシパルの作成
GitLab Runner から Azure Container Registry を使用するためには「4.」が必須となる。 (対話的に push, pull するだけなら「3.」までで良い)
Azure へログイン
# az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code xxxxxxxxx to authenticate.
[
{
"cloudName": "AzureCloud",
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"isDefault": true,
"name": "Pay-As-You-Go",
"state": "Enabled",
"tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"user": {
"name": "USER@COMPANY.onmicrosoft.com",
"type": "user"
}
}
]
https://microsoft.com/devicelogin
へアクセスして code を入力する。
リソースグループの作成
# az group create --name MyGitLab --location japaneast
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyGitLab",
"location": "japaneast",
"managedBy": null,
"name": "MyGitLab",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": null
}
コンテナレジストリの作成
# az acr create --resource-group MyGitLab --name ContainerRegistryForGitLab --sku Basic
{
"adminUserEnabled": false,
"creationDate": "2019-07-14T12:29:14.193071+00:00",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyGitLab/providers/Microsoft.ContainerRegistry/registries/ContainerRegistryForGitLab",
"location": "japaneast",
"loginServer": "containerregistryforgitlab.azurecr.io",
"name": "ContainerRegistryForGitLab",
"networkRuleSet": null,
"provisioningState": "Succeeded",
"resourceGroup": "MyGitLab",
"sku": {
"name": "Basic",
"tier": "Basic"
},
"status": null,
"storageAccount": null,
"tags": {},
"type": "Microsoft.ContainerRegistry/registries"
}
サービスプリンシパルの作成
# az ad sp create-for-rbac --name GitLabRunner
Changing "GitLabRunner" to a valid URI of "http://GitLabRunner", which is the required format used for service principal names
Retrying role assignment creation: 1/36
Retrying role assignment creation: 2/36
Retrying role assignment creation: 3/36
{
"appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"displayName": "GitLabRunner",
"name": "http://GitLabRunner",
"password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
appId
と password
をメモしておく。
az ad sp list --display-name GitLabRunner
で、作成したサービスプリンシパルの情報を確認できる。
サービスプリンシパルへのロール設定
ロール設定
GitLab Runner は、読み込み権限しか必要ないはずなので、 AcrPull
のロールを割り当てる。
次のコマンドで、 新規ロール(AcrPull
)の追加とデフォルトのロール(Contributor
)の削除を行う。
az role assignment create --assignee APP_ID --role AcrPull
az role assignment delete --assignee APP_ID --role Contributor
APP_ID
: メモしたappId
az role assignment list
で、結果の確認ができる。
ロール設定の確認
docker login
した後に docker push
で失敗することを確認。
# docker login containerregistryforgitlab.azurecr.io
# docker push containerregistryforgitlab.azurecr.io/hello-world
The push refers to repository [containerregistryforgitlab.azurecr.io/hello-world]
6f9c9be2140a: Layer already exists
errors:
denied: requested access to the resource is denied
unauthorized: authentication required
docker login
時の Username
と Password
には、先ほどメモした appId
と password
を使用する。
使用するイメージを作成・プッシュ
Dockerfile 作成
FROM debian:buster-slim
LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="v1.0.0"
LABEL description "print 'Hello, World!!!'"
CMD ["echo", "Hello, World!!!"]
ビルド
docker build -t containerregistryforgitlab.azurecr.io/hello-world .
Push
現在は、リードオンリーなサービスプリンシパルでログインしている状態なので、 いったんログアウトして az acr login
でログインしなおす。
az acr login --name ContainerRegistryForGitLab
docker push containerregistryforgitlab.azurecr.io/hello-world
az acr login
で失敗する場合には、 az login
からやり直すと良いかもしれない。
GitLab Runner の設定
GitLab に環境変数を登録
DOCKER_AUTH_CONFIG
を File
タイプとして作成し、以下の JSON 文字列を設定する。
{
"auths": {
"containerregistryforgitlab.azurecr.io": {
"auth": "BASE64ED_USERNAME:PASSWORD"
}
}
}
containerregistryforgitlab.azurecr.io
: 作成した Azure Container Registry の URLBASE64ED_USERNAME:PASSWORD
: サービスプリンシパルを作成した時にメモしたappId
とpassword
を:
で繋げた文字列を BASE64 変換した文字列
PowerShell での Base64 への変換方法参考
以下コマンドで変換可能。
$text_byte = ([System.Text.Encoding]::Default).GetBytes("ここに変換したい文字列を入れる")
[Convert]::ToBase64String($text_byte)
Azure Container Registry から Pull する設定を gitlab-ci.yml
へ記載
.gitlab-ci.yml
の image
で Azure Container Registry のイメージを指定するだけ。
image: containerregistryforgitlab.azurecr.io/hello-world
stages:
- hello
print_hello:
stage: hello
tags:
- test
script:
- echo Hello, World!
.gitlab-ci.yml
を push
すると、GitLab Runner による CI が実行される。
検証の後片付け
各リソースの消し方確認もかねて、丁寧に一つずつ削除していく。
サービスプリンシパルの削除
az ad sp delete --id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
--id
: サービスプリンシパルを作成した時にメモしたappId
を指定
Azure Container Registry の削除
az acr delete --resource-group MyGitLab --name ContainerRegistryForGitLab
リソースグループの削除
az group delete --name MyGitLab
以上。
参考資料
- Docker Compose で GitLab + GitLab Runner の環境を整える - mikoto2000 の日記
- Azure Container Registry を使う - mikoto2000 の日記
- サービス プリンシパルによる Azure Container Registry 認証 | Microsoft Docs
更新履歴
日付 | 更新内容 |
---|---|
2019/7/19 | 新規作成 |
2019/7/19 | 割り当てるべきロールの種類を間違えていたのを修正(Reader -> AcrPull ) |
0 件のコメント:
コメントを投稿