Jenkins CI: should I have a server for Jenkins and a dedicated slave for building? - jenkins

I am using Jenkins for CI,
I've heard that I should have a dedicated server and slave for running Jenkins and building tasks, respectively -
is this true?
I can understand this as the server may not be powerful enough to handle the server itself and running build tasks,
but is there any defined technical reason for this?

Best practice is to have a separate machine for Jenkins-Server,
and not to use it for builds at all.
This has nothing to do with CPU-power or memory-resources -
A build-machine should have a predefined configuration,
and Jenkins should not be part of it.
(Jenkins requirements may even conflict with those of the build-machine)
You should be able to boot / clone / upgrade / restore / trash the build-machine
without any impact on Jenkins.
Of course you can settle for a single machine, if your resources are limited,
but if you are serious about build-automation - Jenkins should have its own server.

You probably don't need dedicated hardware/VM to run a Jenkins server because the actual Jenkins process (no builds running) uses very little resources. But it all depends on what you want to accomplish with your Jenkins setup.
Do you want to run continuous builds across multiple platforms for multiple projects? Then using a master with slaves is the only way to go. If, on the other hand, you're running fairly simple builds for just a few projects, then you only need one machine to run the builds and the Jenkins process.
You can configure Jenkins to have multiple builds running concurrently so if you have a quad-core machine, you can safely run 2 builds and possibly a third once you analyze resource usage.
At my last gig, I used a quad-core machine with 8GB RAM to run:
Jenkins running Selenium builds
VirtualBox VM with Windows XP
Two instances of Tomcat each with two applications deployed.
And the machine still had more to spare.

Related

Jenkins: Execute a job where the project/workspace is located on other machine (LAN Network)

Having a PC for developing working with STS/Eclipse and Jenkins both working in the same machine and same time.
Now for pre-production testings is mandatory use servers running together such as ActiveMQ, RabbitMQ, MySQL, PostgreSQL
Due this the PC goes slower, even worst if SonarQube and JMeter are running.
The solution needed is have in the same LAN network two machines.
Machine A: with IDE just running with some servers running too, MySQL and ActiveMQ
Machine B: running Jenkins (and optionally SonarQube and JMeter)
Thus the tools dedicated for:
Continuous Integration (Jenkins)
Continuous Inspection (SonarQube)
Measure performance (JMeter)
are running in a dedicated machine, in this case B.
Currently when all is based in one machine. The following is used:
Thus Jenkins is able to work directly with the workspace
Therefore how through Jenkins or with a special plugin we can refer to execute a job, to execute a set of #Test, where the project (workspace) is located in other PC?
The project itself about all its #Test methods should be not aware that is being executed remotely from Jenkins
Should only exists one Jenkins server working over the network.
What is the best approach to accomplish this goal?

VMware or Docker containers for TeamCity CI

We have a setup of 200 VM's as Build Agents, working with TeamCity. We are thinking of saving the VMware License cost moving to Docker. Anyone having any prior experience on which would provide better performance?
My goal is not to compromise with performance, but if Docker gives even same performance as VMware, we'll switch to docker.
My build agent VM's runs on either windows or ubuntu. Builds on linux uses mainly Python, and windows system mainly uses Visual Studio (different versions). We'll be doing performance test ourselves, but I want to know if someone has done this before and experienced any benefits.
I've recently built my own ephemeral docker container build agents. I've been using them for about 4 months building for 25+ different projects. The dependency management is so much nicer than having different VM's running your build agent. You also have the option to have many build agents running on a single VM. I did not see a performance decrease when I switched from VM's to docker build agents. Using a swarm manager it is very easy to spin up more or less agents depending on your need.
If you are interested I also have a helpful script that automates authorizing a new agent from Docker. TeamCity has no way to automatically authorize an agent, it seems to have to be done through the API.
TL;DR Docker build agents are much easier to use, less overhead and ephemeral with no (visible) performance decrease.

Need suggestions to go with Jenkins master-Slave setup or not?

I have a 4-5 java projects build procedure to be configured as CI using Jenkins. Whether it will be time saving to build some/all projects on different machines(connected as Jenkins slaves)?
Are there some any other benefits of Jenkins Master-Slave configuration?
Offloading work to build agents is a very good idea as it keeps load away from the master. This allows you to build more projects in parallel (esp. with dynamic agents launched in some cloud environment).
Further, it makes the systems easier to maintain, as e.g. the Java version/setup of your build agents required to build and test your application does not interfere with the Jenkins master machine.

Jenkins & .NET Build server

I would like to raise from scratch a build server for .NET applications using Jenkins, please note that i'm new to Jenkins CI.
Several Questions:
1) How should I decide on the build server specs? except for the OS which would be windows server 2012, how should I decide on the RAM and the CPU and HD space?
2) Should the Jenkins sit in the build machine or not, what is the recommended approach? I understood that the build server should be isolated from the Jenkins master
3) How do I decide on the Master/Slave approach, when should I use only Master and when should I use master and slave or slaves?
4) How would you recommend me to run the build and deployment tasks in the Jenkins CI, using NAnt/Python or any other scripting language ?
10x, and sorry for the igonrance :)
Responding to each in turn:
You can run Jenkins as a windows service (instructions here) and the machine can be a VM, so it doesn't have to be huge.
a) RAM and CPU: I'll put these together and will depend on how many jobs you plan to have running at the same time. The default number of build executors is 3 but can be increased as a global config change.
b) HDD: This depends on how many jobs you plan to have. Jenkins will checkout the source code (as well as the compiled output) to its home directory on a per job basis. This can get big. I would also recommend using the ThinBackup plugin to backup the Jenkins configuration.
Jenkins is the build machine. A vanilla installation of Jenkins is the master. In my experience you will not need a separate slave machine unless you're needing to do native builds on other platforms or have LOTS and LOTS of jobs. I've seen single masters running happily with hundreds of jobs.
Further to 2. above, suggest you start with a master and set up a slave later if you really need one.
As you have stated you are building .NET applications, you can simply install the MSBuild plugin which should serve you well. Builds for .NET applications in Jenkins are Freestyle builds so you will be using Windows Batch build steps often as well. This also is a great blog on Jenkins in a .NET environment.

Is there a stable plugin for Jenkins for running builds on VMs?

Travis CI has a really nice feature, builds are run within VirtualBox VMs. Each time a build is started, the box is refreshed from a snapshot and the code copied on to it. Any problems with the build cannot affect the host, and you can use any OS to run your builds on.
This would be really good, for example, compiling and testing code on a guest OS that matches your production env. Also, you can keep your host free of any installation dependencies you might need (e.g. a database server) and run ITs without worrying about things like port conflicts.
Does such a thing exist for Jenkins?
Check out the Vagrant Plugin https://wiki.jenkins-ci.org/display/JENKINS/Vagrant-plugin
This plugin allows booting of Vagrant virtual machines, provisioning them and also executing scripts inside of them
You can run Jenkins in a Master Slave Setup. Your Master instance manages all the jobs but lets all the slaves do the actual work. These Slaves can be VMs or physical machines. Go To Manage Jenkins -> Manage Nodes -> New Node to add Nodes to your Jenkins Setup.
There is the vSphere Cloud Plugin and the Scripted Cloud Plugin that can be used for this purpose.

Resources