-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathJenkinsfile
126 lines (124 loc) · 5.31 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
def stackName = 'test'
def workerLabel = "mytardis-${stackName}"
def dockerHubAccount = 'mytardis'
def dockerImageName = "k8s-mytardis-${stackName}"
def dockerImageTag = ''
def dockerImageFullNameTag = ''
def k8sDeploymentNamespace = 'mytardis'
def gitInfo = ''
def updateProperty(property, value, file) {
escapedProperty = property.replace('[', '\\[').replace(']', '\\]').replace('.', '\\.')
sh("sed -i 's|$escapedProperty|$value|g' $file")
}
podTemplate(
label: workerLabel,
serviceAccount: 'jenkins',
containers: [
containerTemplate(
name: 'docker',
image: 'docker:18.04-dind',
ttyEnabled: true,
command: 'cat',
envVars: [
containerEnvVar(key: 'DOCKER_CONFIG', value: '/tmp/docker')
],
resourceRequestCpu: '1000m',
resourceRequestMemory: '2Gi'
),
containerTemplate(
name: 'postgres',
image: 'postgres:9.6',
alwaysPullImage: false,
envVars: [
envVar(key: 'POSTGRES_PASSWORD', value: 'postgres')
]
),
containerTemplate(
name: 'kubectl',
image: 'lachlanevenson/k8s-kubectl:v1.15.6',
ttyEnabled: true,
command: 'cat',
envVars: [
containerEnvVar(key: 'KUBECONFIG', value: '/tmp/kube/admin.conf')
]
)
],
volumes: [
secretVolume(secretName: "kube-config-${stackName}", mountPath: '/tmp/kube'),
secretVolume(secretName: 'docker-config', mountPath: '/tmp/docker'),
hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock')
]
) {
node(workerLabel) {
def ip = sh(returnStdout: true, script: 'hostname -i').trim()
stage('Clone repository') {
checkout scm
sh("git submodule update --init --recursive")
}
dockerImageTag = sh(returnStdout: true, script: 'git log -n 1 --pretty=format:"%h"').trim()
dockerImageFullNameTag = "${dockerHubAccount}/${dockerImageName}:${dockerImageTag}"
dir('submodules/mytardis') {
gitInfo = [
'commit_id': sh(returnStdout: true, script: 'git log -n 1 --pretty=format:"%H"').trim(),
'date': sh(returnStdout: true, script: 'git log -n 1 --pretty=format:"%cd" --date=rfc').trim(),
'branch': sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim(),
'tag': ''
]
try {
gitInfo['tag'] = sh(returnStdout: true, script: 'git describe --abbrev=0 --tags').trim()
} catch(Exception e) {
gitInfo['tag'] = sh(returnStdout: true, script: 'git log -n 1 --pretty=format:"%h"').trim()
}
}
stage('Build image for tests') {
container('docker') {
sh("docker build . --tag ${dockerImageFullNameTag} --target=test")
}
}
def tests = [:]
[
'npm': "docker run ${dockerImageFullNameTag} npm test",
'behave': "docker run ${dockerImageFullNameTag} python3 manage.py behave --settings=tardis.test_settings",
'pylint': "docker run ${dockerImageFullNameTag} pylint --rcfile .pylintrc --django-settings-module=tardis.test_settings tardis",
'memory': "docker run ${dockerImageFullNameTag} python3 test.py test --settings=tardis.test_settings",
'postgres': "docker run --add-host pg:${ip} ${dockerImageFullNameTag} python3 test.py test --settings=tardis.test_on_postgresql_settings"
].each { name, command ->
tests[name] = {
stage("Run test - ${name}") {
container('docker') {
sh(command)
}
}
}
}
parallel tests
stage('Build image for production') {
container('docker') {
sh("docker build . --tag ${dockerImageFullNameTag} --target=production")
}
}
stage('Push image to DockerHub') {
container('docker') {
sh("docker push ${dockerImageFullNameTag}")
}
}
stage('Deploy image to Kubernetes') {
container('kubectl') {
dir('jobs') {
['migrate', 'collectstatic'].each { item ->
updateProperty(":[dockerImageFullNameTag]", dockerImageFullNameTag, "${item}.yaml")
sh("kubectl -n ${k8sDeploymentNamespace} delete job/${item} --ignore-not-found")
sh("kubectl create -f ${item}.yaml")
sh("kubectl -n ${k8sDeploymentNamespace} wait --for=condition=complete --timeout=300s job/${item}")
}
}
def patch = '{"data":{"version":"' + gitInfo.inspect().replace('[', '{').replace(']', '}') + '"}}'
echo "patch: ${patch}"
sh("kubectl -n ${k8sDeploymentNamespace} patch configmap/version -p '" + patch.replace("'", '\\"') + "'")
['mytardis', 'sftp', 'celery-worker', 'celery-beat'].each { item ->
sh("kubectl -n ${k8sDeploymentNamespace} set image deployment/${item} ${item}=${dockerImageFullNameTag}")
}
}
}
}
}