前回の記事では、コンテナをビルドした後にAzure Container Registryに登録するのをコマンドラインで行いました。
また、ACRを使ってビルドができることも確認しました。
今回は、Azure DevOpsのAzure Pipelinesを使って同じことを行なってみます。
まずは、Azure DevOpsに登録して、Reposにソースコードをpushしておきます。
メニューのPipelinesを選択して、「New pipeline」をクリックすると、ウィザード形式の画面が開きます。
「Where is your code ?」ということなので、ソースコードのあるリポジトリを指定します。今回はAzure Repos Gitを選択します。
するとリポジトリの一覧が表示されるので、先ほどpushしたリポジトリを選択します。
次に、処理内容のテンプレートを選択します。
Pipelineの正体はYAMLになるのですが、一から全て書くのは大変なので、よくある処理内容がテンプレートととして用意されています。いずれかのテンプレートを選択した後、そのYAMLを書き換えてカスタマイズすることもできます。
今回は、Dockerの2番目(Build and push an image to Azure Container Repository)を選択します、
すると、接続先のACRを設定するウインドウが右に出てきます。
この設定は、実は「サービスコネクション」と呼ばれるものです。Azure Pipelinesから外のサービスに接続する際に、接続先や資格情報などをYAMLに記載するのではなく、サービスコネクションとして別途保存しておき、それをYAMLから参照する形式になります。
これが終わるとYAMLが生成されます。
内容を見てみましょう。
trigger: - master resources: - repo: self variables: # Container registry service connection established during pipeline creation dockerRegistryServiceConnection: 'xxxx' imageRepository: 'webapp' containerRegistry: 'xxxx.azurecr.io' dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile' tag: '$(Build.BuildId)' # Agent VM image name vmImageName: 'ubuntu-latest' stages: - stage: Build displayName: Build and push stage jobs: - job: Build displayName: Build pool: vmImage: $(vmImageName) steps: - task: Docker@2 displayName: Build and push an image to container registry inputs: command: buildAndPush repository: $(imageRepository) dockerfile: $(dockerfilePath) containerRegistry: $(dockerRegistryServiceConnection) tags: | $(tag)
いろいろな命令が並んでいて、一度に全部理解するのはなかなか大変です
triggerのmasterは、masterブランチにコミットされた時にこのpipelineが動く設定です。
resourcesはソースコードの場所を指定しています。DevOpsのReposを使うとシンプルにselfになります。
variablsで変数を定義しています。
その後の stages > jobs > steps がマルチステージパイプラインと呼ばれる処理のまとまりになります。コメントが入っているのでなんとなく処理内容はわかるのですが、例えば「Docker@2」というtaskの詳細はドキュメントを見ないとわかりません。
このようなpipelines独自のtaskがたくさん用意されているので、テンプレートや各種サンプルを探しながら理解していくことになります。
YAMLはプロジェクト直下に「azure-pipelines.yaml」として、ソースコードの一部としてコミットして管理します。
また、ウィザード中で作成したサービスコネクションは、Project Settings > Service Connections で確認できます。
もちろん先にサービスコネクションを作っておき、YAMLにそれを直接記載する方法でも作成できます。