web-dev-qa-db-fra.com

Jenkinsfile Declarative Pipeline définissant les variables dynamiques de l'environnement

Je suis nouveau dans le pipeline Jenkins, je définis un pipeline de syntaxe déclarative et je ne sais pas si je peux résoudre mon problème, car je ne trouve pas de solution.

Dans cet exemple, je dois passer une variable au plugin ansible (dans l’ancienne version, j’utilisais ENV_VAR ou si je l’injectais à partir d’un fichier avec inject plugin, cette variable provient d’un script.

Ceci est mon décor parfait (mais cela ne fonctionne pas car environnement {}):

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

J'ai essayé d'autres méthodes pour tester le fonctionnement de env vars dans d'autres publications, par exemple:

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

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

mais "echo env.VERSION" renvoie null.

Aussi essayé le même exemple avec: - VERSION = python3.5 get_version.py- VERSION = python3.5 get_version.py> props.file (et essayez de l'injecter, mais n'a pas trouvé comment)

Si ce n'est pas possible, je le ferai dans le rôle ansible.

METTRE À JOUR

Il y a un autre "problème" dans Ansible Plugin, pour utiliser vars dans des vars supplémentaires, il doit avoir des guillemets doubles au lieu de simples.

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

Vous pouvez créer des variables avant le début du bloc de pipeline. Vous pouvez avoir sh return stdout à affecter à ces variables. Vous ne disposez pas de la même souplesse pour affecter des variables d'environnement dans la strophe environment. Donc remplacez dans python3.5 get_version.py où j'ai echo 0.0.1 dans le script ici (et assurez-vous que votre script python renvoie simplement la version à 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}"
      }
    }
  }
}

La sortie du pipeline ci-dessus est:

awesomeVersion: 0.0.1
68
burnettk

Dans Jenkins 2.76, j’ai pu simplifier la solution de @burnettk pour:

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

À l'aide du plug-in "Pipeline Utility Steps", vous pouvez définir des vars généraux disponibles pour toutes les étapes à partir d'un fichier de propriétés. Par exemple, laissez props.txt comme:

version=1.0
fix=alfa

et mélangez le script et le pipeline déclaratif Jenkins en tant que:

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

Vous pouvez également vider tous vos vars dans un fichier, puis utiliser la syntaxe '-e @file'. Ceci est très utile si vous avez beaucoup de vars à peupler.

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