Czy istnieje sposób wstawienia ręcznego zatwierdzania do rurociągów Jenkins 2?

19

Jenkins 2 ma rurociągi ma obywatela pierwszej klasy. Jednak w przykładach zadania wydają się być wykonywane jako pojedyncza sekwencja:

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

W przypadku wdrożenia w systemie produkcyjnym często przydatne jest ręczne zatwierdzenie; czy istnieje sposób, aby wstawić przycisk ręczny do naciśnięcia w rurociągu?

Szukałem możliwych kroków, aby to osiągnąć w dokumentach , ale bezskutecznie.

giorgiosironi
źródło
Nie znam Jenkinsa, ale czy nie ma sposobu na podzielenie planu kompilacji na kilka etapów, a niektóre z tych kroków mogą być uruchamiane tylko przy „ręcznym wyzwalaniu”?
tiktak
Najlepsze jak dotąd częściowe rozwiązanie: inputkrok w potoku, który zatrzymuje się i prosi użytkownika o wprowadzenie danych (lub przerwanie kompilacji). Jednak scena i wskaźnik stanu wciąż migają, a ja chciałem stabilnego stanu (np.
Wchodzisz

Odpowiedzi:

18

wejście jest opcją, której szukasz. Oto jak go używam. Ważne jest, aby mieć krok poza węzłem, w przeciwnym razie Jenkins zatrzyma agenta czekającego na następny krok. Pamiętaj, że drugi węzeł może nie używać tego samego obszaru roboczego co pierwszy.

node {
    stage('build'){
        echo "building"
    }
}
stage('Deploy approval'){
    input "Deploy to prod?"
}
node {
    stage('deploy to prod'){
        echo "deploying"
    }
}
Steve Miskiewicz
źródło
Biorąc pod uwagę, że może tam dotrzeć wiele rurociągów, co stanie się ze starszymi, które nie zostaną wdrożone do produkcji? Czy istnieje sposób na powstrzymanie starszych od pozostania tam (nie wiem, czy będą migać) w niepełnym stanie?
giorgiosironi
1
o ile mogę powiedzieć, będzie migać na zawsze, aż klikniesz przycisk Przerwij, co jest dość gówniane. prawdopodobnie możesz ustawić limit czasu, aby zapobiec zgubieniu niektórych z nich. Po upływie tego czasu utracisz możliwość jego wdrożenia. jenkins.io/doc/pipeline/steps/workflow-basic-steps/…
Steve
1
Nie rozumiałem, że dane wejściowe można skonfigurować tak, aby nie zatrzymywały agenta. To sprawia, że ​​sposób wprowadzania jest bardziej użyteczny.
djhaskin987
Byłoby miło mieć możliwość ponownego wdrożenia wersji bez budowania lub wdrożenia poprzedniej wersji.
tehnicaorg
1

Na koniec stworzyłem osobne test-projecti prod-projectpotoki, w których na końcu test-projectkod jest scalany w approvedgałąź.

Następnie prod-projectpotok można skonfigurować tak, aby nie uruchamiał się dla każdego nowego zatwierdzenia, aby można go było wdrożyć na żądanie.

giorgiosironi
źródło
0

Dodatkowo możesz również dodać limit czasu automatycznego, jak poniżej

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

Jeśli spojrzysz na to, możesz również powiązać dane wejściowe Jenkins z danymi uwierzytelniającymi użytkowników uzyskujących dostęp do Jenkins, jeśli chcesz zezwolić tylko określonym osobom na udzielanie odpowiedzi - jest to również uzasadnione faktem, że twoje kontrole Git są wystarczające.

Kru
źródło
0

To tylko prosty przykład, ale możesz go uruchomić w dowolny sposób.

stage{
    script{
        input "Continue?"
        ...enter code here
        ...
    }
}
Oren
źródło
0

Zrobiłem to, jak pokazano poniżej, czytając te dokumenty 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"'

              }
        }
  }
   }
użytkownik5956891
źródło