Julien Eid created BIGTOP-1368:
----------------------------------

             Summary: Have Jenkins use Mesos-Jenkins plugin to create 
containerized build slaves
                 Key: BIGTOP-1368
                 URL: https://issues.apache.org/jira/browse/BIGTOP-1368
             Project: Bigtop
          Issue Type: Improvement
          Components: Build
            Reporter: Julien Eid


This ticket is about changing our Jenkins setup to do builds inside of 
containers so that we can auto-configure slaves and cleanup our environment as 
well as match containers that developers can use to build Bigtop.

I recommend using the Jenkins Mesos plugin 
(https://github.com/jenkinsci/mesos-plugin) to start Jenkins slaves, 
orchestrate and run jobs in containers, and handle resource allocation to 
different slave containers that start up. Apache Mesos handles the launching of 
containers and limiting containers resources so that slaves won’t starve each 
other out for resources while the Jenkins Mesos plugin sits on top of Mesos and 
starts the slave.jar inside of the container which will then run the Jenkins 
building the BigTop package you want or doing whatever tests you need in the 
isolated environment. It would also not require much changing of our current 
Jenkins setup to get it integrated and build steps for most projects would be 
unchanged. You would just install mesos-master somewhere and then install 
mesos-slave on all of the servers that currently do job builds, and Mesos will 
handle using them all and spinning up the Jenkins slaves.

While the above allows you to do BigTop builds in containers using Jenkins, we 
should also do some more things to make life easier. We can use the Jenkins 
Mesos plugin to run Docker in Docker (dind) so that inside of our Jenkins slave 
containers we can launch a Docker container inside of that to build Docker 
images for deployment. For example, you could have a Jenkins job that is kicked 
off inside of a container that then starts and builds a base Docker image that 
will later build a specific package on another job. This would allow our 
Jenkins setup to build and test our Puppet toolchain code and then produce 
images that would be used by other jobs for builds. This is documented and 
talked a lot about here: 
http://www.ebaytechblog.com/2014/04/04/delivering-ebays-ci-solution-with-apache-mesos-part-i/#.U7R4t3VdVhF
 

As for matching builds on peoples computers, that gets pretty easy with Docker. 
You can just take the Jenkins Slave docker image and then run jobs against it 
without starting the slave.jar. So instead of docker run supervisord which you 
would do to get the Jenkins slave running, you can do docker run make hive-deb 
or whatever package you wanted. This would make peoples environments match our 
Jenkins environment exactly.

I have an experimental git repo with some Dockerfiles that are a pretty good 
prototype of this future setup located at 
https://github.com/jeid64/bigtop-dockerfiles jenkins-docker/ has an example 
Ubuntu 12.04 Dockerfile that once built uses the Puppet manifests in 
bigtop_toolchain to setup the build environment. When run by Jenkins, Jenkins 
will start a slave inside of the container and the slave would handle all the 
build steps for that build. That image can also just be used on your desktop 
without needing a Jenkins master or using anything from Jenkins. 

Also in that repo is jenkins-dind/ which is based off of 
https://github.com/ahunnargikar/jenkins-dind multi-docker setup. This will be 
the image for dind image builds in Jenkins for build environments.

I would love to head up this ticket and work on getting everything setup.




--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to