こんにちは。ゴーリスト開発のイイオです。
今回はJenkinsおじさんを使役します。
とはいえほんとうに手動でぽちぽちやっていたのを置き換えただけなので
もっと便利なプラグインとか使い方があるような気がします。
よく知らなくてすまんな…おじさん
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使ったおかげで楽だったりもしましたが、だいたい詰まったのこのせいな気がしなくもない。
それについてはこちらをご覧ください。
Playビルド用の環境整える
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
パーミッションも適当に与える
やってること
- Jenkinsでgithub上のソースから任意のブランチを指定してビルド
- リモートサーバーで稼働しているアプリ停止
- Jenkinsでビルドしてリモートサーバーの成果物更新
- リモートサーバーのアプリ再起動
ダウンタイムがある!ので
作業中はELBを別インスタンスに向けるとか、そのへんも自動化するとかあるだろうけど
漢らしく置いておくことにします٩( ‘ω’ )و
詳しく
1. Jenkinsでgithub上のソースから任意のブランチを指定してビルド
ビルド設定
こんなかんじでパラメータにブランチ名直書きでやってます。
なんか選択肢で選ぶ方法とかあるらしいけど複雑なのでやらない。
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 &
だめだったら
パーミッションを適切に与えればなんとかなる!!!根も葉もない