The following post is an example of how to set up a git post-receive hook to trigger a Jenkins build. As soon as someone checks in new code and pushes it to the develop branch then we need to ensure a fast feedback loop.
Hook templates
For every git project there will be a folder called ‘.git’. Inside of it there will be a hooks folder with default sample scripts which are well-commented.
You might notice that there is no post-receive sample and the git documentation it mentions there is a sample script called post-receive-email in the git repository. For a summarized version of this, visit this github page for post-receive sample.
In a nutshell, the 3 main parameters needed for the script are ” {oldrev} {newrev} {refname}” via standard input (stdin) where rev refers to the revision. In order to read from it, we need to use a while construct – how to get the refname.
Set up the post-receive hook
Create a file called “post-receive” in .git/hooks/ on the git server repo where you will push code to.
Now to make good use of the incoming parameters, we need to do something with them. In this case we want to make sure that the branch where the code was pushed to is in fact ‘develop’ before triggering the build. Git has a command called rev-parse that will allow us to transform this data.
View reference documentation for rev-parse:
$ git rev-parse --help OR $ git help rev-parse
Add in the logic and replace placeholders:
#!/bin/sh project_name='{Project Name}' job_name=$project_name'-pipeline' branch_to_build='develop' echo ============================================================ echo Post receive event for $project_name while read oldrev newrev refname do branch=$(git rev-parse --symbolic --abbrev-ref $refname) if [ $branch_to_build == "$branch" ]; then echo Changes detected on branch: $branch echo Triggering $project_name pipeline on Jenkins. url='http://{ip_addr}:{port}/{context}/job/'$job_name'/buildWithParameters' # Post is inferred curl --user {user}:{token} -s $url \ --data-urlencode json='{"parameter": [{"name":"BRANCH", "value":"'$branch_to_build'"}]}' fi done echo ============================================================
Jenkins uses a concept of parameterized builds. These can be triggered using a remote access API which is what the above HTTP Post curl request will do.
More information: