Skip to content

Commit 14ee4f7

Browse files
authored
Merge pull request #79 from arangodb/git-ci-integration
Control jenkins from git commit log.
2 parents 9cd6bd1 + 779772d commit 14ee4f7

File tree

1 file changed

+67
-23
lines changed

1 file changed

+67
-23
lines changed

Jenkinsfile.groovy

Lines changed: 67 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,67 @@ def notifySlack(String buildStatus = 'STARTED') {
1919
slackSend(color: color, channel: '#status-k8s', message: msg)
2020
}
2121

22+
def fetchParamsFromGitLog() {
23+
def myParams = [:];
24+
// Copy configured params
25+
for (entry in params) {
26+
myParams[entry.key] = entry.value;
27+
}
28+
29+
// Fetch params configured in git commit messages
30+
// Syntax: [ci OPT=value]
31+
// Example: [ci TESTOPTIONS="-test.run ^TestSimpleSingle$"]
32+
def options = sh(returnStdout: true, script: "git log --reverse remotes/origin/master..HEAD | grep -o \'\\[ci[^\\[]*\\]\' | sed -E \'s/\\[ci (.*)\\]/\\1/\'").trim().split("\n")
33+
for (opt in options) {
34+
def idx = opt.indexOf('=');
35+
if (idx > 0) {
36+
def key = opt.substring(0, idx);
37+
def value = opt.substring(idx+1).replaceAll('^\"|\"$', '');
38+
myParams[key] = value;
39+
//println("Overwriting myParams.${key} with ${value}");
40+
}
41+
}
42+
43+
// Show params in log
44+
for (entry in myParams) {
45+
println("Using myParams.${entry.key} with ${entry.value}");
46+
}
47+
48+
return myParams;
49+
}
50+
2251
def kubeConfigRoot = "/home/jenkins/.kube"
2352

24-
def buildTestSteps(String kubeConfigRoot, String kubeconfig) {
53+
def buildBuildSteps(Map myParams) {
54+
return {
55+
timestamps {
56+
withEnv([
57+
"DEPLOYMENTNAMESPACE=${myParams.TESTNAMESPACE}-${env.GIT_COMMIT}",
58+
"DOCKERNAMESPACE=${myParams.DOCKERNAMESPACE}",
59+
"IMAGETAG=jenkins-test",
60+
"LONG=${myParams.LONG ? 1 : 0}",
61+
"TESTOPTIONS=${myParams.TESTOPTIONS}",
62+
]) {
63+
sh "make"
64+
sh "make run-unit-tests"
65+
sh "make docker-test"
66+
}
67+
}
68+
}
69+
}
70+
71+
def buildTestSteps(Map myParams, String kubeConfigRoot, String kubeconfig) {
2572
return {
2673
timestamps {
2774
withCredentials([string(credentialsId: 'ENTERPRISEIMAGE', variable: 'DEFAULTENTERPRISEIMAGE')]) {
2875
withEnv([
29-
"DEPLOYMENTNAMESPACE=${params.TESTNAMESPACE}-${env.GIT_COMMIT}",
30-
"DOCKERNAMESPACE=${params.DOCKERNAMESPACE}",
31-
"ENTERPRISEIMAGE=${params.ENTERPRISEIMAGE}",
76+
"DEPLOYMENTNAMESPACE=${myParams.TESTNAMESPACE}-${env.GIT_COMMIT}",
77+
"DOCKERNAMESPACE=${myParams.DOCKERNAMESPACE}",
78+
"ENTERPRISEIMAGE=${myParams.ENTERPRISEIMAGE}",
3279
"IMAGETAG=jenkins-test",
3380
"KUBECONFIG=${kubeConfigRoot}/${kubeconfig}",
34-
"LONG=${params.LONG ? 1 : 0}",
81+
"LONG=${myParams.LONG ? 1 : 0}",
82+
"TESTOPTIONS=${myParams.TESTOPTIONS}",
3583
]) {
3684
sh "make run-tests"
3785
}
@@ -40,12 +88,12 @@ def buildTestSteps(String kubeConfigRoot, String kubeconfig) {
4088
}
4189
}
4290

43-
def buildCleanupSteps(String kubeConfigRoot, String kubeconfig) {
91+
def buildCleanupSteps(Map myParams, String kubeConfigRoot, String kubeconfig) {
4492
return {
4593
timestamps {
4694
withEnv([
47-
"DEPLOYMENTNAMESPACE=${params.TESTNAMESPACE}-${env.GIT_COMMIT}",
48-
"DOCKERNAMESPACE=${params.DOCKERNAMESPACE}",
95+
"DEPLOYMENTNAMESPACE=${myParams.TESTNAMESPACE}-${env.GIT_COMMIT}",
96+
"DOCKERNAMESPACE=${myParams.DOCKERNAMESPACE}",
4997
"KUBECONFIG=${kubeConfigRoot}/${kubeconfig}",
5098
]) {
5199
sh "make cleanup-tests"
@@ -66,31 +114,26 @@ pipeline {
66114
string(name: 'KUBECONFIGS', defaultValue: 'kube-ams1,scw-183a3b', description: 'KUBECONFIGS is a comma separated list of Kubernetes configuration files (relative to /home/jenkins/.kube) on which the tests are run', )
67115
string(name: 'TESTNAMESPACE', defaultValue: 'jenkins', description: 'TESTNAMESPACE sets the kubernetes namespace to ru tests in (this must be short!!)', )
68116
string(name: 'ENTERPRISEIMAGE', defaultValue: '', description: 'ENTERPRISEIMAGE sets the docker image used for enterprise tests)', )
117+
string(name: 'TESTOPTIONS', defaultValue: '', description: 'TESTOPTIONS is used to pass additional test options to the integration test', )
69118
}
70119
stages {
71120
stage('Build') {
72121
steps {
73-
timestamps {
74-
withEnv([
75-
"DEPLOYMENTNAMESPACE=${params.TESTNAMESPACE}-${env.GIT_COMMIT}",
76-
"DOCKERNAMESPACE=${params.DOCKERNAMESPACE}",
77-
"IMAGETAG=jenkins-test",
78-
"LONG=${params.LONG ? 1 : 0}",
79-
]) {
80-
sh "make"
81-
sh "make run-unit-tests"
82-
sh "make docker-test"
83-
}
122+
script {
123+
def myParams = fetchParamsFromGitLog();
124+
def buildSteps = buildBuildSteps(myParams);
125+
buildSteps();
84126
}
85127
}
86128
}
87129
stage('Test') {
88130
steps {
89131
script {
90-
def configs = "${params.KUBECONFIGS}".split(",")
132+
def myParams = fetchParamsFromGitLog();
133+
def configs = "${myParams.KUBECONFIGS}".split(",")
91134
def testTasks = [:]
92135
for (kubeconfig in configs) {
93-
testTasks["${kubeconfig}"] = buildTestSteps(kubeConfigRoot, kubeconfig)
136+
testTasks["${kubeconfig}"] = buildTestSteps(myParams, kubeConfigRoot, kubeconfig)
94137
}
95138
parallel testTasks
96139
}
@@ -101,10 +144,11 @@ pipeline {
101144
post {
102145
always {
103146
script {
104-
def configs = "${params.KUBECONFIGS}".split(",")
147+
def myParams = fetchParamsFromGitLog();
148+
def configs = "${myParams['KUBECONFIGS']}".split(",")
105149
def cleanupTasks = [:]
106150
for (kubeconfig in configs) {
107-
cleanupTasks["${kubeconfig}"] = buildCleanupSteps(kubeConfigRoot, kubeconfig)
151+
cleanupTasks["${kubeconfig}"] = buildCleanupSteps(myParams, kubeConfigRoot, kubeconfig)
108152
}
109153
parallel cleanupTasks
110154
}

0 commit comments

Comments
 (0)