cicd
This commit is contained in:
226
openshift/libs/utilities.groovy
Normal file
226
openshift/libs/utilities.groovy
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
def defineAuth() {
|
||||||
|
def api = "https://ocpcluster-a.arbetsformedlingen.se:443"
|
||||||
|
env.API = sh(script:"set +x; echo ${ api }", returnStdout: true).replaceAll(/https?/, 'insecure')
|
||||||
|
def encodedToken = openshift.selector('secret/imagepromote-token-ocp-a').object().data.tokenbase64
|
||||||
|
env.TOKEN = sh(script:"set +x; echo ${ encodedToken } | base64 --decode", returnStdout: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
def generateTag() {
|
||||||
|
echo '### Generating build tag... ###'
|
||||||
|
def hash = getVersionHash()
|
||||||
|
def tag = "${ hash }"
|
||||||
|
echo "### build tag: \"${ tag }\" ###"
|
||||||
|
return tag
|
||||||
|
}
|
||||||
|
|
||||||
|
def getVersionHash() {
|
||||||
|
return sh(returnStdout: true, script: "git tag --points-at HEAD").trim()
|
||||||
|
}
|
||||||
|
def getShortCommitHash() {
|
||||||
|
return sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
def pushToExternalRegistry( String appName,
|
||||||
|
String tag,
|
||||||
|
String imageProject,
|
||||||
|
String internalRegistry,
|
||||||
|
String externalRegistry) {
|
||||||
|
withCredentials([usernamePassword(credentialsId: "${ openshift.project() }-nexus-secret", usernameVariable: "REG_USER", passwordVariable: "REG_PWD")]) {
|
||||||
|
echo "Copying image..."
|
||||||
|
echo "from docker://${ internalRegistry }/${ imageProject }/${ appName }:${ tag }"
|
||||||
|
echo "to docker://${ externalRegistry }/app-af-nexus/${ appName }:latest"
|
||||||
|
sh "skopeo copy docker://${ internalRegistry }/${ imageProject }/${ appName }:${ tag } docker://${ externalRegistry }/app-af-nexus/${ appName }:latest --src-creds jenkins:\$(oc whoami -t) --dest-creds \"$REG_USER:$REG_PWD\" --src-tls-verify=false --dest-tls-verify=false --format v2s2"
|
||||||
|
// todo: annotate the image with a label
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def rollout(String appName,
|
||||||
|
String imageStreamName,
|
||||||
|
String imageTag,
|
||||||
|
String label,
|
||||||
|
String imageProject,
|
||||||
|
String registry,
|
||||||
|
boolean useConfigMap,
|
||||||
|
String configMapKey,
|
||||||
|
String configMapPath) {
|
||||||
|
if (useConfigMap) {
|
||||||
|
echo "useConfigMap was set to true"
|
||||||
|
def configMap = openshift.selector("configmap", configMapKey)
|
||||||
|
if (configMap.exists()) {
|
||||||
|
echo "Found existing config map. Removing..."
|
||||||
|
openshift.selector("configmap", configMapKey).delete();
|
||||||
|
}
|
||||||
|
echo "Applying configmap from path: ${configMapPath} ..."
|
||||||
|
openshift.apply(readFile(configMapPath))
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Setting image for Deployment Config: ${ appName } to ${ registry }/${ imageProject }/${ imageStreamName }:${ imageTag } ..."
|
||||||
|
openshift.raw("set image dc/${ appName } ${ appName }=${registry}/${ imageProject }/${ imageStreamName }:${ imageTag } --record=true")
|
||||||
|
|
||||||
|
echo "Labeling Deployment Config with build: ${ label } ..."
|
||||||
|
openshift.raw("patch dc ${ appName } -p \"{\\\"spec\\\":{\\\"template\\\":{\\\"metadata\\\":{\\\"labels\\\":{\\\"build\\\":\\\"${ label }\\\"}}}}}}\"")
|
||||||
|
|
||||||
|
echo "Rolling out..."
|
||||||
|
openshift.selector("dc", "${ appName }").rollout().status();
|
||||||
|
|
||||||
|
def latestDeploymentVersion = openshift.selector('dc',"${ appName }").object().status.latestVersion
|
||||||
|
echo "Labeling Replication Controller ${ appName }-${ latestDeploymentVersion } with build: ${ label } ..."
|
||||||
|
openshift.raw("patch rc ${ appName }-${ latestDeploymentVersion } -p \"{\\\"metadata\\\":{\\\"labels\\\":{\\\"build\\\":\\\"${ label }\\\"}}}\"")
|
||||||
|
}
|
||||||
|
|
||||||
|
def selectTag(String applicationName,
|
||||||
|
Integer timeoutTime = 10,
|
||||||
|
String timeoutUnit = 'MINUTES') {
|
||||||
|
def tagToPromote = ""
|
||||||
|
def imageStreamsSelector = openshift.selector('is')
|
||||||
|
def cancelled = false
|
||||||
|
|
||||||
|
imageStreamsSelector.withEach { is ->
|
||||||
|
def streamName = is.name()
|
||||||
|
if (streamName == "imagestream/" + applicationName) {
|
||||||
|
def tags = sortTags(is.object().spec.tags)
|
||||||
|
try {
|
||||||
|
timeout(time: timeoutTime, unit: timeoutUnit) {
|
||||||
|
tagToPromote = input message: "We need some input from you:",
|
||||||
|
ok: "Proceed",
|
||||||
|
parameters: [
|
||||||
|
choice(name: 'Tag', choices: tags, description: 'What tag do you want to promote?')
|
||||||
|
]
|
||||||
|
}
|
||||||
|
} catch(err) {
|
||||||
|
def user = err.getCauses()[0].getUser()
|
||||||
|
if('SYSTEM' == user.toString()) { // SYSTEM means timeout.
|
||||||
|
echo "Pipeline timed out waiting for user input"
|
||||||
|
currentBuild.result = 'NOT_BUILT'
|
||||||
|
} else {
|
||||||
|
echo "Aborted by ${user}"
|
||||||
|
currentBuild.result = 'ABORTED'
|
||||||
|
}
|
||||||
|
error('Pipeline timed out or was aborted')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tagToPromote
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonCPS
|
||||||
|
def sortTags(tags) {
|
||||||
|
def sorted = tags.sort { a, b -> a.generation <=> b.generation }.reverse()
|
||||||
|
def arr = []
|
||||||
|
sorted.each { tag ->
|
||||||
|
arr.add("$tag.name")
|
||||||
|
}
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
|
||||||
|
def selectTarget(ArrayList<String> targets, Integer timeoutTime = 10, String timeoutUnit = 'MINUTES') {
|
||||||
|
def target = ""
|
||||||
|
try {
|
||||||
|
timeout(time: timeoutTime, unit: timeoutUnit) {
|
||||||
|
target = input message: "We need some input from you!",
|
||||||
|
ok: "Proceed",
|
||||||
|
parameters: [
|
||||||
|
choice(name: 'Target', choices: targets, description: 'Select target for promotion: ')
|
||||||
|
]
|
||||||
|
}
|
||||||
|
} catch(err) {
|
||||||
|
def user = err.getCauses()[0].getUser()
|
||||||
|
if('SYSTEM' == user.toString()) { // SYSTEM means timeout.
|
||||||
|
echo "Pipeline timed out waiting for user input"
|
||||||
|
currentBuild.result = 'NOT_BUILT'
|
||||||
|
} else {
|
||||||
|
echo "Aborted by ${user}"
|
||||||
|
currentBuild.result = 'ABORTED'
|
||||||
|
}
|
||||||
|
error('Pipeline timed out or was aborted')
|
||||||
|
}
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
|
||||||
|
def createVulnerabilityScan(String projectName, String projectVersion, String apiKey) {
|
||||||
|
echo "### Generating vulnerability scan for \"${ projectVersion }\" of \"${ projectName }\""
|
||||||
|
sh """
|
||||||
|
cyclonedx-bom -o bom.xml -d
|
||||||
|
set +x
|
||||||
|
REPORT=\$(cat bom.xml|base64 -w 0)
|
||||||
|
cat > payload.json <<EOF
|
||||||
|
{
|
||||||
|
\"projectName\": \"${projectName}\",
|
||||||
|
\"projectVersion\": \"${projectVersion}\",
|
||||||
|
\"autoCreate\": \"True\",
|
||||||
|
\"bom\": \"\${REPORT}\"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
curl -X \"PUT\" \"http://dependency-tracker-infra-dependencytracker.tocp.arbetsformedlingen.se/api/v1/bom\" -H 'Content-Type: application/json' \
|
||||||
|
-H 'X-API-Key: ${apiKey}' \
|
||||||
|
-d @payload.json
|
||||||
|
"""
|
||||||
|
echo "Go to http://dependency-tracker-infra-dependencytracker.tocp.arbetsformedlingen.se and login to see your report"
|
||||||
|
}
|
||||||
|
|
||||||
|
def tagGitWithBuild(String tag, String credentials) {
|
||||||
|
try {
|
||||||
|
sshagent([credentials]) {
|
||||||
|
echo "### Creating the tag \"${tag}\" ###"
|
||||||
|
sh(returnStdout: false, script: "git fetch --tags --q")
|
||||||
|
sh(returnStdout: false, script: "git tag \"${ tag }\"")
|
||||||
|
try {
|
||||||
|
sh(returnStdout: false, script: "git push origin \"${ tag }\"")
|
||||||
|
} catch (err) {
|
||||||
|
currentBuild.result = 'UNSTABLE'
|
||||||
|
echo "Error occured when trying to push tag to origin. Did the tag exist already?"
|
||||||
|
echo "Message: ${err}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
currentBuild.result = 'UNSTABLE'
|
||||||
|
echo "Error occured when trying to tag commit. Did you check if you have the plugin SSH Agent installed? This step needs to be executed with the proper credentials."
|
||||||
|
echo "Message: ${err}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def updateDeployTag(String appName, String project, String tag, String credentials) {
|
||||||
|
try {
|
||||||
|
sshagent([credentials]) {
|
||||||
|
echo "Attempting to find a commit with the tag \"${ tag }\" ..."
|
||||||
|
def commitSHA = sh (
|
||||||
|
script: "git show-ref -s ${tag} || echo \"\"",
|
||||||
|
returnStdout: true
|
||||||
|
)
|
||||||
|
def tagName = "ocp/deployed/${ appName }/${ project }"
|
||||||
|
if (commitSHA != '') {
|
||||||
|
echo "Tagging SHA: ${ commitSHA } with tag: ${ tagName }"
|
||||||
|
def existingTagSHA = sh (
|
||||||
|
script: "git show-ref -s ${ tagName } || echo \"\"",
|
||||||
|
returnStdout: true,
|
||||||
|
).trim()
|
||||||
|
echo "existingTagSHA: \"${existingTagSHA}\""
|
||||||
|
if (existingTagSHA != '') {
|
||||||
|
echo "Removing existing tag..."
|
||||||
|
sh(returnStdout: false, script: "git tag -d ${ tagName }") // deletes local deploy tag
|
||||||
|
sh(returnStdout: false, script: "git push origin :${ tagName }") // deletes original remote tag
|
||||||
|
}
|
||||||
|
sh(returnStdout: false, script: "git tag ${ tagName } ${ commitSHA }") // creates new local deploy tag
|
||||||
|
try {
|
||||||
|
sh(returnStdout: false, script: "git push origin ${ tagName }") // creates new remote tag
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
currentBuild.result = 'UNSTABLE'
|
||||||
|
echo "Error occured when trying to push tag to origin. Make sure tags are fetched so the function knows if it needs to remove existing tags first."
|
||||||
|
echo "Message: ${err}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Warning! Couldn\'t find any commits with the tag ocp/${ appName }/${ tag }"
|
||||||
|
echo "This function assumes that you are tagging your commits with this pattern when generating new images"
|
||||||
|
currentBuild.result = 'UNSTABLE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
currentBuild.result = 'UNSTABLE'
|
||||||
|
echo "Error occured when trying to tag commit. Did you check if you have the plugin SSH Agent installed? This step needs to be executed with the proper credentials."
|
||||||
|
echo "Message: ${err}"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user