Как использовать глобальную переменную Jenkins Pipeline на других этапах? - PullRequest
0 голосов
/ 25 сентября 2019

Я определил глобальную переменную в конвейере Дженкинса

def BUILDNRO = '0'
pipeline { ...

Затем я манипулирую переменной с помощью сценария оболочки, чтобы включить параллельный запуск сборок, используя номер сборки задания в качестве идентификатора, чтобы мы не смешивали различные группы докеров.

    stage('Handle BUILD_NUMBER') {
        steps {
            script {
            BUILDNRO = sh( script: '''#!/bin/bash
            Build=`echo ${BUILD_NUMBER} | grep -o '..$'`
            # Check if BUILD first character is 0
            if [[ $Build:0:1 == "0" ]]; then
                # replace BUILD first character from 0 to 5
                Build=`echo $Build | sed s/./5/1`
            fi
            echo $Build
            ''',returnStdout: true).trim()
            }
        }
    }

Я получаю значение из предыдущего этапа и пытаюсь получить глобальную переменную на следующем этапе

    stage('DOCKER: Init docker swarm') {
        steps {
            echo "BUILDNRO is: ${BUILDNRO}"  --> Value is here.
            sh '''#!/bin/bash
            echo Buildnro is: ${BUILDNRO}   --> This is empty.
            ...
        }
    }

Это приведет к тому, что глобальная переменная будет пустой.Почему?на предыдущем этапе в нем было значение.

РЕДАКТИРОВАТЬ 1. Модифицированные кодовые блоки для отображения текущего состояния.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Мне удалось понять это.Вот решение, как мне удалось это сделать.BUILDNRO - это переменная groovy, и если вы хотите использовать ее в переменной bash, она должна быть передана с помощью withEnv.BUILD_NUMBER на первом этапе - это переменная bash, поэтому на первом этапе он может использоваться непосредственно сценарием.

def BUILDNRO = '0'

pipeline {
  ....
  stages {
    stage('Handle BUILD_NUMBER') {
      steps {
        script {
          BUILDNRO = sh( script: '''#!/bin/bash
          Build=`echo ${BUILD_NUMBER} | grep -o '..$'`
          ''',returnStdout: true).trim()
        }
      }
    }
    stage('DOCKER: Init docker swarm') {
      steps {
        dir("prose_env/prose_api_dev_env") {
          withEnv(["MYNRO=${BUILDNRO}"]) {
            sh(returnStdout: false, script: '''#!/bin/bash
            echo Buildnro is: ${MYNRO}`
            '''.stripIndent())
          }
        }
      }     
    }
  }
}
0 голосов
/ 25 сентября 2019

Если вы используете одинарные кавычки (`` `) в модуле оболочки, Дженкинс рассматривает каждую переменную как переменную bash.Решение заключается в использовании двойных кавычек ("" "), но затем, если вы создали переменную bash, вы должны ее избежать. Ниже приведен пример работы с вашим сценарием использования и экранированной переменной bash

pipeline {
    agent any
    stages {
        stage('Handle BUILD_NUMBER') {
            steps {
                script {
                    BUILDNRO = sh(script: 'pwd', returnStdout: true).trim()
                    echo "BUILDNRO is: ${BUILDNRO}"
                }
            }
        }
        stage('DOCKER: Init docker swarm') {
            steps {
                sh """#!/bin/bash
            echo Buildnro is: ${BUILDNRO}
            variable=world
            echo "hello \${variable}"
            sh """
            }
        }

    }
}

выход второй стадии:

Buildnro is: /var/lib/jenkins/workspace/stack1
hello world
...