読者です 読者をやめる 読者になる 読者になる

ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure 上に Jenkins を使って CI 環境を構築する

この記事は、Azure Advent Calendar 2016 の 25 日目 の記事です。
qiita.com
Azure 上に Jenkins を インストールして、継続的インテグレーション(CI)環境を構築してみました。
Jenkins のような CI ツールを使ってビルドやテストなどの作業を自動化する場合、オンプレミスにサーバーを用意してインストールするのは手間なので、Azure を使うと簡単に構築することができます。
ASP.NET のアプリケーションをビルドするシナリオを想定しているので、Jenkins をインストールする Linux の Master ノードのほかに、プラグインを使って MSBuild を実行できる Windows の Slave ノードも構築します。

Jenkins の Master Node を構築する

Azure ポータルで Jenkins を検索すると、Docker、Bitnami、CloudBees などいくつか種類がありますが、今回は Docker を使います。Ubuntu Server 16.04.0-LTS 上で動作するコンテナに Jenkins がインストールされた環境を構築できます。
コンピュータ名やユーザー名、そして SSH の公開鍵などを入力して作成します。仮想マシンのサイズやオプション設定は、初期値のままで進めます。

f:id:TonyTonyKun:20161224124058p:plain

作成が完了したら Public IP Address(52.185.154.89)を確認し、ポート番号:8080 にアクセスすると、Jenkins の管理者パスワードを入力する画面が表示されます。

f:id:TonyTonyKun:20161224124149p:plain

管理者パスワードを取得するには、画面に表示されているパスは Docker 内のパスなので、コンテナに接続する必要があります。MAC であればターミナルを使って、まずは Linux の仮想マシンに SSH接続します。

ssh -i ~/.ssh/id_rsa thara@52.185.154.89

次に、接続する Docker のコンテナ名を確認します。

docker ps

確認したコンテナ名(compose_crate_1)を指定して、管理者のパスワードを取得できます。

docker exec compose_crate_1 cat /var/jenkins_home/secrets/initialAdminPassword

次の画面では、プラグインをインストールします。推奨のプラグインで構わないので、初期値の Install suggested plugins を選択したまま、処理を進めます。

f:id:TonyTonyKun:20161224145232p:plain

プラグインのインストール完了後、初期ユーザーを作成して Save and Finish ボタンを押します。

f:id:TonyTonyKun:20161224145306p:plain

これで環境構築が完了です。Jenkins のダッシュボード画面が表示されます。

f:id:TonyTonyKun:20161224145347p:plain

Jenkins の Windows Slave Node を構築する

Jenkinsの管理 - プラグインの管理を選択して、Azure Slave Plugin をインストールします。インストールが完了したら、システムの設定で Azure のサブスクリプション ID などを設定します。

f:id:TonyTonyKun:20161224145454p:plain

Management Service Certificate は、こちらのリンクからダウンロードできる publish.setteing ファイルから取得できます。Verify Configuration ボタンで検証して、成功することを確認しておきます。

続いて、Add Azure Virtual Machine Template から、仮想マシンのテンプレートを追加します。仮想マシンの名前やサイズなどを指定します。Labels は、ジョブを特定のノードだけで実行させる際に指定するキーとなりますので、分かりやすい名前にしておきます。今回は、"Windows" を指定しました。

f:id:TonyTonyKun:20161224145647p:plain

次に、仮想マシンのイメージを指定します。今回は、Visual Studio 2015 が入った Windows Server 2012 R2 を選択しました。Windows の仮想マシンなので、Launch Method は "JNLP" を選択します。2つの警告が表示されている通り、別途対応が必要なので、ひとまず UserName と Password を入力して保存します。

f:id:TonyTonyKun:20161224145807p:plain

1つ目の警告には、Windows Slave Node から Master Node に通信できるようにポートを開放しておく旨が記載されています。

Make sure the Azure slave can reach the master via the Jenkins URL and ensure to configure fixed TCP port for JNLP slave. Refer to help for details.

Jenkinsの管理 - グローバルセキュリティの設定を選択すると、TCP port for JNLP agents の固定ポート番号を確認できます。

f:id:TonyTonyKun:20161224150151p:plain

Azure ポータルを開いて、Network Security Group の Inbound Security Rules に、先ほど確認したポート番号(50000)を開放する設定を追加します。

f:id:TonyTonyKun:20161224150230p:plain

2つ目の警告には、Windows Slave Node の起動時に実行される初期化スクリプトを設定しておく旨が記載されています。

Ensure image is pre-configured with a Java runtime or provide a script to install Java in headless (silent) mode. If using JNLP, you can leave this blank for default script to execute or refer here for a sample script.

こちらのスクリプトを貼りければ良いですが、credentails の "username:apitoken" の部分は、環境に合わせて編集してください。API トークンは、Jenkinsの管理 - ユーザーの管理を選択して、歯車アイコンをクリックすると、確認することができます。

f:id:TonyTonyKun:20161225050048p:plain

Jenkinsの管理 - システムの設定に戻り、Init Script に初期化スクリプトを貼り付けたら、設定は完了です。

動作確認

新しいジョブを作成します。フリースタイル・プロジェクトのビルドを選択し、このジョブを実行するノードを制限します。ラベル式には、先ほど設定した "Windows" を指定することで、Master ではなく Slave のノードで実行されるようになります。

f:id:TonyTonyKun:20161224150607p:plain

ビルド手順を追加し、シンプルな Windows バッチコマンドを設定します。

f:id:TonyTonyKun:20161224150634p:plain

ビルド実行をクリックすると、ジョブが実行されます。初回のビルド実行は、Windows Slave Node の仮想マシンが作成されるので少し時間がかかりますが、無事にジョブが実行されたことを確認できます。

f:id:TonyTonyKun:20161224150659p:plain

ダッシュボードに戻ると、ビルド実行状態に Master と Slave のノードが待機中であることがわかります。Retension Time の初期値が 60 分なので、最後にビルドされてから 60 分が経過すると、Slave のノードが停止するので、無駄なコストも発生しません。

f:id:TonyTonyKun:20161224150715p:plain

まとめ

Azure のようなクラウドに CI 環境を構築することで、イニシャルコストを抑えることができますし、ビルドやテスト作業の負荷に応じてノードを増やしたり減らしたりすることもできます。
CI 環境は、簡単に作り直したり複製したりすることができる Docker と相性が良いので、今回のような仮想マシンベースではなく、Docker をベースに構築するとさらに便利になると思います。