Skip to content

Installing Jenkins

Ben Heasly edited this page Jan 23, 2017 · 27 revisions

One good use for MatlabJobSupport will be to run automated tests and validations on a remote Jenkins server. This page is about how to install Jenkins and integrate with GitHub and Matlab.

See Creating Jenkins Tests for more about setting up tests for specific projects.

Work in progress. Coming soon...

Installing Jenkins

EC2 Instance

We need a server to run Jenkins. In order for Jenkins to run MatlabJobSupport jobs, the server also needs to have Matlab and Docker installed.

In the Brainard Lab AWS account, we have machine image all set up for this. It's the AMI called RTB Jobs 9.

For these instructions, I will refer to an instance that I just now set up and I hope to leave running. Here are its stats:

  • AMI RTB Jobs 9
  • instance type m4.large
  • IAM role ecsInstanceRole
  • 50GB "GP2" SSD root volume
  • Name = Jenkins
  • security sroups all-ssh and web
  • SSH key pair named render-toolbox
  • elastic IP address 50.112.42.141

I can SSH to this instance with:

ssh -i render-tooblox.pem [email protected]

Jenkins Setup

To set up Jenkins on this instance, I am following the Jenkins wiki. I used the sections "Installation" and "Using Linux iptables for port 80 -> 8080", just as written.

Installation

wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

Using Linux iptables for port 80 -> 8080

#Requests from outside
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
#Requests from localhost
sudo iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

Browser Test

Then I was able to access Jenkins at its elastic IP address. Here.

Initial Password

Jenkins starts with a special initial admin password. I was able to discover this from the SSH terminal using either of these commands:

# either
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

# or
cat /var/log/jenkins/jenkins.log

Docker Group

For MatlabJobSupport, we want Jenkins to be able to invoke Docker commands. So we need to put the jenkins user into the docker group.

sudo gpasswd -a jenkins docker
sudo service docker restart
sudo service jenkins restart

GitHub Integration

Test out GitHub integration. Using advice on this blog, about a similar CI setup with GitHub, Jenkins, and Docker (but not Matlab), and Jenkins official but cryptic docs http://www.therightcode.net/use-docker-jenkins-to-run-github-tests/ https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin

User access, tokens, etc

Need to create ssh key for jenkins user sudo passwd jenkins su jenkins ssh-keygen -t rsa -b 4096 -C "[email protected]" eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa exit

Need to add jenkins ssh key to GitHub su jenkins cat ~/.ssh/id_rsa.pub

copy it

exit

GitHub log in as [email protected]

add ssh key

Need to connect GitHub and Jenkins Add jenkins user to GitHub render toolbox org. At GitHub user settings, create Person Access Token with sensible scopes: repo admin:org admin:repo_hook admin:org_hook notifications In Jenkins Manage Jenkins -> Configure System -> Add GitHub Server Add Credentials, Secret Text, Secret: Personal Access Token, name: "GitHub" In Credentials drop-down, select "GitHub" Test Connection Save

Test It Out

Need to set up a job to be triggered by GitHub In Jenkins Select a job Choose "GitHub project", add URL In Source Code Management, choose "git", add URL, branches to build "/" Choose "Build when a change is pushed to GitHub" Add post-build action "set GitHub commit status", use Status Result: "one of default messages and statuses" Make a test change at github Status shows in commit log Status shows in PR discussion

Matlab Integration

TAP plugin

http://blogs.mathworks.com/developer/2016/09/29/tap-with-yaml/ http://blogs.mathworks.com/developer/2016/10/24/passing-diagnostics/ http://blogs.mathworks.com/developer/2016/10/31/diagnostic-records/ http://blogs.mathworks.com/developer/2016/11/17/test-report/

http://blogs.mathworks.com/developer/2015/01/20/the-other-kind-of-continuous-integration/?s_tid=srchtitle

Status Badges

For example, in README. Or anywhere. Embeddabel Build Status plugin.

Install "Embeddable Build Status" plugin Choose a job -> Embeddable Build Status -> copy "protected" url Paste url into eg GitHub README Install "Role-based Authorization Strategy" plugin Manage Jenkins -> Configure Global Security Choose "Role-Based Strategy" Manage Jenkins -> Manage and Assign Roles -> Manage Roles Global roles, create "anonymous", check "ViewStatus" Manage Jenkins -> Manage and Assign Roles -> Assign Roles Global roles, for "Anonymous", check "anonymous" Check GitHub README

Clone this wiki locally