Декларативный трубопровод Дженкинса;Как объявить переменную и использовать ее в скрипте или почтовом уведомлении? - PullRequest
0 голосов
/ 21 мая 2018

(обновление ниже)

У меня есть декларативное конвейерное задание, которое может принимать аргумент VERSION.

pipeline {
  parameters {
    string(name: VERSION, defaultValue: '')
  }

  // ...
}

Если не задано VERSION, например, когда Gitlabотправить ловушку на эту работу, я хочу вычислить ее из git, поэтому я делаю что-то вроде этого

stages {
  stage('Prepare') {
    steps {
      // ...
      if (! env.VERSION) {
        VERSION = sh(script: "git describe", returnStdout: true).trim()
      }
    }
  }
}       

Теперь я хочу «внедрить» эту переменную в

  • myСценарий сборки.Он должен найти «VERSION» в переменных окружения
  • для почтового уведомителя jenkins.И заставить его получить $ {VERSION} в теме или в тексте

Я пытался изменить код выше с помощью

stages {
  stage('Prepare') {
    steps {
      // ...
      if (! env.VERSION) {
        env.VERSION = sh(script: "git describe", returnStdout: true).trim()
      }
    }
  }
}       

Получил эту ошибку groovy.lang.MissingPropertyException: No such property: VERSION for class: groovy.lang.Binding

Затем я попытался добавить шаг «окружающей среды» ниже

environment {
    VERSION = ${VERSION}
}

, но это не решило мою проблему.

Я ищу любую помощь для ее решения.

ОБНОВЛЕНИЕ

Теперь у меня есть рабочий конвейер, который выглядит как

pipeline {
    agent any
    parameters {
        string(name: 'VERSION', defaultValue: '')
    }   
    environment {          
        def VERSION = "${params.VERSION}"
    }
    stages {
        stage('Prepare & Checkout') {
            steps {
                script {
                    if (! env.VERSION) {
                       VERSION = sh(script: "date", returnStdout: true).trim()
                    }
                    echo "** version: ${VERSION} **"
                }
            }
        }  
        stage('Build') {
            steps {
                // sh "./build.sh"
                echo "** version2: ${VERSION} **"
            }
        }
    } // stages
    post {
        always {
            mail to: 'foo@example.com',
                 subject: "SUCCESS: ${VERSION}",
                 body: """<html><body><p>SUCCESS</p></body></html>""",
                 mimeType: 'text/html',
                 charset: 'UTF-8'
            deleteDir()
        }
    }
} // pipeline

Мне нужно было добавить шаг "environment", чтобы иметь возможность получить $ VERSION ввсе стадии (не только в той, которой манипулируют).

Мне все еще нужно найти способ вставить эту переменную $ VERSION в переменные окружения, чтобы мой сценарий сборки мог ее найти.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Если вы хотите внедрить переменную в среде, чтобы вы могли использовать ее позже, вы можете определить другую переменную, равную env.VERSION или выводу сценария оболочки.Затем используйте эту переменную в своем конвейере, например:

pipeline {
  parameters {
    string(name: VERSION, defaultValue: '')
  }

  def version = env.VERSION
  stages {
  stage('Prepare') {
    steps {
      // ...
      if (!version) {
        version = sh(script: "git describe", returnStdout: true).trim()
      }
    }
  }

  mail subject: "$version build succeeded", ...
}

Если вы хотите, чтобы другие задания могли получить доступ к значению VERSION после запуска сборки, вы можете записать его в файл и заархивировать.

Редактировать: чтобы ваш скрипт мог использовать переменную версии, вы можете либо заставить ваш скрипт принимать версию в качестве параметра, либо вы можете использовать шаг withEnv .

0 голосов
/ 21 мая 2018

Предполагая, что вы используете Параметризованные конвейеры , вам следует называть переменную как ${params.parameterName}

Хотя параметры доступны в env, они в настоящее время создаются до того, как конвейер будет в первый раззапустить, поэтому вы должны получить к ним доступ через параметры:

В вашем случае:

 ${params.VERSION}
...