This is the third and last installment in the series I’m writing about SVN, Hudson and MSBuild.
Today I’m going to show you the last piece that actually makes the whole thing work. We could call this the plumbing. The piece lies within a specific SVN folder related to your project. It’s called hooks. The path to the hooks folder is this:
Figure 1 - Project’s hooks folder before the setup
As you can see there are some template files ( .tmpl ). The one we’re going to use to inform Hudson that it’s time to build the code just committed to the repository is the file post.commit.tmpl. Make a copy of this file and change its extension to .bat since it’ll be used by SVN to execute some commands. The file should be named post-commit.bat.
Open the .bat file and add this code at the end:
SET SVNLOOK=C:\Program Files\VisualSVN Server\bin\svnlook.exe
"%CSCRIPT%" "%VBSCRIPT%" "%REPOS%" %REV% "%SVNLOOK%" %HUDSON%
Note above that we’re setting some vars and pointing to some specific files:
- CSCRIPT points to cscript.exe file that should be present in your Windows system32 folder.
- VBSCRIPT points to to the post-commit-hook-hudson.vbs file and its code is as follows:
repos = WScript.Arguments.Item(0)
rev = WScript.Arguments.Item(1)
svnlook = WScript.Arguments.Item(2)
hudson = WScript.Arguments.Item(3)
Set shell = WScript.CreateObject("WScript.Shell")
Set uuidExec = shell.Exec(svnlook & " uuid " & repos)
Do Until uuidExec.StdOut.AtEndOfStream
uuid = uuidExec.StdOut.ReadLine()
Wscript.Echo "uuid=" & uuid
Set changedExec = shell.Exec(svnlook & " changed --revision " & rev & " " & repos)
Do Until changedExec.StdOut.AtEndOfStream
changed = changed + changedExec.StdOut.ReadLine() + Chr(10)
Wscript.Echo "changed=" & changed
url = hudson + "subversion/" + uuid + "/notifyCommit?rev=" + rev
Set http = CreateObject("Microsoft.XMLHTTP")
http.open "POST", url, False
http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8"
- SVNLOOK points to svnlook.exe file that comes with VisualSVN Server (see part 1 of this series for more details about it).
- HUDSON points to your Hudson server address. Change it accordingly.
With it all configured we should be ready to get an automatic build when code is committed to the repository.
To test your environment, change any file already versioned and commit it. Open Hudson in your browser and watch a new build start automatically.
If you look in Hudson’s build Console Output you’ll see that the build was initiated by an SCM change.
This is how your SVN project hooks folder should look like now:
Figure 2 - Project’s hooks folder after the setup
Can you spot another .bat file in the folder? It’s the pre-revprop-change.bat. I’ve been using it so that I can modify the commit’s log message/comment when I forget to mention something or to correct spelling. More info about this file can be seen in this StackOverflow question: What is a pre-revprop-change hook in SVN and how do I create it?