Spinnakerのコードを手元で修正して動作確認する方法(その2)

こんにちは。mizzyです。

その1の続きです。今回は、コードを修正したHalyard1)Spinnakerのインストールや設定を行うCLIツールや他のコンポーネントを使ってセットアッププロセスの実行から動作確認する方法までについて説明します。

筆者がSpinnakerに出したプルリクエストは、Halyardの修正2)feat(deploy): Add default AWS settings to deck by mizzy · Pull Request #1024 · spinnaker/halyardと、それによってセットアップ時に適切な設定をDeck3)SpinnakerのWeb UIコンポーネントsettings.jsに埋め込む4)feat(halconfig): Have AWS settings configured by halyard to be picked up in settings.js by mizzy · Pull Request #5681 · spinnaker/deckというものだったので、この方法での動作確認が必要でした。

検証の背景

その1で書き忘れたので、ここで書いておきます。リクルートマーケティングパートナーズのサービスインフラは殆どがAmazon ECSで構築されています。また、今後Kubernetesへの移行も視野に入れています。そういった中で、デプロイパイプラインを柔軟に組み立てることができたり、様々なクラウドプロバイダーに対応したりといった点でSpinnakerに魅力を感じ、検証を進めています。

コード修正したコンポーネントでセットアップを実行して動作確認する方法

本題に入ります。ここでは、その1で解説したようなセットアップ済みの一部のコンポーネントを差し替える方法ではなく、コードを修正したHalyardや他のコンポーネントを使ってセットアッププロセスを実行し、動作確認する方法について、3. Choose your Environment - SpinnakerのLocal Gitセクションをベースにして解説します。

その1と同様、Ubuntu 16.04上での操作を想定しています。

必要なパッケージのインストール

Halyardや他のコンポーネントを動かすために必要なJDKと、Halyard cliのビルドに必要なmakeをインストールします。

sudo apt-get update
sudo apt-get install -y openjdk-8-jdk make

Deckを動かすために必要なNode.js関連のパッケージをインストールします。

sudo apt-get install -y nodejs npm
sudo npm cache clean
sudo npm install n -g
sudo n v9
sudo ln -sf /usr/local/bin/node /usr/bin/node
sudo apt-get purge -y nodejs npm
sudo npm i yarn -g
sudo chown -R $USER ~/.config

Clouddriver5)Spinnakerと各種クラウドサービスの連携を行うためのコンポーネントGate6)SpinnakerのAPI Gatewayを動かすために必要なredis-serverをインストールします。

sudo apt-get install -y redis-server

インストールするとredis-serverが自動的に起動します。

リポジトリのフォーク

以下のSpinnakerコンポーネントをすべてGitHub上でフォークしておきます。

Halyardのソースコード取得

HalyardのソースコードをGitHubから取得します。

git clone https://github.com/spinnaker/halyard.git
cd halyard

Halyardのコードを修正する

Halyardのコードを修正して動作確認したい場合は修正しておきます。

Halyard daemonをビルドして動かす

gradlewを実行してHalyard daemonをビルドして起動します。

./gradlew

Halyard cliをビルドする

makeコマンドでHalyard cliをビルドします。

cd ~/halyard/halyard-cli
make

カレントディレクトリにhalコマンドがビルドされます。ここからはビルドしたhalコマンドを使って作業します。

Local Gitインストレーションの設定を行う

Spinnakerのインストールには以下の3つのタイプがあります。

Distributed Kubernetes環境へのインストール
Local Debian HalyardがインストールされたDebian/Ubuntuマシン上でパッケージインストール
Local Git HalyardがインストールされたDebian/Ubuntuマシン上でGitHubからソースコードをcloneしてインストール

Local Gitは開発者向けの設定であり、今回はこちらの設定を利用します。

以下のようにLocal Gitの設定を行うと、github.com/mizzyにフォーク済みのコードをcloneし、upstream(github.com/spinnaker)のmasterブランチを利用してインストールを行います。

./hal config deploy edit --type=localgit --git-origin-user=mizzy
./hal config version edit --version=branch:upstream/master

ブランチ名に別なものを指定すれば、そのブランチを利用してインストールが行われます。

コードをcloneする

インストールを行うためのhal deploy applyコマンドは、コードをcloneしてからインストールを行います。コードを修正してからインストールを行って動作確認したい場合は、--prep-onlyオプションを付与して、インストールは行わずにコードのcloneのみを行います。

./hal deploy apply --prep-only

実行すると、~/dev/spinnaker以下にコードがcloneされます。

この時、HTTPではなくSSHでgithub.comからcloneを行うので、GitHubにアクセスできるよう、SSH鍵の設定が必要となりますが、手順は省略します。

コードを修正する

~/dev/spinnaker以下にSpinnakerの各コンポーネントのコードがcloneされているので、必要な修正を行います。

Spinnakerをインストールする

hal deploy applyを実行して、cloneして修正したコードを元にSpinnakerのインストールを行います。

./hal deploy apply

動作確認する

SpinnakerのWeb UI にアクセスするなどして、動作確認します。

通常(Local Debian)のインストールであれば、/opt/spinnaker/opt/deck以下に設定ファイル等が置かれます。ですが、Local Gitでインストールした場合には、こちらにはファイルが置かれませんので、設定ファイルが期待通りの内容になってるか確認したい場合には、~/.hal/default/staging以下にあるファイルを確認します。

未解決事項

Spinnakerのコードに触れている時に、こういうことがしたい、と思ってトライしたが、うまくいかなかったことについて記しておきます。

Spinnakerのバージョンと各コンポーネントのバージョンの関係性について

まず、未解決事項の本題に入る前に前提知識としてSpinnakerのバージョンと各コンポーネントのバージョンがどのような関係になっているのかを説明します。

現在リリースされているSpinnakerのバージョンは、Versions - Spinnakerで確認することができます。

特定のSpinnakerのバージョンに紐付く各コンポーネントのバージョンは、hal version bom <version>7)bomはBill of Mterialsの略で、部品表を表す言葉で確認できます。例えば、Spinnaker 1.9.2で使われている各コンポーネントのバージョンを確認したい場合、以下のように実行します。

hal version bom 1.9.2

実行すると、以下のようなYAMLデータが得られます。

version: 1.9.2
timestamp: '2018-08-29 18:19:20'
services:
  echo:
    version: 2.0.1-20180817041609
    commit: c52ac8a652d61470ca5a0ad772932f3025f5434f
  clouddriver:
    version: 3.4.2-20180828182842
    commit: a769189352eb51db10cefd5c5f7a37dc71946b94
...

versionはDokcer Registry上にあるイメージにつけられたタグやDebianパッケージのバージョンに対応し、commitはGitのコミットを示すリビジョンとなっています。

リリースされている特定のバージョンの一部だけ変更して動作確認したい

ここから本題に入ります。まず、リリースされている特定のバージョンの一部だけコードを変更して動作確認したい場合を考えます。筆者は、バージョン1.9.5の一部だけ修正して動作確認したいと考え、以下のように実行しました。

hal config deploy edit --type=localgit --git-origin-user=mizzy
hal config version edit --version=1.9.5
hal deploy apply --prep-only

実行すると、~/dev/spinnaker以下にコードがcloneされ、bom内のcommitで示されたリビジョンがチェックアウトされた状態となります。ここまでは期待通りです。

この状態でコードを修正し、./hal deply applyを実行してインストールを行うと修正したコードに基づいてインストールがされるはず、と思いきや、修正した内容が反映されていない、という結果になってしまい、期待通りに動作しませんでした。

各コンポーネントで任意のリビジョンを使いつつ一部コードを修正して動作確認したい

通常、bomはGoogleのCloud Storage上にあるもの8)例えば、バージョン1.9.5の場合はhttps://storage.googleapis.com/halconfig/bom/1.9.5.ymlを使いますが、以下のように指定することで、ローカルファイルを参照することができます。

hal config version edit --version=local:custom

これを実行すると、インストール時に~/.hal/.boms/bom/custom.ymlを参照するようになります。ベースとなるYAMLをhttps://storage.googleapis.com/halconfig/bom/1.9.5.ymlなどから取得して~/.hal/.boms/bom/custom.ymlに保存し、ファイル内に記述された各コンポーネントのリビジョンを修正することで、インストールするコンポーネントのリビジョンを好きなように変えることができます。

この状態でhal deploy apply --prep-onlyを実行すると、~/dev/spinnaker以下にコードがcloneされ、custom.ymlのcommitに記述されているリビジョンがチェックアウトされた状態となります。ここまでは期待通りです。

ですが、hal config version edit --version=1.9.5を実行した時と同様、この状態でコードを修正し、./hal deply applyを実行してインストールを行っても、修正した内容が反映されていない、という結果になってしまい、期待通りに動作しませんでした。

まとめ

以上、2回に渡ってSpinnakerのコードを手元で修正して、動作確認する方法について解説しました。

Spinnaker、使いこなすことができればとても便利そうですが、そこまでのハードルが高い、という印象です。また、GKEとの連携に関する情報はそこそこあるものの、筆者が検証しようとしている、AWSとの連携に関する情報が殆どありません。どうやらAWSとの連携事例はGKEと比べると少ないようで、その分こなれておらず、はまりどころも多そうです。

今後も検証を進めながら、得られた知見をこのブログで共有していきたいと思います。

脚注

脚注
1 Spinnakerのインストールや設定を行うCLIツール
2 feat(deploy): Add default AWS settings to deck by mizzy · Pull Request #1024 · spinnaker/halyard
3 SpinnakerのWeb UIコンポーネント
4 feat(halconfig): Have AWS settings configured by halyard to be picked up in settings.js by mizzy · Pull Request #5681 · spinnaker/deck
5 Spinnakerと各種クラウドサービスの連携を行うためのコンポーネント
6 SpinnakerのAPI Gateway
7 bomはBill of Mterialsの略で、部品表を表す言葉
8 例えば、バージョン1.9.5の場合はhttps://storage.googleapis.com/halconfig/bom/1.9.5.yml