-
Notifications
You must be signed in to change notification settings - Fork 3
/
Jenkinsfile
134 lines (126 loc) · 6.76 KB
/
Jenkinsfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
properties([
parameters([
string(name: 'REPO_TO_TEST',
defaultValue: 'deepomatic/dmake',
description: 'The repository to check out.'),
string(name: 'BRANCH_TO_TEST',
defaultValue: env.CHANGE_BRANCH ?: env.BRANCH_NAME,
description: 'The branch to check out. Only used when testing a directory different from deepomatic/dmake.'),
string(name: 'DEPLOY_BRANCH_TO_TEST',
defaultValue: env.CHANGE_TARGET ?: 'master',
description: 'The target branch to use for kubernetes deployment dry-run test.'),
string(name: 'DMAKE_APP_TO_TEST',
defaultValue: '*',
description: 'Application to test. You can also specify a service name if there is no ambiguity. Use * to force the test of all applications.'),
booleanParam(name: 'DMAKE_WITH_DEPENDENCIES',
defaultValue: true,
description: 'Also execute with service dependencies if checked'),
string(name: 'DMAKE_COMMAND',
defaultValue: 'test',
description: 'dmake command to execute'),
booleanParam(name: 'DMAKE_SKIP_TESTS',
defaultValue: false,
description: 'Skip tests if checked'),
booleanParam(name: 'DMAKE_DEBUG',
defaultValue: true,
description: 'Enable dmake debug logs'),
booleanParam(name: 'DMAKE_PAUSE_ON_ERROR_BEFORE_CLEANUP',
defaultValue: true,
description: 'Ask user confirmation before DMake cleanup.'),
booleanParam(name: 'DMAKE_FORCE_BASE_IMAGE_BUILD',
defaultValue: false,
description: 'Force base image build (don\'t use base image cache)'),
string(name: 'CUSTOM_ENVIRONMENT',
defaultValue: '',
description: '(optional) Custom environment variables, for custom build. Example: \'FOO=1 BAR=2\''),
booleanParam(name: 'ABORT_OLD_BUILDS_ON_PR',
defaultValue: true,
description: 'Abort old builds when job is for a PR.'),
]),
pipelineTriggers([])
])
// Abort old builds for PRs
// from https://issues.jenkins.io/browse/JENKINS-43353?focusedCommentId=395851&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-395851
def is_pr = !!env.CHANGE_BRANCH // For PRs Jenkins will give the source branch name
if (is_pr && params.ABORT_OLD_BUILDS_ON_PR) {
def buildNumber = env.BUILD_NUMBER as int
if (buildNumber > 1) milestone(buildNumber - 1)
milestone ordinal: buildNumber, label: 'Abort old builds'
}
node {
def self_test = (params.REPO_TO_TEST == 'deepomatic/dmake')
def dmake_with_dependencies = params.DMAKE_WITH_DEPENDENCIES ? '--dependencies' : '--standalone'
stage('Setup') {
checkout scm
try {
sh 'git submodule update --init'
} catch(error) {
deleteDir()
checkout scm
sh 'git submodule update --init'
}
// Use this version of dmake
env.PYTHONPATH = "${env.WORKSPACE}:${env.PYTHONPATH}"
env.PATH = "${env.WORKSPACE}/dmake:${env.WORKSPACE}/dmake/utils:${env.PATH}"
// Clone repo to test
sh ("echo 'Cloning ${params.BRANCH_TO_TEST} from https://github.com/${params.REPO_TO_TEST}.git'")
checkout changelog: false,
poll: false,
scm: [$class: 'GitSCM', branches: [[name: params.BRANCH_TO_TEST]], doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'WipeWorkspace'],
[$class: 'RelativeTargetDirectory', relativeTargetDir: 'workspace'],
[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: false, recursiveSubmodules: true, reference: '', trackingSubmodules: false],
[$class: 'LocalBranch', localBranch: params.BRANCH_TO_TEST]],
submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'dmake-http', url: "https://github.com/${params.REPO_TO_TEST}.git"]]]
// Setup environment variables as Jenkins would do
env.REPO=params.REPO_TO_TEST
env.BRANCH_NAME=params.BRANCH_TO_TEST
if (!self_test) {
env.BUILD_ID = 0
}
env.CHANGE_BRANCH=""
env.CHANGE_TARGET=""
env.CHANGE_ID=""
// params are automatically exposed as environment variables
// but booleans to string generates "true"
if (params.DMAKE_DEBUG) {
env.DMAKE_DEBUG=1
}
if (params.DMAKE_PAUSE_ON_ERROR_BEFORE_CLEANUP) {
env.DMAKE_PAUSE_ON_ERROR_BEFORE_CLEANUP=1
}
// test parallel execution
env.DMAKE_PARALLEL_EXECUTION = 1
}
stage('Python 3.x') {
sh "virtualenv -p python3 workspace/.venv3"
sh ". workspace/.venv3/bin/activate && pip3 install -r requirements.dev.txt"
dir('workspace') {
if (self_test) {
try {
sh ". .venv3/bin/activate && pytest --numprocesses=4 -vv --color=yes --junit-xml=junit.xml --junit-prefix=python3 --cov=dmake/ --cov-report=xml:coverage.xml --cov-report html:cover/"
} finally {
junit keepLongStdio: true, testResults: 'junit.xml'
recordCoverage(tools: [[parser: 'COBERTURA', pattern: 'coverage.xml']], qualityGates: [[metric: 'LINE', baseline: 'PROJECT_DELTA', criticality: 'NOTE']], sourceCodeRetention: 'NEVER')
publishHTML(target: [allowMissing: false, alwaysLinkToLastBuild: false, keepAll: true, reportDir: 'cover', reportFiles: 'index.html', reportName: 'dmake HTML coverage report'])
}
}
if (params.DMAKE_COMMAND == 'test') {
echo "First: kubernetes deploy dry-run (just plan deployment on target branch to validate kubernetes manifests templates)"
withEnv(["KUBECONFIG=${MINIKUBE_HOME}/kubeconfig", "DMAKE_TEST_K8S_CONTEXT=minikube", "DMAKE_TEST_K8S_NAMESPACE=dmake-test"]) {
sh "kubectl create namespace ${env.DMAKE_TEST_K8S_NAMESPACE} --save-config --dry-run=client -o yaml | kubectl apply -f -"
sh "kubectl create namespace ${env.DMAKE_TEST_K8S_NAMESPACE}-2 --save-config --dry-run=client -o yaml | kubectl apply -f -"
sh ". .venv3/bin/activate && ${params.CUSTOM_ENVIRONMENT} DMAKE_SKIP_TESTS=1 dmake deploy ${dmake_with_dependencies} '${params.DMAKE_APP_TO_TEST}' --branch ${params.DEPLOY_BRANCH_TO_TEST}"
// skip execution: just plan
}
echo "Kubernetes deploy dry-run finished in success!"
}
echo "Now really running dmake"
sh ". .venv3/bin/activate && ${params.CUSTOM_ENVIRONMENT} dmake ${params.DMAKE_COMMAND} ${dmake_with_dependencies} '${params.DMAKE_APP_TO_TEST}'"
sshagent (credentials: (env.DMAKE_JENKINS_SSH_AGENT_CREDENTIALS ?
env.DMAKE_JENKINS_SSH_AGENT_CREDENTIALS : '').tokenize(',')) {
load 'DMakefile'
}
}
}
}