Декларативный трубопровод Jenkinsfile, определяющий динамические env vars

Я новичок в трубопроводе Дженкинса; Я определяю декларативный синтаксический конвейер и не знаю, смогу ли я решить мою проблему, потому что я не нашел решения.

В этом примере мне нужно передать переменную в ansible плагин (в старой версии я использую ENV_VAR или вставлять его из файла с помощью плагина inject), эта переменная происходит из скрипта.

Это мой идеальный сценарий (но он не работает, потому что среда {}):

pipeline {
  agent { node { label 'jenkins-node'}}

  stages {
    stage('Deploy') {
      environment {
        ANSIBLE_CONFIG = '${WORKSPACE}/chimera-ci/ansible/ansible.cfg'
        VERSION = sh("python3.5 docker/get_version.py")
      }
      steps {
        ansiblePlaybook credentialsId: 'example-credential', extras: '-e version=${VERSION}', inventory: 'development', playbook: 'deploy.yml'
      }
    }
  }
}

Я попробовал другие способы проверить работу env vars в другом посте, например:

pipeline {
  agent { node { label 'jenkins-node'}}

  stages {
    stage('PREPARE VARS') {
      steps {
        script {
          env['VERSION'] = sh(script: "python3.5 get_version.py")
        }
        echo env.VERSION
      }
    }
  }
}

но "echo env.VERSION" возвращает ноль.

Также попробовал тот же пример с: - VERSION = python3.5 get_version.py - VERSION = python3.5 get_version.py > props.file (и попытаться внедрить его, но не нашел как)

Если это невозможно, я сделаю это в роли.

ОБНОВИТЬ

В Ansible Plugin есть еще одна "проблема": чтобы использовать переменные в дополнительных переменных, они должны иметь двойные кавычки вместо одинарных.

ansiblePlaybook credentialsId: 'example-credential', extras: "-e version=${VERSION}", inventory: 'development', playbook: 'deploy.yml'

Ответ 1

Вы можете создавать переменные перед запуском блока конвейера. Вы можете иметь sh return stdout для назначения этим переменным. У вас нет такой же гибкости для назначения переменных среды в строфе environment. Поэтому замените в python3.5 get_version.py, где у меня есть echo 0.0.1 в script здесь (и убедитесь, что ваш python script просто возвращает версию в stdout):

def awesomeVersion = 'UNKNOWN'

pipeline {
  agent { label 'docker' }
  stages {
    stage('build') {
      steps {
        script {
          awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
        }
      }
    }
    stage('output_version') {
      steps {
        echo "awesomeVersion: ${awesomeVersion}"
      }
    }
  }
}

Выходной сигнал вышеуказанного конвейера:

awesomeVersion: 0.0.1

Ответ 2

В Jenkins 2.76 мне удалось упростить решение от @burnettk до:

pipeline {
  agent { label 'docker' }
  environment {
    awesomeVersion = sh(returnStdout: true, script: 'echo 0.0.1')
  }
  stages {
    stage('output_version') {
      steps {
        echo "awesomeVersion: ${awesomeVersion}"
      }
    }
  }
}

Ответ 3

Используя плагин "шаги утилиты" трубопровод ", вы можете определить общие вары, доступные на всех этапах из файла свойств. Например, пусть props.txt как:

version=1.0
fix=alfa

и смешать скрипт и декларативный трубопровод Дженкинса как:

def props
def VERSION
def FIX
def RELEASE

node {
   props = readProperties file:'props.txt'
   VERSION = props['version']
   FIX = props['fix']
   RELEASE = VERSION + "_" + FIX
}

pipeline {
   stages {
      stage('Build') {
         echo ${RELEASE}
      }
   }
}

Ответ 4

Вы также можете сбрасывать все ваши vars в файл, а затем использовать синтаксис "-e @file". Это очень полезно, если у вас много наростов для заполнения.

steps {
  echo "hello World!!"
  sh """
  var1: ${params.var1}
  var2: ${params.var2}
  " > vars
  """
  ansiblePlaybook inventory: _inventory, playbook: 'test-playbook.yml', sudoUser: null, extras: '-e @vars'
}