読者です 読者をやめる 読者になる 読者になる

うにだよのBlog

C#関連のことを書きます

Windowsにjenkinsを入れてみる その3

Jenkins

※2015/5/16追記:Jenkinsジョブを実行するスクリプトが間違っていたため修正

※2015/5/23追記:妥協してVisual Studio外からコミットする方法を追記

やりたいこと

Visual Studio上からGitにコミットをすると、Jenkinsで自動でビルド、テスト実行を行う

環境

Windows

Jenkinsはローカルインストール

GitHub利用

Visual Studio 2013Comunity標準のコード管理機能利用

結果

Visual Studioのコード管理のコミットからのJenkins起動はできない。

Visual Studio上からではなく、コマンドラインやGitGUIからコミットをすればJenkinsジョブを起動できる

 

GitコミットとJenkinsの連動の流れ

1.Gitフックを利用してコミット時にスクリプトを実行

2.スクリプトからJenkinsジョブを起動

 

Gitフック

Gitの特定のアクションに対してスクリプトを実行できる

大きく分けて「クライアントサイドフック」(commitなどを検知)、「サーバサイドフック」(pushを検知)がある。

ローカルリポジトリ\.git\.hooks

に、任意の種類のフックスクリプトを配置すればスクリプトを実行してくれる。

今回は「クライアントサイド」の「pre-commit」フックを使用するので、hooksディレクトリにpre-commitという名前のファイルを配置する。

Git - Git フック

Gitのフックの説明と挙動の検証 - Qiita

 

スクリプトによるJenkinsジョブの実行

Jenkinsを呼び出すスクリプトの書き方は以下 

#!/bin/sh

wget --spider http://ホスト名/job/プロジェクト名/build

(Jenkinsのセキュリティが有効化されている場合は、認証トークンを発行して、Jenkinsジョブ呼び出しURLを<http://あなたのホスト/jenkins/job/プロジェクト名/build?token=認証キー>に変更)

Building a software project - 日本語 - Jenkins Wiki

Gitプッシュ時にJenkinsで自動ビルド - Devlog

シェルスクリプトWindows上で動くのか疑問でしたが動作します。おそらくGit\bin\sh.exeがあるから動くのではないかと思います。

 

Visual Studioはクライアントサイドフックをサポートしていない

Visual StudioのGitによるソース管理は、直接Gitを使わずlibgit2を介して行っている。

そのためクライアントサイドフックをサポートしていない。

(調べてみるとGitHub for Windowsからも同様みたいです)

多数の言語に対応したGitライブラリ·libgit2 MOONGIFT

Enable Client-side Hooks When Committing Code to a Git Source Control Instance – Visual Studio

git - GitHub for Windows Pre-Commit Hook - Stack Overflow

 

直接GitでコミットすればGitフックを起動できる

コマンドラインやGitGUIからのコミット時にはクライアントサイドフックが起動する。Visual Studioのチームエクスプローラの「操作」からコマンドラインもフォルダも開くことができるので、そこまで手間ではない。

私はGti詳しくないのでGitGUIでコミットしている。

 

おまけ:Gitフックからbatファイル実行

 任意のGitフックスクリプトに以下のスクリプトを書く

#!/bin/sh

cmd.exe /c "C:\path\to\somebatch.bat"

相対パスでバッチファイルを指定する場合、カレントディレクトリはリポジトリのルートであることに注意(.gitフォルダのある階層)

msbuild - how do I run cmd from the git post-commit hook - Stack Overflow

 

雑感

プライベートで一人でコードを書くときにはビルドとテストは確認してからコミットするので、調べたはいいけどあまり使用してないです。

でも使う前と比べてJenkinsのありがたみは分かってきました。もともとそれが目的だったので問題なし。