楽屋

社内 GitLab に push したら Azure Container Registry に push して ChatWork に通知する

はじめに

DATUM STUDIO では GitLab の Community Edition を利用してソースコードを管理しています。 GitLab にも Container Registry が付属しているのですが、あまりサーバーのディスクを増やしたくないので有効にしていません。ではどこにイメージを配置すれば良いのかといえば、社内で特にここだというレジストリーを用意しているわけでもなく、各々のやりたい方法で行っています。実態を調査したことはないのですが、特にレジストリーについて聞かれたこともないので、おそらくみんなローカルでビルドしているのではないかと思います。

Dockerfile が巨大になると、チームメンバーがそれぞれビルドする時間も馬鹿にならないので、ビルド済みイメージをレジストリーに配置しておきたくなりますが、前述の通り特に会社のレジストリーがあるわけでもありません。そんなときに便利なのが Azure Container Registry です。

Azure Container Registry は Docker Hub と同様に Docker イメージを登録できるレジストリーです。 Azure Container Registry は webhook 機能を提供しており、イメージが更新・削除された際に任意の URI に対してメッセージを送信することができます。イメージが更新されたら最新のコンテナを利用してくれという通知を行ったり、環境へのデプロイを行ったりすることができるわけですね。

というわけでタイトルにある通り、社内 GitLab に push したら Azure Container Registry に push して ChatWork に通知するというのをやってみたいと思います。

事前に準備するもの

以下のものは既に作成済みであることを想定します。

  • GitLab(GitLab Runner がセットアップ済みで Docker のビルドが行える必要があります)
  • ChatWork API トークン

以下の Azure サービスを最終的に利用します。

  • Azure Container Registry
  • Azure Functions

Azure Container Registry を作成

Azure ポータルから New → Containers → Azure Container Registry を選択します。

Container Registry の情報を入力します。 Admin user は Enable にすることでレジストリーにログインするために必要なユーザー名とパスワードが発行されます(後から変更可能です)。

レジストリーが作成されたら、 “Access keys” からレジストリーにログインするために必要なユーザー名とパスワードを取得します。

GitLab から Azure Container Registry にイメージを登録

GitLab CI を利用して、 Docker イメージをビルドし、 Azure Container Registry に push します。

GitLab への環境変数の登録

GitLab のビルド設定は .gitlab-ci.yml ファイルに記述しますが、そのままファイル内にパスワード等を入力するのはよろしくありません。レジストリーへの接続情報は GitLab 側に環境変数として登録し、 .gitlab-ci.yml には環境変数を呼び出して利用します。

GitLab のプロジェクトの Settings → CI/CD から Secret variables に変数名と値を入力します。ここではレジストリーの URL を CONTAINER_REGISTRY_URL、ユーザー名を CONTAINER_REGISTRY_USER、パスワードを CONTAINER_REGISTRY_PASSWORD としています。

ビルド設定

GitLab Runner の設定によって Docker のビルド方法は異なりるため、環境により書き方は異なりますが(参考:Using Docker Build)、 .gitlab-ci.yml に例えば以下のようにビルドおよび push の設定を行います。

repository_name や tag_name にはプロジェクト名やビルド番号などを利用したいと思います。これらは GitLab CI で事前に環境変数として定義されています。利用できる変数は「GitLab CI/CD Variables」を参照してください。

build_docker_job が走ると、 Azure Container Registry に push されるようになりました。

Azure Container Registry から ChatWork への通知

Azure Container Registry の webhook を利用して Azure Functions にメッセージを送信し、 Azure Functions から ChatWork にメッセージを送信します。

Azure Functions の作成

Azure Functions を作成します。テンプレートは Generic webhook を選択すれば良いでしょう。

次で作成する Azure Container Registry の webhook は以下のような形式の JSON を送信します。

Newtonsoft.Json がデフォルトで利用できるので、適当にデシリアライズしてやれば情報が利用できます。なお、 webhook のテストで ping を送信した場合は target と request はリクエスト中に含まれませんので注意してください。以下に push のみ処理する例を示します(言語は F#)。

コードを保存したら “Get function URL” から関数の URL を取得します。

Webhook の設定

最後に Azure Container Registry で webhook を設定します。

Webhooks から Add を選択し、 webhook の情報を入力します。 Service URI は先程取得した Azure Functions の URL を入力します。

テスト

GitLab に push して webhook が動作することを確認します。うまく動かない場合は GitLab のジョブのログや、 Azure Container Registry の webhook の Request/Response を確認します。