titulo - Nombre de la etapa de acceso durante la construcción en la tubería de Jenkins
leeeeeeeeeeeeeroy ?] wow (4)
Ahora puede hacer esto de una manera incorporada, desde Jenkins 2.3. Al igual que:
steps {
updateGitlabCommitStatus name: STAGE_NAME, state: ''running''
echo ''${STAGE_NAME}''
}
Para obtener más información, consulte: https://issues.jenkins-ci.org/browse/JENKINS-44456
Digamos que tenemos el siguiente Jenkinsfile
:
stage name: "Cool stage"
sh ''whoami''
stage name: "Better stage"
def current_stage = getCurrentStageName()
echo "CONGRATULATIONS, you are on stage: $current_stage"
La pregunta es cómo implementar getCurrentStageName()
. Sé que puedo obtener acceso para compilar en tiempo de currentBuild.rawBuild
utilizando currentBuild.rawBuild
. Pero, ¿cómo obtener el nombre artístico de ese punto?
Necesito esto para una cierta personalización en las notificaciones de correo electrónico, de modo que siempre pueda detectar el nombre de la etapa fallido e incluirlo en el cuerpo del correo electrónico.
Como solución alternativa, en el correo electrónico de error incluyo un enlace a la página Pasos de la canalización . Esta página muestra claramente bolas verdes y rojas para cada paso, lo que facilita que el destinatario del correo electrónico descubra no solo el escenario, sino el paso que falló.
En el siguiente cuerpo de correo electrónico de ejemplo, el enlace de FlowGraphTable
enlaza con Pasos de la tubería :
def details = """<p>Job ''${env.JOB_NAME}'', build ${env.BUILD_NUMBER} result was ${buildStatus}.
Please scrutinize the build and take corrective action.</p>
<p>Quick links to the details:
<ul>
<li><a href="${env.JOB_URL}">${env.JOB_NAME} job main page</a></li>
<li><a href="${env.BUILD_URL}">Build ${env.BUILD_NUMBER} main page</a></li>
<ul>
<li><a href="${env.BUILD_URL}console">Console output</a></li>
<li><a href="${env.BUILD_URL}changes">Git changes</a></li>
<li><a href="${env.BUILD_URL}flowGraphTable">Pipeline steps</a>.
This page will show you which step failed, and give you access
to the job workspace.</li>
</ul>
</ul></p>"""
Este es un extracto de mi implementación de notifyBuild()
que BitwiseMan de CloudBees presenta en su artículo, Enviando notificaciones en proceso .
Esto debería funcionar desde una biblioteca compartida de tubería:
#!/usr/bin/env groovy
import hudson.model.Action;
import org.jenkinsci.plugins.workflow.graph.FlowNode
import org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode
import org.jenkinsci.plugins.workflow.actions.LabelAction
def getStage(currentBuild){
def build = currentBuild.getRawBuild()
def execution = build.getExecution()
def executionHeads = execution.getCurrentHeads()
def stepStartNode = getStepStartNode(executionHeads)
if(stepStartNode){
return stepStartNode.getDisplayName()
}
}
def getStepStartNode(List<FlowNode> flowNodes){
def currentFlowNode = null
def labelAction = null
for (FlowNode flowNode: flowNodes){
currentFlowNode = flowNode
labelAction = false
if (flowNode instanceof StepStartNode){
labelAction = hasLabelAction(flowNode)
}
if (labelAction){
return flowNode
}
}
if (currentFlowNode == null) {
return null
}
return getStepStartNode(currentFlowNode.getParents())
}
def hasLabelAction(FlowNode flowNode){
def actions = flowNode.getActions()
for (Action action: actions){
if (action instanceof LabelAction) {
return true
}
}
return false
}
def call() {
return getStage(currentBuild)
}
Ejemplo de uso:
node {
stage(''Stage One''){
echo getCurrentStage()
}
stage(''Stage Two''){
echo getCurrentStage()
}
}
La solución de Aleks funciona bien, solo pensé que vale la pena compartir el código
node ("docker") {
def sendOk = {
String stage -> slackSend color: ''good'', message: stage + " completed, project - ${env.JOB_NAME}:1.0.${env.BUILD_NUMBER}"
}
def sendProblem = {
String stage, error -> slackSend color: ''danger'', message: stage + " did not succeed, project - ${env.JOB_NAME}:1.0.${env.BUILD_NUMBER}, error: ${error}, Find details here: ${env.BUILD_URL}"
}
def exec = {
work, stageName ->
stage (stageName) {
try {
work.call();
sendOk(stageName)
}
catch(error) {
sendProblem(stageName, error)
throw error
}
}
}
exec({
git credentialsId: ''github-root'', url: ''https://github.com/abc''
dir (''src'') {
git credentialsId: ''github-root'', url: ''https://github.com/abc-jenkins''
}
sh "chmod +x *.sh"
}, "pull")
exec({ sh "./Jenkinsfile-clean.sh /"1.0.${env.BUILD_NUMBER}/"" }, "clean")
exec({ sh "./Jenkinsfile-unit.sh /"1.0.${env.BUILD_NUMBER}/"" }, "unit")
exec({ sh "./Jenkinsfile-build.sh /"1.0.${env.BUILD_NUMBER}/"" }, "build")
exec({ sh "./Jenkinsfile-dockerize.sh /"1.0.${env.BUILD_NUMBER}/"" }, "dockerize")
exec({ sh "./Jenkinsfile-push.sh /"1.0.${env.BUILD_NUMBER}/"" }, "push")
exec({ sh "./Jenkinsfile-prod-like.sh /"1.0.${env.BUILD_NUMBER}/"" }, "swarm")
}