27

Jenkins 2 has pipelines has a first class citizen. However, in the examples the tasks seem to be executed as a single sequence:

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

For deployment into production system it's often useful to require manual approval; is there a way to insert a manual button to press inside a pipeline?

I have been looking for possible steps to accomplish this on the docs, to no avail.

5 Answers5

23

input is the option you are looking for. Here is the way I'm using it. It's important to have the step outside a node, otherwise jenkins will hold an agent waiting for the next step. Keep in mind the second node may not use the same workspace as the first.

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

I did in as shown below way by reading this docs 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"'

              }
        }
  }
   }
2

Additionally, You can also add auto-timeout like below

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

If you look it up you can also bind the jenkins input to credentials of users accessing Jenkins if you only wish to permit specific individuals to be capable of answering - it also is underpinned by the fact that your Git controls are sufficient too.

Kru
  • 21
1

In the end I created separate test-project and prod-project pipelines, where at the end of test-project the code is merged into an approved branch.

Then, the prod-project pipeline can be set up not to trigger for every new commit so that it can be deployed on-demand.

0

This is just a simple example but you can trigger it however you need.

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