5
votes

Obtenir l'ID d'étape dans Jenkins Pipeline pour la liaison à la vue BlueOcean ou Pipeline Steps (flowGraphTable)

Étant donné un pipeline Jenkins qui exécute une série d'étapes, certaines dans des blocs parallèles , existe-t-il un moyen d'obtenir dans le pipeline l'ID de flux d'une étape donnée ou l'étape la plus récente?

Qu'est-ce qu'un ID de flux? Si vous regardez une exécution de votre travail de pipeline, vous pouvez voir un lien «Étapes du pipeline» qui pointe vers flowGraphTable / . Vous y trouverez des liens vers des étapes spécifiques du travail telles que execution / node / 113 / . Celles-ci semblent représenter un FlowNode .

Existe-t-il un moyen d'obtenir ces identifiants à partir du pipeline, pour générer des liens, etc.

En particulier, je souhaite obtenir un lien vers le sous-flux pour mes branches parallèles afin que je puisse créer un lien vers les vues BlueOcean de celles-ci. (La vue Jenkins intégrée est inutile car elle n'affiche pas de sous-arbre).

Je peux voir que les liens BlueOcean correspondent aux liens / execution /, ils ont la même valeur d'identifiant. Si ma branche de pipeline est myjob / 9 / execution / node / 78 / alors sur blueocean ce sera jobname / 9 / pipeline / 78 .

Mais comment obtenir cet identifiant si je souhaite utiliser le plugin de synthèse de compilation ou similaire pour générer les liens et les ajouter à la page des résultats de la construction?


0 commentaires

3 Réponses :


-1
votes

Au lieu d'obtenir l'ID de l'étape pour le travail parallèle, vous pouvez faire écho ou spécifier le nom du nœud qui peut fonctionner.


1 commentaires

Cela peut-il ensuite être utilisé pour construire des URL faisant référence aux nœuds dans l'affichage BlueOcean du travail, ou à la table du graphique de flux / à la vue des étapes du pipeline? si c'est le cas, comment?



1
votes

J'avais du mal avec un cas d'utilisation similaire et j'ai réussi à trouver une solution qui fonctionne pour moi. Ce https://issues.jenkins-ci.org/browse/JENKINS-28119 a> pourrait être une lecture intéressante sur la question. Cela m'a finalement orienté dans la bonne direction.

Outre le plugin Pipeline et Pipeline Stage View, j'ai dû installer le plugin HTTP Request ( https://wiki.jenkins.io/display/JENKINS/HTTP+Request+Plugin ) et le plugin Pipeline Utility Steps (pour analyser JSON, https://wiki.jenkins.io/display/JENKINS/Pipeline+Utility+Steps + Plugin ) sur notre serveur Jenkins. Je ne sais pas quels autres plugins pourraient être nécessaires.

Voici mon exemple de travail, ne manquant que les étapes en cours d'évaluation:

#!groovy

pipeline {
    agent any

    stages {
        stage('Test') {
            steps {
                script {
                    def responseRun = httpRequest(
                        //consoleLogResponseBody: true,
                        contentType: 'APPLICATION_JSON',
                        httpMode: 'GET',
                        url: BUILD_URL + 'wfapi',
                        validResponseCodes: '200'
                    )
                    def runJson = readJSON text: responseRun.getContent()
                    def headNodeUrl = ''
                    runJson.stages.each {
                        if (it.name.toString() == 'Stage node label') {
                            // Found head node: it.id
                            headNodeUrl = BUILD_URL + 'execution/node/' + it.id.toString() + '/'
                        }
                    }
                    def responseNode = httpRequest(
                        contentType: 'APPLICATION_JSON',
                        httpMode: 'GET',
                        url: headNodeUrl + 'wfapi',
                        validResponseCodes: '200'
                    )
                    def nodeJson = readJSON text: responseNode.getContent()
                    def execNodeUrl = ''
                    nodeJson.stageFlowNodes.each {
                        if (it.name.toString() == 'Execution node label') {
                            // Found execution node: it.id
                            execNodeUrl = BUILD_URL + 'execution/node/' + it.id.toString() + '/log/'
                        }
                    }
                    echo execNodeUrl
                }
            }
        }
    }
}

BUILD_URL est une variable d'environnement globale, fournie par Jenkins, je suppose. Dans mon script complet, j'ai une stage ('Stage node label') {...} contenant une instruction bat label: 'Execution node label', script: ... code > dont l'URL du journal sera construite et imprimée avec echo.

Le résultat est une URL comme http://myjenkinsserver.org:8080/job/some_folder/job / my_job_name / 181 / execution / node / 50 / log /

Je pense que l'utilisation de each dans mon exemple n'est peut-être pas idéale, car je ne peux pas l'annuler après le premier match. De plus, je n'ai pas réussi à encapsuler les httpRequest et readJSON dans une méthode de classe ou quelque chose parce que je ne pouvais pas comprendre le type de retour de readJSON code >. Tous les conseils sont appréciés.

J'espère que cela vous aidera.

Cheers


0 commentaires

1
votes

Ceci obtient le lien de l'espace de travail pour l'étape de noeud englobant. Vous pouvez obtenir l'ID en utilisant .getId () au lieu de .url Cela fonctionne pour mon cas lors de l'utilisation de node {....}, mais peut nécessiter un peu de polissage pour une utilisation dans des étapes déclaratives ou parallèles internes.

def getNodeWsUrl(flowNode = null) {
    if(!flowNode) {
        flowNode = getContext(org.jenkinsci.plugins.workflow.graph.FlowNode)
    }
    if(flowNode instanceof org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode && flowNode.typeFunctionName == 'node') {
        // Could also check flowNode.typeDisplayFunction == 'Allocate node : Start'
        return "/${flowNode.url}ws/"
    }

    return flowNode.parents.findResult { getNodeWsUrl(it) }
}


1 commentaires

Merci beaucoup mec, cela m'a aidé et gagné du temps!