Question

I am trying to get CI going with Jenkins. To date, we have been performing two scheduled builds in our environment, but our dev staff wants to get CI working. I have followed the instruction outlined in the Jenkins Subversion Plugin wiki page:

https://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin

This got me to a script that executes at the command line just fine, however when I commit a change in Subversion (using the TortoiseSVN client), the commit seems to hang and I don't see Jenkins getting notified.

Here is my script:

#!/bin/sh

REPOS="$1"
REV="$2"
UUID=`svnlook uuid $REPOS`
XSLT_FILE=/var/www/svn/codelog.xslt
RSS_FILE=/var/www/html/code_all.rss
MAX_RESULTS=40

/usr/bin/wget \
  --auth-no-challenge \
  --no-check-certificate \
  --header "Content-Type:text/plain;charset=UTF-8" \
  --post-data "`svnlook changed --revision $REV $REPOS`" \
  --output-document "-" \
  --timeout=2 \
  https://192.168.100.16/subversion/${UUID}/notifyCommit?rev=$REV
svn log "file://$REPOS" --limit "$MAX_RESULTS" -v --xml | xsltproc "$XSLT_FILE" - > "$RSS_FILE"

The RSS feed was already in the script. That has been working for over a year.

I have updated the file permissions as well, in case that was the problem:

[root@Subversion hooks]# ls post-commit -ao
-rwxrwxr-x 1 apache 530 Jul 17 06:27 post-commit
Était-ce utile?

La solution

I have never liked how the SVN Plugin page is written. It is to easy to read it to say that you need to set up a Post Commit Hook in SVN to make things work. You Don't!

We have about 10 builds on our Jenkins box. All of them are linked to SVN repositories, and all a triggered by changes in the SVN repository. None of them rely on having to use a Post Commit Hook in SVN.

To do this, we have configured the builds to simply "Poll SCM" on a schedule. The "commit" builds use a schedule of "*/5 * * * *". This polls every 5 minutes. Our "daily" builds use a schedule of "1 1 * * *" so that the builds would kick off at 1:01 AM if there are any changes.

Autres conseils

In order to enable push mode in Jenkins, you should enable the Poll SCM build trigger in configuration page of your job. It tells Jenkins that it should build the job whenever SCM changes occur.

Because you don't have to do any polling (you get the info from the hook) you can leave the field blank.

Please take a look at your URL. Since Jenkins is a web application running in a servlet container the following one must work:

http(s)://server_name:server_port/application_name/subversion/${UUID}/notifyCommit?rev=$REV"

The idea is to pass

"subversion/${UUID}/notifyCommit?rev=$REV"

to the right place.

Try increasing your timeout -- 2 seconds is like... Too low.

This is what works for me:

/usr/bin/wget --http-user=jenkins \
              --http-passwd=passwordGoesHere \
              --header "Content-Type:text/plain;charset=UTF-8" \
              --post-data "`svnlook changed --revision $REV $REPOS`" \
              --output-document "/var/log/svn/svn-notify-commit-post" \
              --timeout=10 \
              --read-timeout=10 \
              --tries=2 \
              "http://jenkins:8082/jenkins/subversion/${UUID}/notifyCommit?rev=$REV" \
              >> /var/log/svn/svn-notify-commit-post.log 2>&1

(Make sure you have a /var/log/svn directory owned by the proper user).

Also, enable SCM polling and set a cron rule like */30 * * * *.

Did you check if you have SELinux enabled?

I had the same problem and wrote a solution here https://stackoverflow.com/a/15408506/2169568

The error I was getting was that it could not connect to the url (but when invoking it from commandline it did work).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top