Jenkinsfile Declarative Pipeline die dynamische env-vars definieert

Ik ben nieuw in de Jenkins-pijplijn; Ik definieer een declaratieve syntaxispijplijn en ik weet niet of ik mijn probleem kan oplossen, omdat ik geen oplossing heb gevonden.

In dit voorbeeld moet ik een variabele doorgeven aan een ansible-plug-in (in de oude versie gebruik ik een ENV_VAR of injecteer ik deze vanuit een bestand met inject-plug-in) die variabele komt uit een script.

Dit is mijn perfecte scenario (maar het werkt niet vanwege de omgeving{}):

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

Ik heb andere manieren geprobeerd om te testen hoe env-vars werken in een andere post, bijvoorbeeld:

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

maar “echo env.VERSION” retourneert null.

Ook hetzelfde voorbeeld geprobeerd met:
– VERSION=python3.5 get_version.py
– VERSION=python3.5 get_version.py> props.file (en probeer het te injecteren, maar heb niet gevonden hoe)

Als dit niet mogelijk is, doe ik het in de ansible-rol.

UPDATE

Er is nog een “probleem” in de Ansible-plug-in, om vars in extra vars te gebruiken, moeten dubbele aanhalingstekens worden gebruikt in plaats van enkele.

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

Antwoord 1, autoriteit 100%

U kunt variabelen maken voordat het pijplijnblok begint. U kunt shstdout laten retourneren om aan deze variabelen toe te wijzen. Je hebt niet dezelfde flexibiliteit om omgevingsvariabelen toe te wijzen in de environmentstrofe. Dus vervang in python3.5 get_version.pywaar ik echo 0.0.1in het script hier heb (en zorg ervoor dat je python-script de versie gewoon terugstuurt naar stdout):

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

De uitvoer van de bovenstaande pijplijn is:

awesomeVersion: 0.0.1

Antwoord 2, autoriteit 22%

In Jenkins 2.76 kon ik de oplossing van @burnettk vereenvoudigen tot:

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

Antwoord 3, autoriteit 4%

Met behulp van de plug-in “pipeline utility steps” kunt u vanuit een eigenschappenbestand algemene vars definiëren die beschikbaar zijn voor alle fasen. Laat bijvoorbeeld props.txtals:

version=1.0
fix=alfa

en mix script en declaratieve Jenkins-pijplijn als:

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

Antwoord 4, autoriteit 2%

Een mogelijke variatie op het hoofdantwoord is om een ​​variabele aan te bieden met een andere pijplijn in plaats van een sh-script.

voorbeeld (stel de variabele pijplijn in): mijn-set-env-variabelen pijplijn

script
{
    env.my_dev_version = "0.0.4-SNAPSHOT"
    env.my_qa_version  = "0.0.4-SNAPSHOT"
    env.my_pp_version  = "0.0.2"
    env.my_prd_version = "0.0.2"
    echo " My versions  [DEV:${env.my_dev_version}] [QA:${env.my_qa_version}] [PP:${env.my_pp_version}] [PRD:${env.my_prd_version}]"
}

(gebruik deze variabelen) in een andere pijplijn my-set-env-variables-test

script 
{
    env.dev_version = "NOT DEFINED DEV"
    env.qa_version  = "NOT DEFINED QA"
    env.pp_version  = "NOT DEFINED PP"
    env.prd_version = "NOT DEFINED PRD"
}
stage('inject variables') {
    echo "PRE DEV version = ${env.dev_version}"
    script 
    {
       // call set variable job
       def variables = build job: 'my-set-env-variables'
       def vars = variables.getBuildVariables()
      //println "found variables" + vars
      env.dev_version = vars.my_dev_version
      env.qa_version  = vars.my_qa_version
      env.pp_version  = vars.my_pp_version
      env.prd_version = vars.my_prd_version
    }
}
stage('next job') {
    echo "NEXT JOB DEV version = ${env.dev_version}"
    echo "NEXT JOB QA version = ${env.qa_version}"
    echo "NEXT JOB PP version = ${env.pp_version}"
    echo "NEXT JOB PRD version = ${env.prd_version}"
}

Antwoord 5

Je kunt ook al je vars in een bestand dumpen en dan de ‘-e @file’-syntaxis gebruiken. Dit is erg handig als je veel vars moet invullen.

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

Other episodes