tanaka's Programming Memo

プログラミングについてのメモ。

MacにインストールしたJenkinsとGitを連携させてデプロイ

mac上で、特定のGitのブランチにcommitするときに、Jenkinsを使ってテストとデプロイをしたい。ローカルのJenkinsで実現する方法をまとめる。

流れ

  • デプロイ用のブランチへgitでcommitを呼び出し
  • Antでデプロイ
  • PHPUnit+Seleniumでテスト実行
  • テストに成功したらコミット

環境

  • mac上にJenkinsをインストール
  • Gitクライアントには、SourceTreeを利用
  • Jenkinsにジョブを作成して、URL呼び出しで実行できるようにする
  • Gitのhooksフォルダ内のスクリプトを用意
  • ブランチの判定は、commit -branchで列挙して、現在のブランチのマークから取り出して判定

Jenkinsのインストール

Jenkinsを使ってみよう(Mac OS X&Linux)[Ruby、Rails] - Build Insiderを参考にする。

  • インストールは以下でOK
brew install jenkins
  • 起動
java -jar /usr/local/opt/jenkins/libexec/jenkins.war

デプロイ用のジョブを作成

  • Gitにデプロイ用のブランチを作成
  • デプロイ用のAntのタスクを作成
  • Jenkinsにジョブを作成
  • httpで呼び出せるようにする
  • gitのhooksフォルダ内にpost-commitのシェルスクリプトを作成

Jenkinsにジョブを作成して、httpで呼び出せるようにする

  • JenkinsでAntを使えるようにする
    • Jenkinsの管理>システムの設定>Ant追加
    • 名前に「ant」と入力して[保存]
  • 既存WebアプリケーションもJenkinsで自動デプロイしたい!(ビルド・デプロイ基礎編) - Qiitaを参考にして、AntでFTPを使えるようにする
  • build.xmlでreplaceを利用していて、エンコードUTF-8の場合は文字化けすることがあるので、replaceタグにencoding='UTF-8'を追加する
  • 新規ジョブの作成
  • ジョブ名を入力して、[フリースタイル・プロジェクトのビルド]を選択して、[OK]をクリック
  • [ビルド]項目の[ビルド手順の追加]から、[Antの呼び出し]を選択
  • 使用するAntに、作成したantを選択
  • ターゲットを以下のようにする(アプリケーションフォルダは/Applications/で表せる)
-lib commons-net-x.x.jarへのパス build.xmlに登録してあるデプロイ用のターゲット名
  • ビルドファイルに、build.xmlへのパスをコピーして入力
  • [保存]
  • [ビルド実行]で動作を確認する

httpで呼び出せるようにする

  • Gitプッシュ時にJenkinsで自動ビルド - Devlogを参考に設定
  • セキュリティのために、プロジェクトトークンを設定する
    • プロジェクト>設定>ビルド・トリガ>リモートからビルドにチェック
    • 認証トークンに適当な文字列を入力
  • http://localhost:8080/job/JOBNAME/build?token=設定したトークン で実行。セキュリティ未設定の場合はbuild以降の「?token=」は不要

Gitのhookを利用する

hook用のスクリプト作成

  • Git - Git フックを参考に、方針を確認する。
  • pre-commitを利用する。
    • 0以外の値を返すとコミットを中断する。
    • 「git commit --no-verify」で回避。
  • git hook 引用多めのため非公開を参考にして、スクリプトを作成。
    • .git/hooks 内を確認すると、ファイルが何もなかったので、pre-commitを新規に作成する。
    • devtestとreleaseブランチへのコミット前に特定のタスクを実行したい場合のスクリプト例。
#! /usr/bin/env ruby

current_branch = `git branch | grep '*'`.chomp.sub('* ', '')

case current_branch
when "devtest" then
        `curl http://localhost:8080/job/devtestブランチのタスク名/build`
when "release" then
        `curl http://localhost:8080/job/releaseブランチ用のタスク名/build`
end   
    • コマンドを作成したら、chmodで実行属性を設定する
chmod +x pre-commit

EGitからのコミットは使えない

  • EGitはhooksに対応していないらしい(2014/11/29現在)。
  • Macでは、SourceTreeなどのGitクライアントを利用してコミットする。