web-dev-qa-db-fra.com

Comment faire des déclarations simples dans un pipeline déclaratif à Jenkins

J'essaie de convertir mon pipeline scripté en pipeline déclaratif . Je me demandais comment faire une simple instruction if dans un bloc steps {}.

    stage ('Deploy to Docker') {
        steps {
            parallel (
                "instance1" : {
                    environment {
                        containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
                    }
                    steps {
                        if (containerId.isEmpty()) {
                            docker.image('some/image').run("--name ${fullDockerImageName}")
                        }
                    }
                }
            )
        }
   }

Cela provoque l'exception suivante:

WorkflowScript: 201: Expected a step @ line 201, column 29.
                           if (containerId.isEmpty()) {

Puisque je ne suis pas autorisé à faire une simple if(..) à l'intérieur d'un bloc steps {}, aucune idée sur la façon de procéder?

Cela ne semble pas logique d'en faire une étape complète avec un when {}, car il y a plus d'étapes qui se produisent dans une étape simple (démarrer un conteneur arrêté s'il existe, etc.).

Quelle est la meilleure façon de faire un simple si?

13
Jasper Roel

Malheureusement, vous devez l'envelopper dans une script, pour l'instant. Comme il dit ici ;

Les pipelines déclaratifs peuvent utiliser toutes les étapes disponibles documentées dans la référence Pipeline Steps , qui contient une liste complète d’étapes, avec l’ajout des étapes répertoriées ci-dessous qui ne sont prises en charge que dans Pipeline déclaratif.

Et si vous regardez la référence d’étape, elle répertorie simplement tous les plug-ins qui contribuent aux étapes du pipeline. Et pour autant que je sache, il n'y a pas d'étape favorable si, alors, autrement. Donc, la réponse est non, pour le moment, ce n'est pas possible, mais il devrait être assez simple de l'implémenter comme une étape et de l'ajouter à un plugin.

11
Jon S

Cela devrait marcher

pipeline {
     stages {
        stage ('Main Stage') {
            steps {
                script {
                    if (true) {
                        stage ('Stage 1') {
                            sh 'echo Stage 1'
                        }
                    }
                    if (false) {
                        stage ('Stage 2') {
                            sh 'echo Stage 2'
                        }
                    }
                }
            }
        }
    }
}
6
Reuben Abela

En utilisant le plugin Conditional BuildStep , vous pouvez ajouter une étape when {} pour traiter une condition.

Ce qui suit devrait fonctionner, à l’exception des problèmes de syntaxe associés à la vérification isEmpty () dans ce contexte.

stage ('Deploy to Docker') {
    steps {
        parallel (
            "instance1" : {
                environment {
                    containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
                }
                when {
                    expression {
                        return containerId.isEmpty()
                    }
                }
                step {
                    docker.image('some/image').run("--name ${fullDockerImageName}")
                }
            }
        )
    }
}

Le billet de blog connexe est ici.

EDIT: Désolé, la snytax semble être plus proche de celle-ci, elle n'a pas accès au conditionnel dont vous avez besoin:

stage ('Deploy to Docker') {
    when {
        expression {
            return containerId.isEmpty()
        }
    }
    steps {
        parallel (
            "instance1" : {
                environment {
                    containerId = sh(script: "docker ps --quiet --filter name=${fullDockerImageName}", returnStdout: true).trim()
                }
                step {
                    docker.image('some/image').run("--name ${fullDockerImageName}")
                }
            }
        )
    }
}
1
IronSean

Je pense qu’il s’agit de la méthode la plus correcte/la meilleure en matière d’utilisation de la logique if/else ou de contrôle dans votre pipeline déclaratif Jenkins.

https://jenkins.io/doc/book/pipeline/syntax/#when

@IronSean réponse, ne semble pas avoir besoin de ce plugin (plus).

0
Ruwd