WindowsローカルレポジトリにJenkinsを活用した話(Windows+svn)
背景
プライベートプロジェクトにJenkins氏を導入しました。
一人でやっている遊びプロジェクトですが、所謂TDDやってみたいなとか、メトリクスとかプロジェクトの進捗を可視化したいなと思いました。また、可視化すればプライベートプロジェクトで最も重要な「モチベーション」の維持ができるかもしれないという淡い期待も込めて、Jenkins氏にメンターになって頂きたいという思いから、導入してみました。
環境
参考までに導入環境は以下です
OS:windows7 64bit home
jenkins:1.596
構成管理:svn(レポジトリはローカルに配置)
概要
ざっくり構想はこんな感じにしました。
①ユーザーがソースコードをコミットする(Development/Commit)
②コミットをJenkinsに通知する(Hook)
③Jenkins働く(CheckOut/Build/Test/...)
④問題があればユーザーに通知する(Notice)
こうした理由は簡単で、業務用なら別ですけど、自宅のPCは必要なときしか電源入れないからです。他の構想としては例えばJenkins氏に深夜こっそり働いてもらう、定期的にレポジトリを見に行ってもらって変更があればビルドしてもらう、定期的にビルドしてもらうというような方法があると思います。自宅のPCは使うときにしか電源を入れないので、現実的にちゃんとライフサイクル回すにはこのフローが最適だと考えました。
導入
まずはJenkins氏のインストール。以下からインストーラを入手しました。
Welcome to Jenkins CI! | Jenkins CI
ダウンロードは右側の「Or native Package」というところのwindowsをクリックする。
svnはTortiseSVNを使っていたので、それをそのまま使いました。
svnのレポジトリ作成とかそのへんは割愛します。
環境設定
次にJenkins氏にsvnのレポジトリからcheckoutしてもらうための設定をおこないました。
①新規ジョブ作成
インストール時に特に操作してなければ、次のURLにアクセスすることで、Jenkins氏を確認できます。ポート番号は8080がデフォルトですが、任意の値に変更できます。
http://localhost:<ポート番号>
そして、左側にある「新規ジョブ作成」をクリックし、次の画面で「フリースタイル・プロジェクトのビルド」を選択してジョブ名を入力したところでOKをクリック
するとトップページに新しいジョブが追加されます。
Jenkins氏はこのジョブ単位で管理してくれます。
②ジョブの設定をする
トップページに戻って、先ほど作成したジョブ名をクリック
次の画面の左側の設定をクリック
ここで以下の設定を行います。
・プロジェクトの高度なオプションの「カスタムワークスペースを使用」にチェックを入れ、ディレクトリを設定
⇒デフォルトの場所(Program Files下)ではJenkinsにアクセス権を設定しなければならないので、他の場所に移したほうがよかったです。Jenkinsはこのワークスペースを使ってsvnのチェックアウトやビルドを行います。
・ソースコードの管理をsubversionに設定し、Repository URLを設定。
この時レポジトリの位置がローカルにある場合は、「file:///C:/Users/workspace/*****」というような書き方をします。Jenkinsの不具合なのかなんなのか、赤字でアクセスできないと表示されるんですが、無視して設定を保存するとちゃんとアクセスできました。それ以外の設定は変更しませんでした。チェックアウト方式はお好みで。
・動作確認
ここまでの設定を保存し、左側メニューにある「ビルド実行」をクリックすると、問題がなければJenkins氏がsvnから最新のリビジョンをチェックアウトしてくれるはずです。
結果は「ビルド実行状態」から確認してください。
また、環境のデバックにはコンソール出力を活用するのが良いと思います。
コンソール出力は実行中ジョブの日時をクリックして、次のページでConsoleOutputをクリックすると出力されます。
チェックアウト後に、上図の「Build/Test」のようにテストコードの実行や各種解析をJenkinsにさせたければ、「ビルド手順の追加」をクリックし、例えば「windowsバッチコマンドの実行」等を選択してバッチコマンドを記述することができます。
ここまでで上の図のCheckoutとBuild/Testができるようになります。
③svnとの連携
次に上の図の「Hook」を導入します。
イメージとしてはUserがCommitした時にsubversionに働いてもらって、jenkinsにCommitを通知するという流れです。そのため、svnのレポジトリのスクリプトをいじります。
レポジトリの中に「hooks」というフォルダがあるのでそこにhookスクリプト(tmplファイル)があります。
コミット前なら「pre-commit」、コミット後なら「post-commit」みたいなファイル名のようです。自分で好きな名前をつけても良いです。また、windowsの場合、拡張子をbatに変更する必要があります。私は名前をデフォルトのまま、post-commit.batを用意しました。そこに次のようにしました。
SET JOBNAME=<Jenkinsに設定したジョブの名前> SET REPOS=<レポジトリの場所>(C:\\workspace 等) SET JENKINSSERVER=<jenkinsサーバー>(http://localhost:8080等) FOR /f "tokens=*" %%c IN ( 'svnlook youngest %REPOS%' ) DO ( SET REV=%%c ) FOR /f "tokens=*" %%b IN ( 'svnlook changed --revision %REV% %REPOS%' ) DO ( SET POST=%%b ) wget ^ --header="Content-Type:text/plain;charset=UTF-8" ^ --post-data="%POST%" ^ --output-document="-" ^ --timeout=2 ^ %JENKINSSERVER%/job/%JOBNAME%/build?delay=0sec
書いていて思い出しましたが、上のバッチの利用にはwgetのインストールが必要です。以下を参考にインストールしました。
Windows版 wgetをインストールしよう:アシマネのドタバタ奮闘日記:So-netブログ
batファイルでは、Jenkins氏にwgetコマンド経由でビルド実行をお願いしています。
http://localhost:<ポート番号>/job/<job名>/build?delay=0sec
にアクセスすると働いてくれる(jenkins上のビルド実行クリックと同じ動作)ので、これをwgetで呼んでいます。
最後にTortiseSVNの設定をします。
どこでもいいのでエクスプローラ上で右クリック。svnのメニューから設定を選択。左側の設定メニューの中から「HookScript」をクリック。「追加」ボタンを押して、右上のダイアログから「post commit hook」を選択。ワーキングコピーと、先ほど作ったbatファイルの位置を設定。
以上の設定が正しくされれば、コミットをきっかけにJenkinsが働いてくれるはずです。ちょっと長くなったのでnoticeはいずれ書きます。
参考