MTI Engineer Blog

エムティーアイ エンジニアブログ

Jenkins + Azureでビルド環境を動的に用意する

こんにちは!サーバサイドエンジニアの小林です。私の所属する部門ではCI/CD環境としてJenkinsを使用しています。今回は、Microsoft Azure上にビルド・テスト用の環境を動的に用意する方法をご紹介します。なお、Jenkins自体はAzure上に構築されている必要はありません。

実現したいことは以下になります。

  • 必要に応じて仮想マシンを立ち上げ、ビルド・テストを実行する
  • 一定時間使われていないビルド環境は停止させる

このようにするメリットとしては、

  • 他ビルドジョブからの影響を受けない
  • 新築されるのでゴミデータが溜まらない
  • 常設環境を使うより運用コストが抑えられる

などが挙げられます。

Azure Slave Plugin

Azure Slave Pluginというプラグインを使います。プラグインを追加すると、左上のメニューの[Jenkinsの管理]-[システムの設定]に「クラウド」という設定項目が追加されます。

プロファイル設定

「追加」から「Microsoft Azure」を選択すると、プロファイル設定欄が表示されます。

f:id:mti-hackers:20170707184624p:plain

  • Subscription ID
    • AzureのサブスクリプションID。
  • Management Service Certificate
    • こちらからダウンロードしたxml内に記載されている文字列。
  • Max Virtual Machines Limit
    • 立ち上げる仮想マシンの上限数。なお、指定したサブスクリプションに存在する他の仮想マシンもカウントされるので、考慮の上設定してください。

これらを設定し、「Verify Configuration」をクリックすると検証が行われ、問題なければ「Successfully verified Azure configuration.」と表示されます。

ビルド環境のテンプレート定義

「Add Azure Virtual Machine Template」の「追加」をクリックすると、ビルド環境に関する設定欄が表示されます。設定項目についていくつか説明します。

  • Name
    • この名前でクラウドサービスが作られます。
  • Label
    • このビルド環境に関するキーワードをスペース区切りで列挙します。ジョブの設定では、使用するビルド環境をラベルで絞り込み指定します。
    • (例) Windows VisualStudio2015 AzureSDK2.9.1
  • Storage Account Name
    • ストレージアカウント名。仮想マシンを立ち上げるのにストレージが必要なため指定が必要です。既存ストレージを使う場合は指定してください(ただし同一リージョンのストレージに限る)。空欄にすると自動で生成されます。
  • Retension Time
    • 再度にビルドが実行されてから仮想マシンを停止または削除するまでの待機時間(分)。0を指定すると停止または削除を行わず、起動したままになります。
  • Shutdown Only (Do Not Delete) After Retention Time
    • Retension Timeが経過した際のアクション(停止または削除)。
  • Image Family or Id
    • 使用するVMイメージ。Azureのギャラリーに公開されているVMイメージ、独自に作成したVMイメージ共に利用可能です。
  • Launch Method
    • Jenkinsとビルド環境の連携方法。基本的にはWindowsマシンの場合はJNLP、それ以外はSSHを指定します。
  • Init Script
    • ビルド環境が立ち上がった直後に実行されるスクリプト。ここで共通的に必要な初期化処理を行います。

こちらも、「Verify Configuration」 でチェックしておきましょう。

JNLPを利用する場合の設定

Launch MethodとしてJNLPを利用する場合は、次の設定をする必要があります。

ポート設定

[Jenkinsの管理]-[グローバルセキュリティの設定]にて下記設定を行います。

  • 「セキュリティを有効化」にチェック
  • 「TCP port for JNLP agents」を「固定」にし、ポート番号を指定

また、指定ポートの開放を忘れないよう注意してください。

Init Scriptの記述

テンプレート定義のInit Scriptに、こちらのスクリプトを記述します。なお、

[code lang=text] $credentails="username:apitoken" [/code]

となっている部分の username および apitoken は、ビルド環境からJenkinsにアクセスするための情報ですので書き換えてください。書き換える情報は、[Jenkinsの管理]-[ユーザーの管理]からアクセス用ユーザーの右の歯車をクリックし、「APIトークン」欄に記載されているものになります。

以上でビルド環境の準備は完了です。

実際にビルドしてみる

それではビルドしてみましょう。

ビルドジョブを実行すると最初はビルド環境がまだ無いため、キューに溜まります。

しばらくするとビルド環境が表示されます。仮想マシンが正常に起動してJenkinsとの連携に成功すればオンライン状態となり、ビルドが開始されます。

まとめ

Jenkinsでのビルド環境としてAzureを利用する方法をご紹介しました。

Azureが利用可能であれば設定できますので、分散ビルドが実現できていない、常設環境が煩雑になってきている、などの場合には試してみてはいかがでしょうか?

勿論、同様のことがAWS等でも可能で、そのためのプラグインもいくつかあるようです。また機会があれば検証してみたいと思います。