wake-up-neo.com

Jenkinsfile Deklarative Pipeline, die dynamische Umgebungen definiert

Ich bin neu in Jenkins Pipeline, definiere eine deklarative Syntax-Pipeline und weiß nicht, ob ich mein Problem lösen kann, weil ich keine Lösung finde.

In diesem Beispiel muss ich eine Variable an ein anpassbares Plugin übergeben (in der alten Version verwende ich eine ENV_VAR-Datei oder injiziere sie aus einer Datei mit Injection-Plugin). Diese Variable stammt aus einem Skript.

Dies ist mein perfektes Szenario (aber es funktioniert nicht in der Umgebung {}):

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

Ich habe andere Möglichkeiten ausprobiert, um zu testen, wie Env vars in einem anderen Post funktionieren. Beispiel:

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" gibt jedoch null zurück.

Auch das gleiche Beispiel habe ich mit: - VERSION = python3.5 get_version.py- VERSION = python3.5 get_version.py> props.file ausprobiert (und versuchen, es einzuspritzen, aber nicht gefunden wie)

Wenn dies nicht möglich ist, mache ich es in der ansprechbaren Rolle.

UPDATE

Es gibt ein weiteres "Problem" in Ansible Plugin. Um Variablen in zusätzlichen Variablen zu verwenden, müssen doppelte Anführungszeichen anstelle von einfachen Anführungszeichen verwendet werden.

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

Sie können Variablen erstellen, bevor der Pipeline-Block beginnt. Sie können sh stdout zurückgeben, um diese Variablen zuzuweisen. Sie haben nicht die gleiche Flexibilität, um Umgebungsvariablen in der Zeilengruppe environment zuzuweisen. Ersetzen Sie also in python3.5 get_version.py, wo ich echo 0.0.1 im Skript hier habe (und stellen Sie sicher, dass Ihr Python-Skript nur die Version an stdout zurückgibt):

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

Die Ausgabe der obigen Pipeline ist:

awesomeVersion: 0.0.1
68
burnettk

In Jenkins 2.76 konnte ich die Lösung von @burnettk vereinfachen:

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

Mit dem Plugin "Pipeline-Dienstprogrammschritte" können Sie allgemeine Variablen definieren, die für alle Stufen in einer Eigenschaftendatei verfügbar sind. Lassen Sie zum Beispiel props.txt als:

version=1.0
fix=alfa

und mischen Sie Skript und deklarative Jenkins-Pipeline wie folgt:

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

Sie können auch alle Ihre Variablen in eine Datei sichern und dann die Syntax '-e @file' verwenden. Dies ist sehr nützlich, wenn Sie viele Variablen auffüllen müssen.

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