¿Hay alguna manera de insertar una aprobación manual en las tuberías Jenkins 2?

19

Jenkins 2 tiene tuberías tiene un ciudadano de primera clase. Sin embargo, en los ejemplos, las tareas parecen ejecutarse como una secuencia única:

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

Para la implementación en el sistema de producción, a menudo es útil requerir aprobación manual; ¿Hay alguna manera de insertar un botón manual para presionar dentro de una tubería?

He estado buscando posibles pasos para lograr esto en los documentos , en vano.

giorgiosironi
fuente
No conozco a Jenkins, pero ¿no hay una manera de dividir su plan de compilación en varios pasos, y hacer que algunos de estos pasos se ejecuten solo en un "disparador manual"?
tiktak
La mejor solución parcial hasta ahora: un inputpaso en la tubería que se detiene y le pide al usuario una entrada (o abortar la compilación). Sin embargo, el escenario y el indicador de estado sigue parpadeando, mientras que quería un estado estable (por ejemplo, entrar en ella viernes por la tarde y decide implementar el lunes.)
giorgiosironi

Respuestas:

18

input es la opción que estás buscando. Aquí está la forma en que lo estoy usando. Es importante tener el paso fuera de un nodo, de lo contrario, Jenkins mantendrá a un agente esperando el siguiente paso. Tenga en cuenta que el segundo nodo puede no usar el mismo espacio de trabajo que el primero.

node {
    stage('build'){
        echo "building"
    }
}
stage('Deploy approval'){
    input "Deploy to prod?"
}
node {
    stage('deploy to prod'){
        echo "deploying"
    }
}
Steve Miskiewicz
fuente
Dado que pueden llegar múltiples tuberías, ¿qué sucede con las más antiguas que no se implementan en producción? ¿Hay alguna manera de evitar que los más antiguos permanezcan allí (no sé si parpadearán) en un estado incompleto?
giorgiosironi
1
Por lo que puedo decir, parpadeará para siempre hasta que hagas clic en abortar, lo cual es bastante malo. probablemente podría configurar un tiempo de espera para evitar que algunos de estos se pierdan. Sin embargo, después del tiempo de espera, perderías la capacidad de implementarlo. jenkins.io/doc/pipeline/steps/workflow-basic-steps/…
Steve Miskiewicz
1
No entendí que la entrada podría configurarse para no detener a un agente. Esto hace que la entrada sea más útil.
djhaskin987
Sería bueno tener la posibilidad de volver a implementar una versión, sin compilar, o implementar la versión anterior.
tehnicaorg
1

Al final, creé tuberías separadas test-projecty prod-project, donde al final del test-projectcódigo se fusionó en una approvedrama.

Luego, prod-projectse puede configurar la canalización para que no se active para cada nueva confirmación, de modo que se pueda implementar a pedido.

giorgiosironi
fuente
0

Además, también puede agregar tiempo de espera automático como se muestra a continuación

        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 lo busca, también puede vincular la entrada de jenkins a las credenciales de los usuarios que acceden a Jenkins si solo desea permitir que individuos específicos sean capaces de responder; también se basa en el hecho de que sus controles Git también son suficientes.

Kru
fuente
0

Este es solo un ejemplo simple, pero puede activarlo como lo necesite.

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

Lo hice como se muestra a continuación al leer estos 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"'

              }
        }
  }
   }
usuario5956891
fuente