JenkinsノードとしてGCEをセットアップ追加

Jenkinsは、ビルド実行の実働ノード(スレーブ)として外部のサーバーを指定できます。

ミニマムの要件としては、SSHログインできるサーバーを用意すれば足りますが、実際にはビルドを実行するツールチェインも必要になります。

今回は、特別なツールをあまり必要とせず、比較的汎用性の高いdockerイメージのビルド環境を作り、さらにGoogle Container Registryに完成したイメージをpush配信するためのセットアップ手順を紹介します。

現状、Google Compute Engineのg1-smallインスタンスを利用しています。当初、f1-microインスタンスで構築したのですが、ビルド過程で処理時間の長いプロセスが走るとkillされるため、適していないことが分かりました。ただし、g1-smallも相対的に速いためたまたまクオーター制限内に完了しているだけで、共有CPUであることには変わりないので同じ事象は起こりえます。
安定してビルドしたい場合は、VM上のCPU時間を占有できるn1-standard以上の方が良いでしょう。

OSは、パッケージが全体的に新しいものを利用できるubuntu(16.10)を利用しています。

dockerのインストール

docker.ioというパッケージをubuntuの標準リポジトリからインストールするのがもっとも手軽です。

docker公式サイトから手動セットアップする手順などを含めて、 How to Install Docker on Ubuntu 16.10 Yakkety Yakによくまとまった情報があります。

また、他のディストリビューションを含めた全般的な情報はdocker公式の Install Docker Engineが参考になります。

dockerビルド環境の基本的なポイントは、楽に新しいバージョンのパッケージを導入できるディストリビューションを選択することだと思います。

実際のビルドはdockerコンテナ内で完結するため、docker以外のOS機能の良し悪しをホストレベルで検討する必要性は実際問題として低いはずです。

SSHアカウントの追加

Google Compute EngineのSSHユーザーは、GCP管理画面に公開鍵を貼り付けるだけでセットアップが完了します。

あらかじめSSH鍵ペアを作成しておくのですが、コメントにユーザー名を指定することでその名称のユーザー(以下の例では、jenkinsユーザー)が自動で作成されます。

$ ssh-keygen -t rsa -C "jenkins"

作成した公開鍵(.pub付き)は、 GCEインスタンス設定画面の「メタデータ」の項目で登録します。右ペインのタブで「SSH認証鍵」に切り替えると登録フォームが表示されるので、文字列をすべて貼り付けます。

ユーザーが作成できたら、GCEインスタンスにSSHログインして、jenkinsユーザーがdockerコマンドを実行できるように、dockerグループに登録しておきます。

$ sudo gpasswd -a jenkins docker

SSHログインは、先ほどの秘密鍵を利用してセットアップすることも可能ですが、GCPの管理画面からセットアップ不要でSSHログインすれば手軽です。

なお、dockerグループへの登録は、次回ログイン時から有効になるため、docker infoコマンドなどで動作確認する際には一度SSHセッションを終了して再接続する点に注意します。

Google Cloud SDKのアカウント設定

gcloudコマンドなどのGoogle Cloud SDKはGCEのOSイメージに始めからバンドルされているため、ツールセットアップそのものは不要です。

実用面では、Google Container Registryなどにpushするために、サービスアカウントを設定しておくことが必要になります。

GCE上のセットアップは、jenkinsユーザーでSSHログインして、サービスアカウントを有効化する作業です。

サービスアカウントのクレデンシャル(認証情報)は、 GCP管理画面の「IAMと管理」「サービスアカウント」から取得できます。

プロジェクトにアクセスするサービスアカウントを選択or新規作成のうえ、jsonファイルをダウンロードします。

gcloud auth activate-service-accountコマンドにkey-fileとして指定します。
jsonファイルの場合、アカウント名もファイルに記載されているため、コマンドラインにはkey-fileの指定だけで足ります。

key-fileのアップロードは、scpコマンドのほか、echoコマンドの引数に貼り付けてファイル出力する手もあります。

なお当然ですが、サービスアカウントは作成しただけでは何もアクセス権がないため、利用するプロジェクトに対する権限設定は別途Webコンソールから随時行う必要があります。

Jenkinsのノード設定

Jenkinsからのノード設定は、管理画面の「Jenkinsの管理」→「ノードの管理」で行います。

先ほど作成したjenkinsユーザーのSSH秘密鍵も、ノードの新規作成画面の「追加」ボタンから登録できます。

ユーザー認証情報のほかの重要な設定項目としては、「ホスト」にGCEのIPアドレスを指定する点と、「リモートFSルート」にjenkinsユーザーのホームディレクトリ(/home/jenkins/)以下のどこかを指定する点があります。

また、「ノード名」は識別用のラベルには違いないのですが、Jenkins2のPipelineスクリプトでノード指名ビルドする際に指定するラベルでもあるので、alphanumericな文字列の方が予期せぬトラブルは避けやすいでしょう。

設定を保存するとJenkinsが自動でエージェントツールをセットアップし始めます。
設定が成功するとノードリストに空きディスク容量などの実情報が反映されます。

ノードが利用可能な状態になったら、あとはいつものようにビルド実行すると適宜新規ノードが使われ始めます。

まとめ

コンテナは非常に便利ですが、Jenkinsを活用してコンテナをビルドする環境は物理サーバー・VMの方が柔軟性が高い、ということが分かりました。

dockerイメージは作成して終わりではなく、Google Container Engine(GKE)などの実行環境に送り込むことが必要であるため、Google Cloud SDKと統合されているGCEは便利です。

また、セットアップにあたっては、Google CloudやUnixのネットワーク・OSセキュリティに詳しくなることが運用上達の近道です。

中馬崇尋
Chuma Takahiro