-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
Jenkinsfile
129 lines (114 loc) · 5.02 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
import groovy.json.JsonOutput
pipeline {
agent any
options {
ansiColor('xterm')
}
stages {
stage('pre-build') {
steps {
sh 'rm -rf ./dist ./tmp'
}
}
stage('build') {
steps {
script {
def baseAssetsPath = env.BASE_ASSETS_PATH
def shortlinkDomain = env.SHORTLINK_DOMAIN
def targetS3Bucket = env.TARGET_S3_BUCKET
def sentryDsn = env.SENTRY_DSN
def gaTrackingId = env.GA_TRACKING_ID
def smokeURL = env.SMOKE_URL
def reticulumServer = env.RETICULUM_SERVER
def thumbnailServer = env.THUMBNAIL_SERVER
def corsProxyServer = env.CORS_PROXY_SERVER
def nonCorsProxyDomains = env.NON_CORS_PROXY_DOMAINS
def slackURL = env.SLACK_URL
def buildNumber = env.BUILD_NUMBER
def jobName = env.JOB_NAME
def gitCommit = env.GIT_COMMIT
def disableDeploy = env.DISABLE_DEPLOY
def showQAPromoteCommand = env.SHOW_QA_PROMOTE_COMMAND
def qaBuildsSlackChannel = env.QA_BUILDS_SLACK_CHANNEL
def uploadsHost = env.UPLOADS_HOST
def habCommand = (
"/bin/bash scripts/hab-build-and-push.sh "
+ "\\\"${baseAssetsPath}\\\" "
+ "\\\"${shortlinkDomain}\\\" "
+ "\\\"${reticulumServer}\\\" "
+ "\\\"${thumbnailServer}\\\" "
+ "\\\"${corsProxyServer}\\\" "
+ "\\\"${nonCorsProxyDomains}\\\" "
+ "\\\"${targetS3Bucket}\\\" "
+ "\\\"${sentryDsn}\\\" "
+ "\\\"${gaTrackingId}\\\" "
+ "\\\"${buildNumber}\\\" "
+ "\\\"${gitCommit}\\\" "
+ "\\\"${disableDeploy}\\\" "
+ "\\\"${uploadsHost}\\\" "
)
runCommand(habCommand)
def s = $/eval 'ls -t results/*.hart | head -n 1'/$
def hart = sh(returnStdout: true, script: "${s}").trim()
s = $/eval 'tail -n +6 ${hart} | xzcat | tar tf - | grep IDENT'/$
def identPath = sh(returnStdout: true, script: "${s}").trim()
s = $/eval 'tail -n +6 ${hart} | xzcat | tar xf - "${identPath}" -O'/$
def packageIdent = sh(returnStdout: true, script: "${s}").trim()
def packageTimeVersion = packageIdent.tokenize('/')[3]
def (major, minor, version) = packageIdent.tokenize('/')[2].tokenize('.')
def hubsVersion = "${major}.${minor}.${version}.${packageTimeVersion}"
def gitMessage = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'[%an] %s'").trim()
def gitSha = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
if (showQAPromoteCommand == "true") {
def text = (
"*<http://localhost:8080/job/${jobName}/${buildNumber}|#${buildNumber}>* *${jobName}* " +
"<https://github.com/Hubs-Foundation/hubs/commit/$gitSha|$gitSha> ${hubsVersion} " +
"Hubs: ```${gitSha} ${gitMessage}```\n" +
"${packageIdent} built and uploaded - to promote:\n" +
"`/mr promote-hubs-qa ${packageIdent}`"
)
sendSlackMessage(text, qaBuildsSlackChannel, ":gift:", slackURL)
} else {
def text = (
"*<http://localhost:8080/job/${jobName}/${buildNumber}|#${buildNumber}>* *${jobName}* " +
"<https://github.com/Hubs-Foundation/hubs/commit/$gitSha|$gitSha> ${hubsVersion} " +
"Hubs: ```${gitSha} ${gitMessage}```\n" +
"<${smokeURL}?required_version=${hubsVersion}|Smoke Test> - to push:\n" +
"`/mr hubs deploy ${hubsVersion} s3://${targetS3Bucket}`"
)
sendSlackMessage(text, "#mr-builds", ":gift:", slackURL)
}
}
}
}
}
post {
always {
deleteDir()
}
}
}
def runCommand(command) {
sh "/usr/bin/script --return -c ${shellString(command)} /dev/null"
}
def sendSlackMessage(text, channel, icon, slackURL) {
def payload = 'payload=' + JsonOutput.toJson([
text : text,
channel : channel,
username : "buildbot",
icon_emoji: icon
])
sh "curl -X POST --data-urlencode ${shellString(payload)} ${slackURL}"
}
// From https://issues.jenkins-ci.org/browse/JENKINS-44231
// Given arbitrary string returns a strongly escaped shell string literal.
// I.e. it will be in single quotes which turns off interpolation of $(...), etc.
// E.g.: 1'2\3\'4 5"6 (groovy string) -> '1'\''2\3\'\''4 5"6' (groovy string which can be safely pasted into shell command).
def shellString(s) {
// Replace ' with '\'' (https://unix.stackexchange.com/a/187654/260156). Then enclose with '...'.
// 1) Why not replace \ with \\? Because '...' does not treat backslashes in a special way.
// 2) And why not use ANSI-C quoting? I.e. we could replace ' with \'
// and enclose using $'...' (https://stackoverflow.com/a/8254156/4839573).
// Because ANSI-C quoting is not yet supported by Dash (default shell in Ubuntu & Debian) (https://unix.stackexchange.com/a/371873).
'\'' + s.replace('\'', '\'\\\'\'') + '\''
}