-
Notifications
You must be signed in to change notification settings - Fork 1
/
Jenkinsfile
151 lines (136 loc) · 5.2 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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
node("build") {
// This limits build concurrency to 1 per branch
properties([disableConcurrentBuilds()])
checkout scm
if (env.BRANCH_NAME == 'master' || env.TAG_NAME != null) {
//withEnv(["DOCKER_HOST=tcp://127.0.0.1:2376"]) {
/* prepare environment */
def tag_name = env.TAG_NAME
// if (tag_name == null){
// tag_name = gitTagName()
// }
// if (tag_name){
// } else {
// tag_name = 'latest'
// }
if (env.BRANCH_NAME == 'master') {
tag_name = 'latest'
}
// in future execute a loop within each Jenkins pipeline stage
def site = 'nau'
def dockerRegistryOrganization = 'nauedu'
def dockerImageName = 'richie-site-nau'
stage('Generate version.json file') {
def gitUrl = sh(returnStdout: true, script: 'git config remote.origin.url').trim()
def gitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
// Create a version.json à-la-mozilla
// https://github.com/mozilla-services/Dockerflow/blob/master/docs/version_object.md
sh ("printf '{\"commit\":\"%s\",\"version\":\"%s\",\"source\":\"%s\",\"build\":\"%s\"}\n' \"$gitCommit\" \"$tag_name\" \"$gitUrl\" \"$env.BUILD_URL\" > sites/$site/src/backend/version.json")
}
stage('Build docker images') {
// final foundSitesFolders = findFiles(glob: 'sites/*')
// makeBuildForAllSites(foundSitesFolders)
ansiColor('xterm') {
try {
sh "export RICHIE_SITE=${site} && make env.d/aws && make ARGS=\"--no-cache\" build"
} finally {
sh "make stop"
}
}
}
stage('Check built image availability') {
sh "docker images 'nau:development'"
sh "docker images 'nau:production'"
sh "docker images 'nau-nginx:production'"
}
stage('Check version.json file') {
ansiColor('xterm') {
try {
sh "make ci-version"
} finally {
sh "make stop"
}
}
}
stage('Run Django migrations') {
ansiColor('xterm') {
try {
sh "make ci-migrate"
} finally {
sh "make stop"
}
}
}
stage('Run Django checks with production image') {
ansiColor('xterm') {
try {
sh "make ci-check"
} finally {
sh "make stop"
}
}
}
stage('Check that the changelog, versions and tag are always in sync') {
if(env.TAG_NAME) {
sh "bin/ci check_tag ${site} ${tag_name}"
}
}
stage('Tag app image') {
if(tag_name) {
sh "docker tag ${site}:production ${dockerRegistryOrganization}/${dockerImageName}:${tag_name}"
sh "docker tag ${site}-nginx:production ${dockerRegistryOrganization}/${dockerImageName}-nginx:${tag_name}"
}
}
stage('Login to DockerHub') {
withCredentials([usernamePassword(credentialsId: 'docker-hub-registry-credentials', passwordVariable: 'DOCKER_REGISTRY_PWD', usernameVariable: 'DOCKER_REGISTRY_USER')]) {
sh "echo $DOCKER_REGISTRY_PWD | docker login -u '$DOCKER_REGISTRY_USER' --password-stdin"
}
}
stage('Publish app and nginx images to docker registry') {
if(tag_name) {
sh "docker push ${dockerRegistryOrganization}/${dockerImageName}:${tag_name}"
sh "docker push ${dockerRegistryOrganization}/${dockerImageName}-nginx:${tag_name}"
}
}
//}
}
stage('Cleanup') {
cleanWs notFailBuild: true
}
}
String gitTagName() {
commit = getCommit()
if (commit) {
try{
desc = sh(script: "git describe --tags ${commit}", returnStdout: true)?.trim()
if (isTag(desc)) {
return desc
}
}catch (err) {
echo "Unable to get tag"
}
}
return null
}
String getCommit() {
return sh(script: 'git rev-parse HEAD', returnStdout: true)?.trim()
}
boolean getTags(String branch){
sh(script: "git pull origin ${branch} --tag")
return true
}
@NonCPS
boolean isTag(String desc) {
match = desc =~ /.+-[0-9]+-g[0-9A-Fa-f]{6,}$/
result = !match
match = null // prevent serialisation
return result
}
@NonCPS // has to be NonCPS or the build breaks on the call to .each
def makeBuildForAllSites(sitesDirectories) {
sitesDirectories.each { siteDir ->
if (siteDir.directory) {
sh "export RICHIE_SITE=${siteDir.name} && make build"
}
}
}