Имя этапа доступа во время сборки в трубопроводе Дженкинс
Скажем, мы имеем следующее Jenkinsfile
:
stage name: "Cool stage"
sh 'whoami'
stage name: "Better stage"
def current_stage = getCurrentStageName()
echo "CONGRATULATIONS, you are on stage: $current_stage"
Вопрос заключается в том, как реализовать getCurrentStageName()
. Я знаю, что я могу получить доступ к созданию времени выполнения с помощью currentBuild.rawBuild
.
Но как получить название сцены с этой точки?
Мне нужно это для некоторой настройки в уведомлениях по электронной почте, так что я всегда могу поймать неудачное имя этапа и включить его в тело электронной почты.
Ответы
Ответ 1
Это должно работать из общей библиотеки конвейера:
#!/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)
}
Пример использования:
node {
stage('Stage One'){
echo getCurrentStage()
}
stage('Stage Two'){
echo getCurrentStage()
}
}
Ответ 2
Обходное решение Alex работает отлично, просто подумал, что стоит использовать код
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")
}
Ответ 3
Теперь вы можете сделать это по-встроенному, так как Jenkins 2.3. Например:
steps {
updateGitlabCommitStatus name: STAGE_NAME, state: 'running'
echo '${STAGE_NAME}'
}
Для получения дополнительной информации см. https://issues.jenkins-ci.org/browse/JENKINS-44456
Ответ 4
Как обходной путь, в письме с отказом я включаю ссылку на страницу "Шаги трубопровода". На этой странице четко отображаются зеленые и красные шары для каждого шага, что позволяет получателю электронной почты легко понять не только этап, но и тот шаг, который не удался.
В следующем примере тела электронной почты ссылка FlowGraphTable
ссылается на шаги трубопровода:
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>"""
Это выдержка из моей реализации notifyBuild()
, что BitwiseMan CloudBees представляет в своей статье Отправка уведомлений в трубопровод.