以前、「Jenkinsのビルドパイプラインでテストからデプロイまでを自動化」という記事を書きましたが、運用環境へのデプロイジョブもJenkinsのビルドパイプラインに加えたい、でも運用環境がJenkinsが動作してる環境とは別の環境で、VPCのPrivate Subnet(あとNAT配下みたいケースとか)になるとJenkinsから対象のサーバに直接デプロイするのがネットワーク的に難しかったりします。

そういった環境下にデプロイする際に有効なのが、デプロイ対象のサーバもしくはそのサーバと同じネットワークセグメントにあるサーバをJenkinsのSlaveノードとして登録する方法です。JenkinsのSlaveノードとMasterノードとの間の接続方式は2つあって、

  1. MasterノードからSlaveノードにSSH接続
  2. JNLPでSlaveノードからMasterノードに接続

この内、2のJNLPで連携するとNAT配下の環境からでもJenkinsのSlaveノードとして連携できます。Slaveノードの登録方法も簡単で以下のステップで、Slaveノードとして認識されるようになります。

Slaveノードの追加

Jenkinsの管理 -> ノードの管理 を開いて「新規ノードの追加」を選択します。任意のノード名を入力しOKを押します。次の画面で下記項目を設定します。

  • リモートFSルート
    SlaveノードでJenkinsが利用するディレクトリのパスを定義します。
  • 用途
    「このマシンを特定のジョブ専用にする」を設定。運用環境へのデプロイジョブ用にしたいので他のジョブが走らないようこの設定にしてます。
  • 起動方法
    「JNLP経由でスレーブを起動」を設定。

slave

Slaveノードの起動

↑で保存ボタンを押すと、ノードが追加され追加したノードに×マークが付いてます。再度そのノードを選択すると↓な画面が表示されます。

jnlp

リンクが付いてるslave.jarを落としてきて、Slaveノードとなるサーバに配置します。配置したら後は、↑に記載されている

java -jar slave.jar -jnlpUrl https://xxx.xxx.xxx/computer/sample/slave-agent.jnlp -secret c53eeb4b4cb1725d35259383667ecaaa4706a05cb1d07d62f813416564f7ed98

を実行します。するとSlaveノードがMasterノードに接続しに行き、追加したノードの×マークが消えます。

デプロイジョブの追加

デプロイジョブの追加は通常のジョブと同様に作成し、設定項目の「実行するノードを制限」にチェックし、先ほど追加したノードを設定します。

sample

あとはこのジョブがキックされれば、Slaveノードの「リモートFSルート」でセットしたディレクトリ配下にJenkinsのworkspaceが作成されジョブが実行されます。

これでNAT配下にあるサーバに対しても、アプリケーションをデプロイするジョブを作成し、ビルドパイプラインの中に加えることができます!

注意点

JNLPで接続する場合、デフォで接続に使われるポートがJenkinsの起動時にランダムに変わるので、Jenkinsの管理 -> グローバルセキュリティの設定 で固定化しておくことをお勧めします。

port