CI/CD #04. Jenkins: trigger a Freestyle project via Git webhook.
We’re setting up a Jenkins “Freestyle project”, using “Execute shell” build step, to: ⓵ clone a Git repo, ⓶ create a virtual environment, ⓷ run editable install, and finally, ⓸ run Pytest. And this Jenkins job can be triggered remotely when we push some file(s) onto the target Git repo.
![]() |
|---|
| CI/CD #04. Jenkins: trigger a Freestyle project via Git webhook. |
We’re going to recreate the Freestyle project discussed in
CI/CD #01. Jenkins: manually clone a Python GitHub repo and run Pytest,
you don’t need to read this post, all necessary steps are described where appropriate.
❶ Log into Jenkins, click on + New Item. On the next page,
under Enter an item name, enter app_demo –
at runtime, Jenkins will create a directory with this name under Jenkins’
work directory, i.e. /var/lib/jenkins/workspace/app_demo.
And /var/lib/jenkins/workspace/app_demo is the value of the
WORKSPACE Jenkins environment variable.
❷ Select Freestyle project, then click on the
OK button to move to the Configuration
page.
For Description, write something meaningful, e.g.
CI/CD #04. Jenkins: trigger a Freestyle project via Git webhook.
The rest of the options are shown in the following two (2) screenshots:
Basically:
-
Repository URL:https://github.com/behai-nguyen/app-demo.git. -
Branch Specifier (blank for 'any'):*/main. -
MOST IMPORTANTLY, see the second screenshot, under
Build TriggerscheckGitHub hook trigger for GITScm polling. Without checking this option, Jenkins will not process the push events from Git, the on-screen explanation should sufficiently explain the purpose of this option.
Under Build Steps, pull down Add build step,
and select Execute shell, then paste in this content:
PYENV_HOME=$WORKSPACE/venv
# Delete previously built virtualenv
if [ -d $PYENV_HOME ]; then
rm -rf $PYENV_HOME
fi
# Create virtualenv and install necessary packages
virtualenv $PYENV_HOME
. $PYENV_HOME/bin/activate
$PYENV_HOME/bin/pip install -e .
$PYENV_HOME/bin/pytest

Finally, click on the Save button: we’re taken
to the app_demo project page.
❸ To test that this project is working, I removed app_demo/
from /var/lib/jenkins/workspace/. Then clicked on ▷ Build Now
to run the first build.
It ran successfully for me. And app_demo/ was created
under /var/lib/jenkins/workspace/, so was the virtual
directory app_demo/venv/.
Remove app_demo/ with:
jenkins@hp-pavilion-15:~/workspace$ rm -rf app_demo
❹ Next, we need to make our Jenkins server available publicly. For this,
we’re using ngrok – this has been discussed previously in
Install ngrok for Ubuntu 22.10 kinetic.
For Jenkins, the port is 8080:
$ ngrok http 8080
We’ll get something similar to the screenshot below:

In this instance, our Jenkins “public” URL is https://5b3c-58-109-142-244.ngrok-free.app.
For Git payload URL (discussed later), we need to append github-webhook/.
– Please notice that it is github-webhook/: DO NOT FORGET
the trailing /!
The complete Git payload URL is https://5b3c-58-109-142-244.ngrok-free.app/github-webhook/.
❺ The next step is to set up webhook for repo https://github.com/behai-nguyen/app-demo.git.
A similar process has been described before, in
Set up GitHub Webhook and test our server.
Follow the steps described below.
⓵ Go to https://github.com/behai-nguyen/app-demo.git, or yours one.
Click on Settings on top right hand corners, then click on
Webhooks on the left hand side bar.
⓶ On the next screen, click on the Add webhook button on the
top right hand corner.
⓷ On the next screen:
-
Payload URL *:https://5b3c-58-109-142-244.ngrok-free.app/github-webhook/-- the URL we've discussed above. -
Content type:application/json - I left everything else at their default values.
This screen should look like:

Click on the Add webhook button to continue.
Git should send a ping event, we should receive it successfully:
❻ Test the webhook. Let’s ensure our Jenkins session is still
active. Our project should show one successful build from the
previous manual run. And there is no app_demo/
under /var/lib/jenkins/workspace/.
I added another marker to D:\app_demo\pytest.ini, check this one in:

It should automatically trigger another build. The ngrok console shows another event:

Git records another successful push event, details should match our commit:

Refresh Jenkins, it should show another successful build:

The detail of the second build:
Note the second screenshot: there was only one test module
tests/functional/test_routes.py; and a total
of 5 passed, 1 warning.
❼ Test the webhook. Remove app_demo/ from /var/lib/jenkins/workspace/:
jenkins@hp-pavilion-15:~/workspace$ rm -rf app_demo/
Add another test module D:\app_demo\tests\jenkins_demo\test_push_01.py,
this module has only a single test method:

It should automatically trigger another build.
Both Git and ngrok should show another successful push event.
And Jenkins should show a third successful build:
The last screenshot shows the new test module, and the total tests increased
by 1 (one), to six (6): 6 passed, 1 warning.
And of course, app_demo gets recreated, together with the
virtual environment directory:

❽ Still testing the webhook. Leave everything as they are. Using GitHub UI,
I edit
https://github.com/behai-nguyen/app-demo/blob/main/tests/jenkins_demo/test_push_01.py,
adding the comment # This is a manual test comment.; and commit
the change:
Both Git and ngrok should show another successful push event.
That makes four (4) push events so far. The following screenshot, Git shows the
details of the push:

And Jenkins also shows a fourth (4th) successful build, whose details match the push event’s. There were no changes to code, tests should naturally pass and the total number of tests remains the same:

As the concluding remark to finish off this post. Are you wondering
why I use Freestyle project to explore Git webhook?
I started this post using both Pipeline implementations discussed in
CI/CD #03. Jenkins: using Pipeline and proper Bash script to run Pytest.
I could not get Jenkins to trigger the build. I need to do more studies
on this, and I will discuss my findings in later posts. And I still have
not come across any documentation explaining why Freestyle project
works in this instance. Studies and more studies 😂
Thank you for reading. I hope this post is informative. Stay safe as always.
✿✿✿
Feature image sources:
- https://www.omgubuntu.co.uk/2022/09/ubuntu-2210-kinetic-kudu-default-wallpaper
- https://pngimg.com/image/73422
- https://status.ngrok.com/
- https://seeklogo.com/vector-logo/332789/python
- https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Pytest_logo.svg/2048px-Pytest_logo.svg.png
- https://www.wildjar.com/platform/webhook-integration
