Add dockerized ci infrastructure

Change-Id: I30c4a028c75dbbd50675312cea2861fa419c1101
Reviewed-on: https://forge.frm2.tum.de/review/18617
Tested-by: JenkinsCodeReview <bjoern_pedersen@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Bjoern Pedersen <bjoern.pedersen@frm2.tum.de>
This commit is contained in:
Björn Pedersen
2018-08-13 14:17:35 +02:00
committed by Bjoern Pedersen
parent 7e54cd93b7
commit 8c5f602a99
3 changed files with 172 additions and 0 deletions

37
ci/Dockerfile Normal file
View File

@ -0,0 +1,37 @@
FROM debian:8 AS base
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get upgrade && \
apt-get install --no-install-recommends --no-install-suggests -y \
gcc \
git \
openssh-client \
make \
python \
python-dev \
python-virtualenv \
virtualenv
ENV LC_ALL=C.utf8
ENV LANG=C.utf8
ENV LANGUAGE=C.utf8
# Add user jenkins to the image
RUN groupadd -g 1001 jenkins && \
useradd -m -u 1001 -g 1001 -d /home/jenkins2 -s /bin/bash jenkins && \
mkdir /home/jenkins && chown jenkins:jenkins /home/jenkins && \
echo "jenkins:jenkins" | chpasswd
USER jenkins
RUN virtualenv /home/jenkins/secopvenv
FROM base AS docs
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y --no-install-suggests --no-install-recommends \
texlive-latex-extra \
texlive-latex-base \
texlive-latex-recommended \
texlive-base \
texlive-binaries

112
ci/Jenkinsfile vendored Normal file
View File

@ -0,0 +1,112 @@
properties([
buildDiscarder(logRotator(artifactDaysToKeepStr: '',
artifactNumToKeepStr: '',
daysToKeepStr: '',
numToKeepStr: '50')),
parameters([
string(defaultValue: 'sine2020/secop/playground',
description: '', name: 'GERRIT_PROJECT'),
string(defaultValue: 'master',
description: '', name: 'GERRIT_BRANCH'),
string(defaultValue: 'refs/heads/master',
description: '', name: 'GERRIT_REFSPEC'),
choice(choices: '''\
patchset-created
ref-updated
change-merged''',
description: '', name: 'GERRIT_EVENT'),
choice(choices: '''\
patchset-created
ref-updated
change-merged''',
description: '', name: 'GERRIT_EVENT_TYPE')])
])
this.verifyresult = [:]
def run_tests(pyver)
{
writeFile file: 'setup.cfg', text: '''
[tool:pytest]
addopts = --junit-xml=pytest.xml --junit-prefix=''' + pyver
def status = "OK"
verifyresult.put(pyver, 0)
try {
timeout(5) {
sh '''\
#!/bin/bash
. /home/jenkins/secopvenv/bin/activate
pip install -r requirements-dev.txt
pip install -r requirements.txt
make test
'''
verifyresult.put(pyver, 1)
}
} catch (all) {
currentBuild.result = 'FAILURE'
status = 'FAILURE'
verifyresult.put(pyver, -1)
}
gerritverificationpublisher([
verifyStatusValue: verifyresult[pyver],
verifyStatusCategory: 'test ',
verifyStatusName: 'pytest-'+pyver,
verifyStatusReporter: 'jenkins',
verifyStatusRerun: '!recheck'])
step([$class: 'JUnitResultArchiver', allowEmptyResults: true,
keepLongStdio: true, testResults: 'pytest.xml'])
if (status == 'FAILURE') {
throw new Exception('Failure in test with ' + pyver)
}
}
node("master") {
stage('clean workspace')
{
cleanWs()
}
stage('checkout') {
checkout poll: false,
scm: [$class: 'GitSCM',
branches: [[name: '${GERRIT_BRANCH}']],
doGenerateSubmoduleConfigurations: false,
extensions: [
[$class: 'CleanCheckout'],
[$class: 'hudson.plugins.git.extensions.impl.BuildChooserSetting',
buildChooser: [$class: "com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTriggerBuildChooser"]],
],
submoduleCfg: [],
userRemoteConfigs:
[[
refspec: GERRIT_REFSPEC,
credentialsId: 'jenkins_ecdsa_x',
url: 'ssh://jenkins@forge.frm2.tum.de:29418/${GERRIT_PROJECT}']]]
sh 'git show'
}
stage('(re-)generate image') {
try {
sh '''#!/bin/bash
git worktree add tmpmaster refs/changes/17/18617/8
cd tmpmaster
docker build --target base --tag jenkinsng.admin.frm2:5000/secop_base:latest \
--tag secop_base:latest ci
cd ..
rm -rf tmpmaster
'''
} catch (all) {
}
}
stage('execute tests') {
img = docker.image('jenkinsng.admin.frm2:5000/secop_base:latest')
img.pull()
img.inside {
run_tests('python2')
}
}
}

23
ci/README Normal file
View File

@ -0,0 +1,23 @@
This directory contains the necessary files for running tests inside a docker container.
The Dockerfile defines two images:
- base
-> this is the image used for testing
- docs
-> Include a latex install for sphinx pdf builds
(The following assumes you have a docker daemon running on your working computer)
To create the images:
docker build --target <base|docs> --tag secop_<base|docs>:latest .
To test images interactivly:
docker run -u jenkins -i -t secop<base|docs> /bin/bash
The Jenkinsfile uses this Dockerfile (only approved checked-in versions from master)
to build the images (a rebuild will only happen if the Dockerfile is changed as docker
caches the images and build information) and run the test suite inside the container.
(Note: The initial version still has some bootstrapping glue, that will get
changed in a followup).