Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jenkins changes for QA builds #1070

Merged
merged 2 commits into from
Feb 23, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 74 additions & 31 deletions Jenkinsfile
Original file line number Diff line number Diff line change
@@ -1,19 +1,5 @@
import groovy.json.JsonOutput

// 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('\'', '\'\\\'\'') + '\''
}

pipeline {
agent any

Expand Down Expand Up @@ -43,14 +29,37 @@ pipeline {
def slackURL = env.SLACK_URL
def sentryDsn = env.SENTRY_DSN
def gaTrackingId = env.GA_TRACKING_ID
def buildNumber = env.BUILD_NUMBER
def gitCommit = env.GIT_COMMIT
def jobName = env.JOB_NAME
def disableDeploy = env.DISABLE_DEPLOY
brianpeiris marked this conversation as resolved.
Show resolved Hide resolved
def showQAPromoteCommand = env.SHOW_QA_PROMOTE_COMMAND
def qaBuildsSlackChannel = env.QA_BUILDS_SLACK_CHANNEL

def habCommand = "/bin/bash scripts/hab-build-and-push.sh \\\"${baseAssetsPath}\\\" \\\"${hubsServer}\\\" \\\"${reticulumServer}\\\" \\\"${thumbnailServer}\\\" \\\"${corsProxyServer}\\\" \\\"${nonCorsProxyDomains}\\\" \\\"${sentryDsn}\\\" \\\"${gaTrackingId}\\\" \\\"${targetS3Bucket}\\\" \\\"${isMoz}\\\" \\\"${env.BUILD_NUMBER}\\\" \\\"${env.GIT_COMMIT}\\\""
sh "/usr/bin/script --return -c ${shellString(habCommand)} /dev/null"
def habCommand = (
"/bin/bash scripts/hab-build-and-push.sh "
+ "\\\"${baseAssetsPath}\\\" "
+ "\\\"${hubsServer}\\\" "
+ "\\\"${reticulumServer}\\\" "
+ "\\\"${thumbnailServer}\\\" "
+ "\\\"${corsProxyServer}\\\" "
+ "\\\"${nonCorsProxyDomains}\\\" "
+ "\\\"${sentryDsn}\\\" "
+ "\\\"${gaTrackingId}\\\" "
+ "\\\"${targetS3Bucket}\\\" "
+ "\\\"${isMoz}\\\" "
+ "\\\"${buildNumber}\\\" "
+ "\\\"${gitCommit}\\\" "
+ "\\\"${disableDeploy}\\\" "
)
runCommand(habCommand)

def s = $/eval 'ls -rt results/*.hart | head -n 1'/$
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]
Expand All @@ -59,22 +68,56 @@ pipeline {

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()
def text = (
"*<http://localhost:8080/job/${env.JOB_NAME}/${env.BUILD_NUMBER}|#${env.BUILD_NUMBER}>* *${env.JOB_NAME}* " +
"<https://github.com/mozilla/Spoke/commit/$gitSha|$gitSha> ${spokeVersion} " +
"Spoke: ```${gitSha} ${gitMessage}```\n" +
"<${smokeURL}?required_version=${spokeVersion}|Smoke Test> - to push:\n" +
"`/mr spoke deploy ${spokeVersion} s3://${targetS3Bucket}`"
)
def payload = 'payload=' + JsonOutput.toJson([
text : text,
channel : "#mr-builds",
username : "buildbot",
icon_emoji: ":gift:"
])
sh "curl -X POST --data-urlencode ${shellString(payload)} ${slackURL}"

if (showQAPromoteCommand == "true") {
def text = (
"*<http://localhost:8080/job/${jobName}/${buildNumber}|#${buildNumber}>* *${jobName}* " +
"<https://github.com/mozilla/Spoke/commit/$gitSha|$gitSha> ${spokeVersion} " +
"Spoke: ```${gitSha} ${gitMessage}```\n" +
"${packageIdent} built and uploaded - to promote:\n" +
"`/mr promote-spoke-qa ${packageIdent}`"
)
sendSlackMessage(text, qaBuildsSlackChannel, ":gift:", slackURL)
} else {
def text = (
"*<http://localhost:8080/job/${jobName}/${buildNumber}|#${buildNumber}>* *${jobName}* " +
"<https://github.com/mozilla/Spoke/commit/$gitSha|$gitSha> ${spokeVersion} " +
"Spoke: ```${gitSha} ${gitMessage}```\n" +
"<${smokeURL}?required_version=${spokeVersion}|Smoke Test> - to push:\n" +
"`/mr spoke deploy ${spokeVersion} s3://${targetS3Bucket}`"
)
sendSlackMessage(text, "#mr-builds", ":gift:", slackURL)
}
}
}
}
}
}

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('\'', '\'\\\'\'') + '\''
}
8 changes: 7 additions & 1 deletion scripts/hab-build-and-push.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export TARGET_S3_BUCKET=$9
export IS_MOZ=${10}
export BUILD_NUMBER=${11}
export GIT_COMMIT=${12}
export DISABLE_DEPLOY=${13}
export BUILD_VERSION="${BUILD_NUMBER} (${GIT_COMMIT})"
export SENTRY_LOG_LEVEL=debug

Expand All @@ -38,6 +39,11 @@ sudo /usr/bin/hab-pkg-install results/*.hart
hab svc load $PKG
hab svc stop $PKG

DEPLOY_TYPE="s3"
if [[ DISABLE_DEPLOY == "true" ]]; then
DEPLOY_TYPE="none"
fi

# Apparently these vars come in from jenkins with quotes already
cat > build-config.toml << EOTOML
[general]
Expand All @@ -52,7 +58,7 @@ ga_tracking_id = $GA_TRACKING_ID
is_moz = $IS_MOZ

[deploy]
type = "s3"
type = "$DEPLOY_TYPE"
target = $TARGET_S3_BUCKET
region = "us-west-1"
EOTOML
Expand Down