Existe uma maneira de inserir uma aprovação manual nos pipelines Jenkins 2?


19

O Jenkins 2 possui oleodutos e um cidadão de primeira classe. No entanto, nos exemplos, as tarefas parecem ser executadas como uma única sequência:

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

Para implantação no sistema de produção, geralmente é útil exigir aprovação manual; existe uma maneira de inserir um botão manual para pressionar dentro de um pipeline?

Estou procurando possíveis etapas para fazer isso nos documentos , sem sucesso.


Eu não conheço Jenkins, mas não há uma maneira de dividir seu plano de compilação em várias etapas e executar algumas dessas etapas apenas em um "gatilho manual"?
tiktak 5/05

Melhor solução parcial até o momento: uma inputetapa no pipeline que para e solicita entrada ao usuário (ou para abortar a compilação). No entanto, o palco e o indicador de status continua a piscar, enquanto eu queria um estado estável (por exemplo, você entrar em sexta-feira à tarde e decidir implantar na segunda-feira.)
giorgiosironi

Respostas:


18

input é a opção que você está procurando. Aqui está o jeito que eu estou usando. É importante ter a etapa fora de um nó, caso contrário, o jenkins manterá um agente aguardando a próxima etapa. Lembre-se de que o segundo nó pode não usar o mesmo espaço de trabalho que o primeiro.

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

Dado que vários pipelines podem chegar lá, o que acontece com os mais antigos que não são implantados na produção? Existe uma maneira de impedir que os mais velhos permaneçam lá (não sei se estarão piscando) em um estado incompleto?
Giorgiosironi

11
até onde eu sei, ele piscará para sempre até você clicar em abortar, o que é bem ruim. você provavelmente pode configurar um tempo limite para impedir que alguns deles se percam. Após o tempo limite, você perderia a capacidade de implantá-lo. jenkins.io/doc/pipeline/steps/workflow-basic-steps/… #
Steve Miskiewicz

11
Não entendi que a entrada poderia ser configurada para não conter um agente. Isso torna a entrada muito mais útil.
precisa saber é o seguinte

Seria bom ter a possibilidade de reimplementar uma versão, sem construção, ou implantar a versão anterior.
Tehnicaorg 18/07/19

1

No final, criei pipelines test-projecte separados prod-project, onde no final do test-projectcódigo é mesclado em uma approvedramificação.

Em seguida, o prod-projectpipeline pode ser configurado para não ser acionado para cada nova confirmação, para que possa ser implantado sob demanda.


0

Além disso, você também pode adicionar o tempo limite automático, como abaixo

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

Se você procurar, também poderá vincular a entrada jenkins às credenciais dos usuários que acessam o Jenkins se desejar permitir que indivíduos específicos sejam capazes de responder - isso também é sustentado pelo fato de que seus controles Git também são suficientes.


0

Este é apenas um exemplo simples, mas você pode acioná-lo da maneira que precisar.

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

0

Eu fiz da maneira mostrada abaixo, lendo estes documentos 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"'

              }
        }
  }
   }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.