やりたいこと
gitlab上で開発されているphpのウェブアプリをJenkinsでビルド開始をポチッとすると、最新をpullし、httpサーバにrsyncでデプロイする。
構成
- apache2サーバ (Ubuntu 14.04)
- Jenkinsサーバ (CentOS 6.6)
- gitlabサーバ(不明)
Jenkinsサーバ
jenkinsをログインできるようにする
※本当はやらないほうがいいんじゃないだろうか?
sudo chsh -s /bin/bash jenkins
デプロイ用キー作成
deploykey.pubはコピペで後でapache2のauthorized_keysに書く。
sudo su -
ssh-keygen -f deploykey
cat deploykey.pub
mkdir /var/lib/jenkins/.ssh
mv deploykey* /var/lib/jenkins/.ssh
chown -R jenkins:jenkins /var/lib/jenkins/.ssh
chmod -R og-r /var/lib/jenkins/.ssh
apache2サーバ
www-dataをログインできるようにする
※本当はやらないほうがいいんじゃないだろうか?今回は前もってapache2サーバはjenkinsからしかsshできないようにしてあるので、安全といえば安全だが・・・。
sudo su -
chsh -s /bin/bash www-data
jenkinsのデプロイ用キーを書く
sudo su -
mkdir /var/www/.ssh
vi /var/www/.ssh/authorized_keys
chown -R www-data:www-data /var/www/.ssh
このあと、jenkinsサーバに戻って ssh -i deploykey www-data@httpserver
でつなげ、known_hostsをちゃんと更新 & 接続確認すること。私はこれでハマった。
アプリ置き場を作る
このあと適当にconfを書く。ここでwww-dataでデプロイすることで、キャッシュディレクトリとかをog+wとかしなくてよいのがよい。
sudo su -
mkdir /var/www/app_dir
chown www-data:www-data /var/www/app_dir
jenkins設定
git & gitプラグイン入れる
加えてCentOS6.6標準のgitだと古くて、jenkinsのgitプラグインからhttpでのアクセス(メールアドレスとパスワードでの認証)がうまく動かないだろう、ので、ソースコードからビルドしてインストール。このパスをjenkinsで設定すること
ビルドの手順書
プロジェクトの設定からビルド手順の追加
してシェルスクリプト
を選択し、以下のコマンドを実行。
rsync -avC --delete -e "ssh -i /var/lib/jenkins/.ssh/deploy_key" $WORKSPACE/ www-data@apache2server:/var/www/app_dir/
パスの最後のslashの位置とかハマりどころなので注意。rsyncのCオプションはいまどきらしい、--help
によると、以下とのことで、.git
とか.cvs
とか.svn
とか無視してくれるらしい。
-C, --cvs-exclude auto-ignore files the same way CVS does
あとは
このプロジェクトのボタンを押せば、git pull → rsync までやってくれるはず。前述の通り、一度ターミナルからsshして動作確認しないと、known_hostsにハッシュが無くてコケてた。
試してないこと
sshつなげようとして、問い合わせに対してyesを押してknown_hostsを更新する方法
ssh-keyscan -H $host >> ~/.ssh/known_hosts