Symfoware

Symfowareについての考察blog

Jenkins + GitBucket + Fabricを使用し、ボタンひとつでwebサーバーにデプロイ

ボタンを押したら、gitのレポジトリからソースを取得してデプロイ。
これがやりたくて、色々下調べをしていました。

Debian 7にTomcat 7 + gitbucket + Jenkinsをインストールする
JenkinsとGitBucketを連携し、pushされたら自動的にソースを取得する(GitBucket Plugin)
JenkinsとGitBucketを連携し、CodeIgniterのテストを自動実行する(GitBucket Plugin)
Python Fabricで、リモートサーバーでの作業を自動化する



Fabricの準備



JenkinsサーバーにFabricとcuisineをインストールします。


# apt-get install python-setuptools
# apt-get install python-dev
# easy_install fabric cuisine




/opt/fabricにapp_deploy.pyというファイルを作成しました。
内容は以下のとおり。


  1. # -*- coding:utf-8 -*-
  2. import fabric.api
  3. import cuisine
  4. # パッケージの取得はaptを選択
  5. cuisine.select_package('apt')
  6. # 実行するホスト名
  7. fabric.api.env.hosts = ['192.168.1.101']
  8. # 接続時のユーザー
  9. fabric.api.env.user = 'symfo'
  10. # パスワード
  11. fabric.api.env.password = 'P@ssw0rd'
  12. # 複数指定する場合 ユーザーは複数指定できない模様
  13. # fabric.api.env.passwords = {'symfo@192.168.1.101:22' : 'P@ssw0rd'}
  14. def deploy():
  15.     
  16.     # gitコマンドの確認
  17.     with cuisine.mode_sudo():
  18.         cuisine.package_ensure('git')
  19.     
  20.     # /var/www/ci_testにgitからソースを取得
  21.     dist_dir = '/var/www/ci_test'
  22.     
  23.     # ディレクトリが存在しない場合はclone
  24.     if not cuisine.dir_exists(dist_dir):
  25.         fabric.api.sudo('git clone http://192.168.1.102:8080/gitbucket/git/root/test.git ' + dist_dir)
  26.         return
  27.     
  28.     # ディレクトリが存在する場合はpull
  29.     with fabric.api.cd(dist_dir):
  30.         fabric.api.sudo('git pull')





手動で実行できるかテストしておきます。


# fab -f /opt/fabric/app_deploy.py deploy




このコマンドをJenkinsで実行すれば良いわけです。





Jenkinsでジョブの準備



Jenkinsに「deploy」というジョブを作成しました。

555_01.png


適当にジョブの説明などを入力します。

555_02.png


ビルドでは、シェルの実行を選択。
以下のコマンドを実行するようにしておきました。


fab -f /opt/fabric/app_deploy.py deploy



555_03.png


満を持してビルドを実行。

555_04.png


失敗しました。悲しい。

555_05.png


ユーザーanonymousが実行
ビルドします。 ワークスペース: /opt/jenkins/jobs/deploy/workspace
[workspace] $ /bin/sh -xe /tmp/tomcat7-tomcat7-tmp/hudson691920840197255447.sh
+ fab -f /opt/fabric/app_deploy.py deploy
/tmp/tomcat7-tomcat7-tmp/hudson691920840197255447.sh: 2: /tmp/tomcat7-tomcat7-tmp/hudson691920840197255447.sh: fab: not found
Build step 'シェルの実行' marked build as failure
Finished: FAILURE




どうも、fabコマンドが見つけられない模様。
whichしてみます。


# which fab
/usr/local/bin/fab




/usr/local/bin/にいるので、シェルの実行をフルパス指定に変更。


/usr/local/bin/fab -f /opt/fabric/app_deploy.py deploy



再度ジョブを実行すると見事成功しました。

555_06.png





本当にデプロイできているか確認



CodeIgniterのプログラムをデプロイしています。
こんなコントローラーを事前に作成しておきました。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         echo 'Hello world';
  7.         
  8.     }
  9.     
  10. }



ちゃんと表示されています。

555_07.png


ソースを以下のように修正。


  1. <?php
  2. class Sample extends CI_Controller {
  3.     
  4.     public function index() {
  5.         
  6.         echo 'delpoy test';
  7.         
  8.     }
  9.     
  10. }




コミットして、リモートレポジトリにプッシュ。


$ git add . && git commit -m "test"
$ git push




Jenkinsでビルド実行。

555_08.png



ブラウザをリロードすると、感動の結果が得られました。

555_09.png



これでwebサーバーが増えても、app_deploy.pyに定義したホストを増やすだけで
簡単に対応できそうです。

あえてプログラムで定義せず、Jenkins側のシェルに定義してもいいですね。




関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/02/21(土) 17:50:58|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Pythonからrpy2でRのソースファイルを呼び出すときに値を渡す方法 | ホーム | Python Fabricで、リモートサーバーでの作業を自動化する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1636-a520dca5
この記事にトラックバックする(FC2ブログユーザー)