it-swarm.com.de

Datei mit Umgebungsvariablen laden Jenkins Pipeline

Ich mache eine einfache Pipeline:

Build -> Inszenierung -> Produktion

Ich brauche verschiedene Umgebungsvariablen für das Staging und die Produktion, also versuche ich source variables.

sh 'source $JENKINS_HOME/.envvars/stacktest-staging.sh' 

Aber es kehrt zurück nicht gefunden

[Stack Test] Running Shell script
+ source /var/jenkins_home/.envvars/stacktest-staging.sh
/var/jenkins_home/workspace/Stack [email protected]/durable-bcbe1515/script.sh: 2: /var/jenkins_home/workspace/Stack [email protected]/durable-bcbe1515/script.sh: source: not found

Der Pfad ist richtig, weil ich den gleichen Befehl ausführe, wenn ich mich über ssh anmelde, und es funktioniert gut.

Hier ist die Pipeline-Idee:

node {
    stage name: 'Build'
    // git and gradle build OK
    echo 'My build stage'

    stage name: 'Staging'
    sh 'source $JENKINS_HOME/.envvars/stacktest-staging.sh' // PROBLEM HERE
    echo '$DB_URL' // Expects http://production_url/my_db
    sh 'gradle flywayMigrate' // To staging
    input message: "Does Staging server look good?"    

    stage name: 'Production'
    sh 'source $JENKINS_HOME/.envvars/stacktest-production.sh'
    echo '$DB_URL' // Expects http://production_url/my_db
    sh 'gradle flywayMigrate' // To production
    sh './deploy.sh'
}

Was soll ich machen?

  • Ich habe darüber nachgedacht, keine Pipeline zu verwenden (aber ich kann mein Jenkinsfile nicht verwenden).
  • Oder machen Sie mit EnvInject Plugin verschiedene Jobs für Inszenierung und Produktion (aber ich verliere meine Bühnenansicht)
  • Oder withEnv machen (aber der Code wird groß, da ich heute mit 12 env vars arbeite)
15
Rafael

Sie können Umgebungsvariablen aus einer Datei laden, indem Sie eine Groovy-Datei laden.

Zum Beispiel:

  1. Nehmen wir an, Sie haben in '$ JENKINS_HOME/.envvars' eine groovige Datei namens 'stacktest-staging.groovy'.
  2. In dieser Datei definieren Sie zwei Umgebungsvariablen, die Sie laden möchten 

    env.DB_URL="hello"
    env.DB_URL2="hello2"
    
  3. Sie können dieses dann mit laden

    load "$JENKINS_HOME/.envvars/stacktest-staging.groovy"
    
  4. Sie können sie dann in nachfolgenden Echo-/Shell-Schritten verwenden.

Zum Beispiel ist hier ein kurzes Pipeline-Skript:

node {
   load "$JENKINS_HOME/.envvars/stacktest-staging.groovy"
   echo "${env.DB_URL}"
   echo "${env.DB_URL2}"
}
25
Daniel Omoto

Von den Kommentaren zur akzeptierten Antwort

Verwenden Sie kein globales 'env', sondern ein 'withEnv'-Konstrukt. Siehe dazu: Ausgabe # 9: Setzen Sie env vars nicht mit globalem env in top 10 Best Practices jenkins pipeline plugin

Im folgenden Beispiel: VAR1 ist ein reiner Java-String (keine Erweiterung der Groovy-Variablen), VAR2 ist ein grooviger String (daher wird die Variable 'someGroovyVar' erweitert).

Das übergebene Skript ist ein reiner Java-String, also werden $ VAR1 und $ VAR2 buchstäblich an die Shell übergeben, und die Echo-Variablen greifen auf die Umgebungsvariablen VAR1 und VAR2 zu.

stage('build') {
    def someGroovyVar = 'Hello world'
    withEnv(['VAR1=VALUE ONE',
             "VAR2=${someGroovyVar}"
            ]) {
        def result = sh(script: 'echo $VAR1; echo $VAR2', returnStdout: true)
        echo result
    }
}

Für Geheimnisse/Kennwörter können Sie das Bindungs-Plugin credentials verwenden.

Beispiel:

ANMERKUNG: CREDENTIALS_ID1 ist ein registrierter Benutzername/Passwort, das in den Jenkins-Einstellungen geheim ist.

stage('Push') {
    withCredentials([usernamePassword(
                         credentialsId: 'CREDENTIALS_ID1',
                         passwordVariable: 'PASSWORD',
                         usernameVariable: 'USER')]) {
        echo "User name: $USER"
        echo "Password:  $PASSWORD"
    }
}

Die Ausgabe der Jenkisn-Konsole protokolliert die tatsächlichen Werte:

[Pipeline] echo
User name: ****
[Pipeline] echo
Password:  ****

Jenkins und Berechtigungsnachweise sind ein großes Problem, siehe wahrscheinlich: credentials plugin

Der Vollständigkeit halber: Meistens benötigen wir die Geheimnisse in Umgebungsvariablen, wie wir sie von Shell-Skripten aus verwenden. Daher kombinieren wir die withCredentials und withEnv wie folgt:

stage('Push') {
    withCredentials([usernamePassword(
                         credentialsId: 'CREDENTIALS_ID1',
                         passwordVariable: 'PASSWORD',
                         usernameVariable: 'USER')]) {
        withEnv(["ENV_USERNAME=${USER}",
                 "ENV_PASSWORD=${PASSWORD}"
            ]) {
                def result = sh(script: 'echo $ENV_USERNAME', returnStdout: true)
                echo result

        }
    }
}
14

Eine andere Möglichkeit, dieses Plugin "Pipeline Utility Steps" zu installieren, das die readProperties-Methode bereitstellt (Referenz finden Sie unter dem Link https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#pipeline- utility-steps ) Hier im Beispiel können wir sehen, dass sie die Schlüssel in einem Array speichern und den Wert mithilfe der Schlüssel abrufen. In diesem Fall ist das Problem jedoch so, als würden wir später in die Eigenschaftendatei eine Variable hinzufügen, die ebenfalls in das Array der Jenkins-Datei eingefügt werden muss . Um diese enge Kopplung zu beseitigen, können Sie Code so schreiben, dass die Jenkins-Build-Umgebung automatisch Informationen zu allen vorhandenen Schlüsseln erhält, die sich derzeit in der Property-Datei befinden. Hier ist ein Beispiel für die Referenz 

def loadEnvironmentVariables(path){
    def props = readProperties  file: path
    keys= props.keySet()
    for(key in keys) {
        value = props["${key}"]
        env."${key}" = "${value}"
    }
} 

Und der Client-Code sieht so aus 

path = '\\ABS_Output\\EnvVars\\pic_env_vars.properties'
loadEnvironmentVariables(path)
1
Sumanta Mondal

Wenn Sie Jenkins 2.0 verwenden, können Sie die Eigenschaftsdatei (die aus allen erforderlichen Umgebungsvariablen zusammen mit den entsprechenden Werten besteht) laden, alle dort aufgelisteten Umgebungsvariablen automatisch lesen und in die von Jenkins bereitgestellte Entität env einfügen.

Hier ist eine Methode, die die oben angegebene Aktion ausführt.

def loadProperties(path) {
    properties = new Properties()
    File propertiesFile = new File(path)
    properties.load(propertiesFile.newDataInputStream())
    Set<Object> keys = properties.keySet();
    for(Object k:keys){
    String key = (String)k;
    String value =(String) properties.getProperty(key)
    env."${key}" = "${value}"
    }
}

Um diese Methode aufzurufen, müssen wir den Pfad der Eigenschaftendatei als Stringvariable übergeben. In unserer Jenkins-Datei können Sie beispielsweise mit einem groovigen Skript wie aufrufen

path = "${workspace}/pic_env_vars.properties"
loadProperties(path)

Bitte fragen Sie mich, wenn Sie Zweifel haben

0
Sumanta Mondal