Gibt es eine Möglichkeit, eine manuelle Genehmigung in Jenkins 2-Pipelines einzufügen?


19

Jenkins 2 hat Pipelines und einen erstklassigen Bürger. In den Beispielen scheinen die Aufgaben jedoch als einzelne Sequenz ausgeführt zu werden:

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

   // Get some code from a GitHub repository
   git url: 'git@github.com:elifesciences/elife-bot.git'

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

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

Für die Bereitstellung im Produktionssystem ist es oft nützlich, eine manuelle Genehmigung zu verlangen. Gibt es eine Möglichkeit, eine manuelle Schaltfläche zum Drücken in eine Pipeline einzufügen?

Ich habe nach möglichen Schritten gesucht, um dies in den Dokumenten zu erreichen , ohne Erfolg.


Ich kenne Jenkins nicht, aber gibt es keine Möglichkeit, Ihren Build-Plan in mehrere Schritte aufzuteilen und einige dieser Schritte nur mit einem "manuellen Trigger" auszuführen?
Tiktak

Bisher beste Teillösung: Ein inputSchritt in der Pipeline, der anhält und den Benutzer zur Eingabe auffordert (oder den Build abbricht). Die Bühne und die Statusanzeige blinken jedoch weiter, während ich einen stabilen Zustand haben wollte (z. B. Sie steigen in den Freitagnachmittag ein und beschließen, ihn am Montag einzusetzen.)
giorgiosironi

Antworten:


18

Die Eingabe ist die Option, nach der Sie suchen. So benutze ich es. Es ist wichtig, den Schritt außerhalb eines Knotens zu haben, sonst lässt Jenkins einen Agenten auf den nächsten Schritt warten. Beachten Sie, dass der zweite Knoten möglicherweise nicht denselben Arbeitsbereich wie der erste verwendet.

node {
    stage('build'){
        echo "building"
    }
}
stage('Deploy approval'){
    input "Deploy to prod?"
}
node {
    stage('deploy to prod'){
        echo "deploying"
    }
}

Was passiert mit den älteren Pipelines, die nicht für die Produktion bereitgestellt werden, wenn mehrere Pipelines dorthin gelangen können? Gibt es eine Möglichkeit, die älteren davon abzuhalten, in einem unvollständigen Zustand zu bleiben (ich weiß nicht, ob sie blinken werden)?
Giorgiosironi

1
Soweit ich das beurteilen kann, blinkt es für immer, bis Sie auf Abbrechen klicken, was ziemlich beschissen ist. Sie könnten wahrscheinlich eine Zeitüberschreitung einrichten, um zu verhindern, dass einige von diesen verloren gehen. Nach dem Timeout verlieren Sie jedoch die Fähigkeit zur Bereitstellung. jenkins.io/doc/pipeline/steps/workflow-basic-steps/…
Steve Miskiewicz

1
Ich habe nicht verstanden, dass die Eingabe so konfiguriert werden kann, dass kein Agent zurückgehalten wird. Dies macht die Eingabe viel nützlicher.
Djhaskin987

Wäre schön, die Möglichkeit zu haben, eine Version erneut bereitzustellen, ohne sie zu erstellen, oder die vorherige Version bereitzustellen.
Tehnicaorg

1

Am Ende habe ich separate test-projectund prod-projectPipelines erstellt, bei denen am Ende test-projectder Code zu einer approvedVerzweigung zusammengeführt wird.

Anschließend kann die prod-projectPipeline so eingerichtet werden, dass sie nicht bei jedem neuen Commit ausgelöst wird, sodass sie bei Bedarf bereitgestellt werden kann.


0

Darüber hinaus können Sie auch eine automatische Zeitüberschreitung wie unten hinzufügen

        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
                """
        }
    }

Wenn Sie nachschlagen, können Sie die Jenkins-Eingaben auch an Anmeldeinformationen von Benutzern binden, die auf Jenkins zugreifen, wenn Sie nur bestimmten Personen die Möglichkeit zur Beantwortung gewähren möchten. Dies wird auch durch die Tatsache untermauert, dass auch Ihre Git-Steuerelemente ausreichen.


0

Dies ist nur ein einfaches Beispiel, aber Sie können es nach Bedarf auslösen.

stage{
    script{
        input "Continue?"
        ...enter code here
        ...
    }
}

0

Ich habe, wie unten gezeigt, die folgenden Dokumente gelesen: 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"'

              }
        }
  }
   }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.