2019年7月19日金曜日

GitLab Runner で Azure Container Registry を使う

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 側の準備

  1. Azure へログイン
  2. リソースグループの作成
  3. コンテナレジストリ作成
  4. サービスプリンシパルの作成

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"
}

appIdpassword をメモしておく。

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 時の UsernamePassword には、先ほどメモした appIdpassword を使用する。

使用するイメージを作成・プッシュ

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_CONFIGFile タイプとして作成し、以下の JSON 文字列を設定する。

{
    "auths": {
        "containerregistryforgitlab.azurecr.io": {
            "auth": "BASE64ED_USERNAME:PASSWORD"
        }
    }
}
  • containerregistryforgitlab.azurecr.io: 作成した Azure Container Registry の URL
  • BASE64ED_USERNAME:PASSWORD: サービスプリンシパルを作成した時にメモした appIdpassword: で繋げた文字列を BASE64 変換した文字列

PowerShell での Base64 への変換方法参考

以下コマンドで変換可能。

$text_byte = ([System.Text.Encoding]::Default).GetBytes("ここに変換したい文字列を入れる")
[Convert]::ToBase64String($text_byte)

Azure Container Registry から Pull する設定を gitlab-ci.yml へ記載

.gitlab-ci.ymlimage で Azure Container Registry のイメージを指定するだけ。

image: containerregistryforgitlab.azurecr.io/hello-world

stages:
    - hello

print_hello:
    stage: hello
    tags:
        - test
    script:
        - echo Hello, World!

.gitlab-ci.ymlpush すると、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

以上。

参考資料

更新履歴

日付 更新内容
2019/7/19 新規作成
2019/7/19 割り当てるべきロールの種類を間違えていたのを修正(Reader -> AcrPull)

0 件のコメント:

コメントを投稿