Goalist Developers Blog

JenkinsでスタンドアローンなPlayFrameworkアプリをビルド・デプロイする

こんにちは。ゴーリスト開発のイイオです。

今回はJenkinsおじさんを使役します。
とはいえほんとうに手動でぽちぽちやっていたのを置き換えただけなので
もっと便利なプラグインとか使い方があるような気がします。

f:id:y-iio:20170825104518p:plain
よく知らなくてすまんな…おじさん

PlayFrameworkとは入社時から1年弱の付き合いですがいまだにあまり仲良くない。

https://www.playframework.com/documentation/ja/2.4.x

前提

ビルド環境

  • Ubuntu 14.04.5 LTS
  • Jenkins 2.46.2
  • PlayFramework 2.4 Java

実行環境

  • Amazon Linux AMI release 2017.03

JenkinsサーバはbitnamiでEC2上に立てた

なんかbitnami使ったおかげで楽だったりもしましたが、だいたい詰まったのこのせいな気がしなくもない。
それについてはこちらをご覧ください。

developers.goalist.co.jp

Playビルド用の環境整える

qiita.com

qiita.com

Jenkins > Global Tool Configuration > JDK > JDK追加
Java SE Development Kit 8u131

Jenkinsにリモートでシェル実行できるプラグイン入れる

Jenkins でリモートサーバーのコマンドを実行できる SSH pluginを使ってみた | Whaison JUGEM! StudyNoteBook .

Jenkins > 認証情報 > System > グローバルドメイン > 認証情報の追加
でリモートサーバー接続用のSSHユーザー名と秘密鍵を登録

Jenkins > 設定 > SSHリモートホスト
でリモートサーバーを登録

実行環境でアプリとPID置き場を作っておく

sudo mkdir /var/play
sudo mkdir /var/run/play

パーミッションも適当に与える

やってること

  1. Jenkinsでgithub上のソースから任意のブランチを指定してビルド
  2. リモートサーバーで稼働しているアプリ停止
  3. Jenkinsでビルドしてリモートサーバーの成果物更新
  4. リモートサーバーのアプリ再起動

ダウンタイムがある!ので
作業中はELBを別インスタンスに向けるとか、そのへんも自動化するとかあるだろうけど
漢らしく置いておくことにします٩( ‘ω’ )و

詳しく

1. Jenkinsでgithub上のソースから任意のブランチを指定してビルド

ビルド設定
こんなかんじでパラメータにブランチ名直書きでやってます。

f:id:y-iio:20170825104227p:plain

f:id:y-iio:20170825104326p:plain

なんか選択肢で選ぶ方法とかあるらしいけど複雑なのでやらない。

2. リモートサーバーで稼働しているアプリを停止

ビルド手順の追加 > リモートホストでシェルを実行

if test -e /var/run/play/play.pid; then kill $(cat /var/run/play/play.pid); fi
rm -rf /var/play/hrog-map-api-SNAPSHOT.zip
rm -rf /var/play/hrog-map-api-SNAPSHOT

3. Jenkinsでビルドして、リモートサーバーの成果物更新

ビルド手順の追加 > シェルの実行

bin/activator dist
scp -P 22 -i /path/to/key/key.pem ${WORKSPACE}/target/universal/PROJECT_NAME.zip USER@~~~~~~~.compute.amazonaws.com:/var/play

もっとこのへんいい方法あるんだろうな〜〜

4. リモートサーバーのアプリ再起動

ビルド手順の追加 > リモートホストでシェルを実行

unzip -o /var/play/hrog-map-api-SNAPSHOT.zip -d /var/play
nohup /var/play/hrog-map-api-SNAPSHOT/bin/hrog-map-api -Dconfig.resource=application_dev.conf -Dpidfile.path=/var/run/play/play.pid > out.log 2> err.log < /dev/null &

だめだったら

パーミッションを適切に与えればなんとかなる!!!根も葉もない