Skip to content

How to make manual approval in Jenkins pipeline and notify in telegram

Last updated on December 2, 2023

To make manual approval in Jenkins pipeline, you can use the input step. Here’s an example:

pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        // build your code here
      }
    }
    stage('Approval') {
        steps {
            script {
                  def deploymentDelay = input id: 'Deploy', message: 'Deploy to production?', submitter: 'admin', parameters: [choice(choices: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24'], description: 'Hours to delay deployment?', name: 'deploymentDelay')]
                  sleep time: deploymentDelay.toInteger(), unit: 'HOURS'
            }
        }
    } 
    stage('Deploy') {
      steps {
        // deploy your code here after manual approve
      }
    }
  }
}

stage(‘Approval’) lets you manually approve, decline or postpone for 24 hours

Let’s make it even interesting and add telegram notifications for Approval stage.

First we need to create telegram bot in @botfather , then we install Telegram Bot Plugin for Jenkins here.

Setup

Create a Telegram bot

  1. Find BotFather in Telegram (@BotFather)
  2. Send /newbot command
  3. Enter bot name and bot username

Jenkins Global configuration

  1. Open the Jenkins global config
  2. Paste your bot name and username to according textfields
  3. In filed Usernames fill names of users who can get Jenkins messages (separated by spaces)
  4. Save

Subscribe for Jenkins messages

  1. In telegram find your bot and send /start command
  2. Send */sub *command

Configuration

Manage your job

1. Add build-step (or post build-step.

2. Fill the message (you can use environment variables and simple Markdown)

3. Save your job

Then we need to configure our pipeline.

pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        // build your code here
      }
    }
    stage('Approval') {
        steps {
            script {
                  telegramSend "⌛️ *$env.JOB_NAME* #$env.BUILD_NUMBER - *Deploy to PROD?* \n$env.BUILD_URL"
                  def deploymentDelay = input id: 'Deploy', message: 'Deploy to production?', submitter: 'admin', parameters: [choice(choices: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24'], description: 'Hours to delay deployment?', name: 'deploymentDelay')]
                  sleep time: deploymentDelay.toInteger(), unit: 'HOURS'
            }
        }
    } 
    stage('Deploy') {
      steps {
        // deploy your code here after manual approve
      }
    }
  }
    post {
      success {
            telegramSend "✅ *$env.JOB_NAME* #$env.BUILD_NUMBER - *SUCCESS* \n$env.BUILD_URL \n Deployed to ${AGENT_LABEL}" 
        }
      failure {
            telegramSend "❌ *$env.JOB_NAME* #$env.BUILD_NUMBER - *FAILED*, \nplease check $env.BUILD_URL"
        }
      aborted {
            telegramSend "⚫️ *$env.JOB_NAME* #$env.BUILD_NUMBER - *ABORTED*, \nplease check $env.BUILD_URL"
        }              
    }  
}

The result looks like this

Published inAutomationci/cdJenkinsLinuxTelegram