遂に来たか、この時が。

この一ヶ月何度となくDevOps Hackathonを思い出したぞ。

ビルドマシンのただ一度の突然の死。

ゴミのような突然の死に私が敗れたのだ。

一ヶ月この辱めに耐えてきた。

だが、今、それも終わる。

お前を葬りさり、

あのビルドマシンの突然の死がこの世界の仕組んだ卑劣なワナだったと証明し、

このわずかな傷を拭い去って完全な復活を遂げるのだ。

詳細はこちら

当時は以下のフローを一つのビルド定義で定義していました。

  1. Visual Studio Online の Git リポジトリに push する
  2. リポジトリの更新に基づいて Visual Studio Online で定義しているビルド定義を実行
    1. リポジトリの最新を取得
    2. CI(ビルド & テスト)
    3. Dockerfile に基づいて Docker イメージ作成
    4. Docker のコンテナを起動

一つのビルド定義ですべて実行しているので、ビルドマシン兼 Docker サーバーとなってしまっていました。 これは Docker の処理とビルドという CPU を使う処理を一台のマシンで行うことになるので、実際の開発現場では通常起こりえません。 そこで、以下のように変更しました。

  1. Visual Studio Online の Git リポジトリに push する
  2. リポジトリの更新に基づいて Visual Studio Online で定義しているビルド定義を実行
    1. リポジトリの最新を取得
    2. CI(ビルド & テスト)
    3. Docker 用のビルド定義を呼ぶ(キック)
  3. キックに基づいて Visual Studio Online がキックされたビルド定義を実行
    1. Dockerfile に基づいて Docker イメージ作成
    2. Docker のコンテナを起動

キックするのは簡単です。 Visual Studio Online には REST API が準備されているので、REST API でビルド定義を実行するだけです。 というわけで、以下に手順を記載します。

Visual Studio Online のビルド定義を REST API で実行する方法

呼び出したい Visual Studio Online のビルド定義の情報を取得する

Build Definitions | Visual Studio Online REST API Reference の [Get a build definition] で呼び出したい Visual Studio Online のビルド定義の情報を取得します。

curl -u {username}[:{password}] https://{account}.visualstudio.com/defaultcollection/trial/_apis/build/definitions?api-version=2.0

Visual Studio Online のビルド定義を REST API で実行する

Builds | Visual Studio Online REST API Reference の [Queue a build] で取得した Visual Studio Online のビルド定義の情報を送信します。

curl -u {username}[:{password}] -H "Content-type: application/json" -X POST -d '{"definition": {"id": {id}}, "sourceBranch": "{source branch}"}' https://{account}.visualstudio.com/defaultcollection/{project}/_apis/build/builds?api-version={version}=2.0

参考情報