VST Plugins, Continuous Integration, Jenkins and JUCE on PC

Notes on creating a continuous integration pipeline for a JUCE VST3 plugin using Jenkins on a PC.
These are just a few notes about my experience creating a continuous integration (CI) system for my plugins. It is here mainly for my reference, and because I found very little help online about how to do this, so someone else may find this useful.
If you are not interested in CI pipelines used in VST plugin development then this document will be so very boring to you that you should not read it.
At the moment, 06/06/2025, The CI system consists of a git repository hosted at bitbucket.org and Jenkins running at home on both a PC and a Mac.
This document assumes a basic knowledge of git, and obviously JUCE plugin development.

Jenkins will:
1: Checkout the code from bitbucket.
2: Update a file called Version.h with the git commit number. This is displayed to the user in the info popup, under the plugin’s version number. This can be handy for bug reporting.
3: Run CMake, which creates a Microsoft Studio project. (An alternative is to use Projucer rather than CMake. This does work in CI, but I think CMake is a lot more flexible)
4: Build the project using MSBUILD.
5: Run Pluginval to do some tests on the plugin
6: Run Inno Setup to create an installer
The below assumes that the code base already has a git repository set up. This example uses a repository on bitbucket.org, though the procedure would not be so different on github.


1: Set up Jenkins
Download Jenkins from https://www.jenkins.io. (Though before you do this, make sure that you have the correct version of Java installed, as explained on the Jenkins website. Jenkins is made with Java.)
Because Jenkins running as a service cannot start a UI application, I ended up starting Jenkins from the command line rather than have it run as a service at startup of the PC. This is so Jenkins can run Pluginval, which opens the UI of the plugin to do tests. So, download the jenkins.war file and put it somewhere (like C:\Program Files\Jenkins). Next open a command line box, go to that folder and type:
java -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar jenkins.war –httpPort=9091
(This assumes that we are using port 9091, you can use 8080 or whatever.)
Follow instructions, don’t forget to copy the password printed to the command line as Jenkins gets up and running the first time, you will need this to start Jenkins the first time.

2: Get an access token for the git repository.
In bitbucket.org, go to the repository, then Settings, then Access Tokens. Follow the instructions. It will be a similar sort of thing in github.

3: Create a job in Jenkins.
Go to Jenkins in a browser at http://localhost:9091, or whatever port number was used above.
Do all the setup creating a user, with the password you got above from the command line output.
From Jenkins dashboard page click New Item, chose a name and select Freestyle Project.
In Project/Configure page:
Under Source Control Management select Git
In Repositories type the Git repository url, something like:
https://myUsername@bitbucket.org/myProjectName/myRepoName.git
Click Add Credentials and make a username/password pair with the bitbucket login and the access token you got from the bitbucket site.
In Branch Specifier I had to add “*/main”. Just use whatever git branch you want to build from.
At this point, going to the project page in Jenkins and hitting “Build Now” should fetch the code from the git repo, and do nothing else. It should indicate that the build was successful, though, as nothing went wrong.


4: Create the Microsoft Studio Project in Jenkins
Next, got to the “Build Steps” section of the configuration page for the project.
Choose “Add Build Step” and select “Execute Windows batch command”
Insert this line into the text box:
cmake -B Builds -G “Visual Studio 17 2022”
This assumes that the project in the git repository has a CMakeLists.txt file in the root directory which will build the project, and the machine on which Jenkins is running has CMake installed, and the path to the CMake executable is added to “Path” in the machine’s environment variables.
One thing to note that will become useful later if following these notes is one line added to the CMakeLists.txt file which will specify where the plugin’s vst3 file gets saved. This is because by default CMake will create a project that copies the built plugin to C:\Program Files\Common Files\VST3, which is where digital audio workstations like Cubase store their vst3 plugin files. I did not want to overwrite the plugin file that Cubase uses every time I build, and that folder is protected by default, so I added this to CMakeLists.txt:
juce_add_plugin(${PROJECT_NAME}
VST3_COPY_DIR “C:/VST3_COPY”
… blah blah blah etc
)

The name of the directory does not matter. I can’t remember if I had to manually create the directory, I think I did.
Anyway, so far this will get Jenkins to build a Microsoft Studio project (.sln file) which will build your plugin.

The above can be done with Projucer rather than CMake. Instead of the line from above:
cmake -B Builds -G “Visual Studio 17 2022”
you would use something like:
Projucer –resave Synth1.jucer
This would also create the .sln project file.
Use CMake though, it is better.


5: Include git commit hash in the source code
The next stage is optional. Its purpose is to add the git commit hash to the code base. This can be displayed in the “about” screen of the plugin along with the version number. It is useful for when a user reports a bug. They can quote this number and the developer knows exactly which git commit the plugin was built from.
There is a header file in the root of the project’s source folder call Version.h. It contains the line:
static const juce::String gitCommit = “undefined”;
In Jenkins, in the Windows batch command text box, just below the CMake or Projucer line already added, add:
powershell -Command “(gc Source/Version.h) -replace ‘undefined’, ‘%GIT_COMMIT%’ | Out-File -encoding ASCII Source/Version.h”
This will replace the word “undefined” in Version.h with the git commit hash.
There is probably a better way of doing this, like using #defines or something, but it works fine.

Saving and running “Build Now” in Jenkins should show success, though it has not actually built the project yet


6: Actually build the project in Jenkins
Next, in Jenkins, download MSBuild plugin. Do by going to Jenkins Dashboard, Manage Jenkins, then Plugins.
Make sure you have a correct version of msbuild installed on the machine. It should be there if you have Microsoft Visual Studio installed.
Go to Jenkins Dashboard, Manage Jenkins, Tools. Go to MSBuild installations and press “Add MSBuild”
Name it something. In “Path to MSBuild Installation” point it to your msbuild.exe file, Mine was at:
C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin
In Default parameters add:
/p:Configuration=Release

Go back to the Configuration page, under the build step added above, press “Add Build Step” again, and this time choose “Build a Visual Studio project or solution using MSBuild”. In MSBuild Version select the configurartion made above.
Under “Project File”, link to the .sln file (the Microsoft Studio project file) that CMake or Projucer created in the previous steps.
It will be something like:
Builds\MyPlugin.sln
This link is relative to the Jenkins workspace, which is where Jenkins does all it work, so the full link would look something like:
C:\Users\myName.jenkins\workspace\MyPlugin\Builds\VisualStudio2022\MyPlugin.sln


This should be enough to build the project when you hit the “Build Now” button in Jenkins. A built plugin should appear in the VST3_COPY folder you specified in the CMakeLists.txt file.


7: run Pluginval to test the plugin
Next, if we like, we can run Pluginval to do a few tests on the plugin file we just created.
To run Pluginval to test the plugin after building it, first install Pluginval from their site. Make sure the Pluginval executable is in the Path section of the machine’s environment variables. Then, in Jenkins, add another Build Step, after the MSBuild step. Select “Execute Windows batch command”

Add something like these two lines:
pluginval –strictness-level 8 “C:\VST3_COPY\tonebanger-1.vst3\Contents\x86_64-win\tonebanger-1.vst3”
if ERRORLEVEL 1 exit 1
Note: you will have to restart Jenkins after adding an environment variable. Kill the command box and start again.
The ERRORLEVEL line is there to tell Jenkins to fail the job if Pluginval fails.
When the Jenkins script gets to this point, Pluginval will open the UI of the vst3 plugin and do some tests, including turning all the knobs on the plugin like crazy, which is quite fun to watch.


8: Create an Installer
Next, we are going to package the plugin into an installer executable.
I used Inno Setup for this. There are plenty of tutorials online for using Inno Setup. You don’t need a tutorial which is specific to vst plugins, any will do. The Inno Setup GUI application helps you create a script, an .iss file. I called mine “inno_installer_script.iss”. Put this in the root directory of your project and then add and commit it to the git repository so that Jenkins will download it the next time you build. Also don’t forget to add the path to the Inno Setup application (for me it was” C:\Program Files (x86)\Inno Setup 6\”) to your environment variables Path, and restart Jenkins.
Next add a line like this at the end of the last build step Windows batch command box in Jenkins (i.e under “if ERRORLEVEL 1 exit 1”).
iscc /O”C:\VST3_COPY\Installer” inno_installer_script.iss
The next time you build the project an installer executable should appear in the “C:\VST3_COPY\Installer” folder, or wherever you specified.
Done for now!!!!!!!!!!


9: TODO
There is a load more stuff I can do, like automatically creating separate jobs for git branches, signing the executable from the Jenkins script, adding proper Unit tests, etc, etc. This, however, took me a little while to work out how to do it all, as there was not too much help that I found via Google. Next I have to document the same procedure for Jenkins on a Mac machine to generate the Mac version of the plugin.
If you have any questions, suggestions, or want to take issue with anything this document says, please email me at dom@tonebanger.com.
Thanks.

Scroll to Top