Existe-t-il un moyen d'insérer une approbation manuelle dans les pipelines Jenkins 2?

19

Jenkins 2 a des pipelines a un citoyen de première classe. Cependant, dans les exemples, les tâches semblent être exécutées en une seule séquence:

node {
   // Mark the code checkout 'stage'....
   stage 'Checkout'

   // Get some code from a GitHub repository
   git url: '[email protected]:elifesciences/elife-bot.git'

   // Mark the code build 'stage'....
   stage 'Build'
   echo "Unit tests will run here"

   stage "Production"
   echo "Deploying to production environment"
}

Pour le déploiement dans le système de production, il est souvent utile d'exiger une approbation manuelle; existe-t-il un moyen d'insérer un bouton manuel pour appuyer à l'intérieur d'un pipeline?

J'ai cherché des étapes possibles pour y parvenir sur les documents , en vain.

giorgiosironi
la source
Je ne connais pas Jenkins, mais n'y a-t-il pas un moyen de diviser votre plan de build en plusieurs étapes, et d'avoir certaines de ces étapes exécutées uniquement sur un "déclencheur manuel"?
tiktak
Meilleure solution partielle jusqu'à présent: une inputétape dans le pipeline qui s'arrête et demande à l'utilisateur de saisir (ou d'interrompre la génération). Cependant, la scène et l'indicateur d'état continuent de clignoter pendant que je voulais un état stable (par exemple, vous y entrez vendredi après-midi et décidez de vous déployer lundi.)
giorgiosironi

Réponses:

18

l'entrée est l'option que vous recherchez. Voici comment je l'utilise. Il est important d'avoir l'étape en dehors d'un nœud, sinon jenkins tiendra un agent en attente de l'étape suivante. Gardez à l'esprit que le deuxième nœud peut ne pas utiliser le même espace de travail que le premier.

node {
    stage('build'){
        echo "building"
    }
}
stage('Deploy approval'){
    input "Deploy to prod?"
}
node {
    stage('deploy to prod'){
        echo "deploying"
    }
}
Steve Miskiewicz
la source
Étant donné que plusieurs pipelines peuvent y arriver, qu'advient-il des plus anciens qui ne sont pas déployés en production? Existe-t-il un moyen d'empêcher les plus âgés de rester là (je ne sais pas s'ils vont clignoter) dans un état incomplet?
giorgiosironi
1
pour autant que je sache, il clignotera pour toujours jusqu'à ce que vous cliquiez sur abandonner, ce qui est assez nul. vous pourriez probablement configurer un délai d'attente pour éviter que certains d'entre eux ne se perdent. Après l'expiration, vous perdriez cependant la possibilité de le déployer. jenkins.io/doc/pipeline/steps/workflow-basic-steps/…
Steve Miskiewicz
1
Je ne comprenais pas que l'entrée pouvait être configurée pour ne pas bloquer un agent. Cela rend la saisie beaucoup plus utile.
djhaskin987
Ce serait bien d'avoir la possibilité de redéployer une version, sans construire, ou de déployer la version précédente.
tehnicaorg
1

À la fin, j'ai créé des pipelines séparés test-projectet prod-project, où à la fin du test-projectcode est fusionné dans une approvedbranche.

Ensuite, le prod-projectpipeline peut être configuré pour ne pas se déclencher à chaque nouvelle validation afin de pouvoir être déployé à la demande.

giorgiosironi
la source
0

De plus, vous pouvez également ajouter un délai d'expiration automatique comme ci-dessous

        stage('build') {
        steps {
            sh  """
                # Some commands
                """
            script {
              timeout(time: 10, unit: 'MINUTES') {
                input(id: "Deploy Gate", message: "Deploy ${params.project_name}?", ok: 'Deploy')
              }
            }
        }
    }

    stage('deploy') {
        when {
            branch 'master'
        }
        steps {
            sh  """
                # some commands
                """
        }
    }

Si vous le recherchez, vous pouvez également lier l'entrée jenkins aux informations d'identification des utilisateurs accédant à Jenkins si vous souhaitez uniquement permettre à des individus spécifiques d'être en mesure de répondre - cela est également étayé par le fait que vos contrôles Git sont également suffisants.

Kru
la source
0

Ce n'est qu'un exemple simple mais vous pouvez le déclencher comme vous le souhaitez.

stage{
    script{
        input "Continue?"
        ...enter code here
        ...
    }
}
Oren
la source
0

Je l'ai fait comme indiqué ci-dessous en lisant cette documentation https://jenkins.io/doc/book/pipeline/syntax/

pipeline {
environment {
    BRANCH_NAME = "${env.BRANCH_NAME}"
}
agent any
stages{
    stage('Build-Initiator-Info'){
            steps{
                sh 'echo "Send Info"'
            }
    }
    stage('Build') {
        steps{
             catchError {
                sh 'echo "This is build"'
            }
         }
         post {
            success {
                echo 'Compile Stage Successful . . .'
            }
            failure {
                echo 'Compile stage failed'
                error('Stopping early…')

             }
    }
   }
  stage ('Deploy To Prod'){
  input{
    message "Do you want to proceed for production deployment?"
  }
    steps {
                sh 'echo "Deploy into Prod"'

              }
        }
  }
   }
user5956891
la source