HowTo setup automatic refresh of repositories in Redmine on commit » History » Version 17

Ruslan Khasanov, 2012-08-02 11:52

1 1 Etienne Massip
h1. HowTo setup automatic refresh of repositories in Redmine on commit
2 4 Mischa The Evil
3 4 Mischa The Evil
{{>toc}}
4 1 Etienne Massip
5 15 Etienne Massip
Since of version 0.9.0, you can use an HTTP GET submission to automatically refresh Redmine after you committed your modification in your repository.
6 1 Etienne Massip
7 10 Maxim Strukov
Examples:
8 1 Etienne Massip
9 1 Etienne Massip
* _/sys/fetch_changesets?key=<your service key>_ fetches changesets for all active projects
10 7 Felix Schäfer
* _/sys/fetch_changesets?id=<project identifier>&key=<your service key>_ fetches changesets from the repository of a specific project
11 1 Etienne Massip
12 16 Mohit Sindhwani
*Notice:* 
13 16 Mohit Sindhwani
* Instead of calling an url, you can use @ruby /path_to_redmine/redmine/script/runner "Repository.fetch_changesets" -e production > /dev/null 2>&1 &@.
14 16 Mohit Sindhwani
* Note also that project identifier can either be the number of the project, e.g. @id=1@ or the identifier name that you gave the project, e.g., @id=mobileapp@
15 13 C. X.
16 1 Etienne Massip
See #2925 for original feature request.
17 1 Etienne Massip
18 1 Etienne Massip
h2. Step 1 : configure Redmine to accept the request
19 1 Etienne Massip
20 1 Etienne Massip
Web service for repositories must by activated in the Administration menu and the generated key will have to be used by the caller in Step 2.
21 1 Etienne Massip
22 1 Etienne Massip
h2. Step 2 : setup a post-commit script on the SCM server
23 1 Etienne Massip
24 1 Etienne Massip
You have to setup a post-commit script which will call the previous URL.
25 1 Etienne Massip
26 1 Etienne Massip
h3. Subversion
27 1 Etienne Massip
28 8 Etienne Massip
Simply add a @post-commit@ (or @post-commit.cmd@ on a Windows system) script file in the hooks sub-directory which contains the HTTP request call :
29 8 Etienne Massip
<pre><code class="sh">
30 1 Etienne Massip
#!/bin/sh
31 1 Etienne Massip
32 6 Jürgen Hörmann
curl "http://<redmine url>/sys/fetch_changesets?key=<your service key>"
33 8 Etienne Massip
</code></pre>
34 12 razumuhin map
or if you want to use wget 
35 12 razumuhin map
<pre><code class="sh">
36 12 razumuhin map
wget "http://your/redmine/path/sys/fetch_changesets?key=<API KEY>"
37 12 razumuhin map
</code></pre>
38 12 razumuhin map
Note: Don`t forget wget in your computer path.
39 11 razumuhin map
40 1 Etienne Massip
Or, on a Windows system (2 files) :
41 1 Etienne Massip
42 8 Etienne Massip
* @post-commit.cmd@ :
43 8 Etienne Massip
<pre><code class="cmd">
44 2 Etienne Massip
cscript "%~dp0refresh_redmine.vbs" //Nologo >> "%~dp0refresh_redmine.log" 2>&1
45 8 Etienne Massip
</code></pre>
46 1 Etienne Massip
47 8 Etienne Massip
* @refresh_redmine.vbs@ :
48 8 Etienne Massip
<pre><code class="vbs">
49 1 Etienne Massip
private const REDMINE_SERVICE_KEY = "<your service key>"
50 1 Etienne Massip
51 15 Etienne Massip
Call HTTPGet("http://<redmine url>/sys/fetch_changesets?key=" & REDMINE_SERVICE_KEY)
52 1 Etienne Massip
53 15 Etienne Massip
Private Function HTTPGet(sUrl)
54 15 Etienne Massip
  Dim oHTTP
55 1 Etienne Massip
  set oHTTP = CreateObject("Microsoft.XMLHTTP")
56 15 Etienne Massip
  oHTTP.open "GET", sUrl, False
57 15 Etienne Massip
  oHTTP.send
58 15 Etienne Massip
  HTTPGet = oHTTP.responseText
59 1 Etienne Massip
End Function
60 8 Etienne Massip
</code></pre>
61 17 Ruslan Khasanov
or for https
62 17 Ruslan Khasanov
<pre><code class="vbs">
63 17 Ruslan Khasanov
private const REDMINE_SERVICE_KEY = "<your service key>"
64 17 Ruslan Khasanov
65 17 Ruslan Khasanov
Call HTTPGet("https://<redmine url>/sys/fetch_changesets?id=<your project id>&key=" & REDMINE_SERVICE_KEY)
66 17 Ruslan Khasanov
67 17 Ruslan Khasanov
Private Function HTTPGet(sUrl)
68 17 Ruslan Khasanov
  Dim oHTTP
69 17 Ruslan Khasanov
  set oHTTP = CreateObject("MSXML2.ServerXMLHTTP")
70 17 Ruslan Khasanov
  oHTTP.open "GET", sUrl, False
71 17 Ruslan Khasanov
  oHTTP.setOption 2, 13056
72 17 Ruslan Khasanov
  oHTTP.send
73 17 Ruslan Khasanov
  HTTPGet = oHTTP.responseText
74 17 Ruslan Khasanov
End Function
75 17 Ruslan Khasanov
</code></pre>
76 9 András Veres-Szentkirályi
77 9 András Veres-Szentkirályi
h3. Git
78 9 András Veres-Szentkirályi
79 9 András Veres-Szentkirályi
Simply add a @post-receive@ (even on a Windows system, no extension is required) script file in the hooks sub-directory which contains the HTTP request call:
80 9 András Veres-Szentkirályi
81 9 András Veres-Szentkirályi
<pre><code class="sh">
82 9 András Veres-Szentkirályi
#!/bin/sh
83 9 András Veres-Szentkirályi
84 9 András Veres-Szentkirályi
curl "http://<redmine url>/sys/fetch_changesets?key=<your service key>"
85 9 András Veres-Szentkirályi
</code></pre>
86 9 András Veres-Szentkirályi
87 9 András Veres-Szentkirályi
This setup works in the "usual" case, where Redmine's repository is set to a bare Git repository, so no commits can happen directly in there. If you have a rare setup with a non-bare repository linked to Redmine, you need to add the script as a @post-commit@ hook as well.
88 9 András Veres-Szentkirályi
89 9 András Veres-Szentkirályi
Don't forget to make the file(s) executable on UNIXish systems, more information about Git hooks can be found in the "githooks":http://www.kernel.org/pub/software/scm/git/docs/githooks.html man page.
90 14 Hadrien KOHL
91 14 Hadrien KOHL
h3. Only update relevant project
92 14 Hadrien KOHL
93 14 Hadrien KOHL
/sys/fetch_changesets accepts id parameter, so you can limit the refrech to the correct project : 
94 14 Hadrien KOHL
95 14 Hadrien KOHL
<pre><code class="sh">
96 14 Hadrien KOHL
#!/bin/bash
97 14 Hadrien KOHL
98 14 Hadrien KOHL
_apikey=XXXXXXXXXXXXXXXXXXXX
99 14 Hadrien KOHL
100 14 Hadrien KOHL
_projectid=${PWD##*/}
101 14 Hadrien KOHL
_projectid=${_projectid%*.git}
102 14 Hadrien KOHL
103 14 Hadrien KOHL
curl "http://<redmine url>/sys/fetch_changesets?key=$_apikey&id=$_projectid"&
104 14 Hadrien KOHL
</code></pre>