2016-08-26 21 views
8

robie prosty rurociągu:Załaduj plik ze zmiennych środowiskowych Jenkins Pipeline

Build -> Etapowania -> Produkcja

muszę różne zmienne środowiskowe dla inscenizacji i produkcji, więc staram się zmienne źródłowe:.

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

ale zwraca Nie znaleziono

[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 

Ścieżka ma rację, bo uruchomić tego samego polecenia po zalogowaniu się przez ssh, i to działa dobrze.

Oto pomysł rurociąg:

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

co mam zrobić?

  • Myślałem o tym, aby nie używać potoku (ale nie będę mógł używać mojego pliku Jenkins).
  • lub dokonać różnych miejsc pracy dla inscenizacji i produkcji, przy użyciu EnvInject Plugin (ale tracę widok etap)
  • lub dokonać withEnv (ale kod staje się duży, bo dziś pracuję z 12 env vars)

Odpowiedz

12

Jednym ze sposobów załadowania zmiennych środowiskowych z pliku jest załadowanie pliku Groovy.

Na przykład:

  1. Powiedzmy masz plik w groovy '$ JENKINS_HOME/.envvars' zwanego 'stacktest-staging.groovy'.
  2. Wewnątrz tego pliku należy zdefiniować 2 zmienne środowiskowe chcesz załadować

    env.DB_URL="hello" 
    env.DB_URL2="hello2" 
    
  3. Następnie można załadować w użyciu

    load "$JENKINS_HOME/.envvars/stacktest-staging.groovy" 
    
  4. Następnie można korzystać z nich w późniejszym echa/Shell kroki.

Na przykład tutaj jest krótki skrypt rurociąg:

node { 
    load "$JENKINS_HOME/.envvars/stacktest-staging.groovy" 
    echo "${env.DB_URL}" 
    echo "${env.DB_URL2}" 
} 
+0

Dzięki za odpowiedź. Dokładnie tego potrzebuję. A także dzięki za szczegółowe wyjaśnienie. Bardzo łatwo było replikować. – Rafael

+1

Należy zauważyć, że używanie zmiennej env jest odradzane, ponieważ zmienna env jest globalna. Zalecaną praktyką byłoby ładowanie lokalnych zmiennych, a następnie ustawienie ich jako zmiennych środowiskowych w części potoku za pomocą konstrukcji 'withEnv'. – stoned

+0

@ Stonowany, jak mogę użyć hasła zEnv i Jenkinsfile? (bez narażania mojego hasła na Jenkinsfile, ponieważ nie chcę tego w repozytorium git). Czy istnieje sposób bez 'load 'myenvvars.groovy" '. – Rafael

7

Z uwag do accepted answer

Nie wykorzystują globalną 'env', ale używają 'withEnv' konstruktu, np zobacz: wydanie # 9: nie ustawiaj env vars z globalnym env w top 10 best practices jenkins pipeline plugin

W poniższym przykładzie: VAR1 jest zwykłym ciągiem java (bez groovy zmiennej expa nsion), VAR2 jest groovy string (zmienna "someGroovyVar" jest rozszerzana).

Podany skrypt jest zwykłym ciągiem java, więc $ VAR1 i $ VAR2 są przekazywane dosłownie do powłoki, a echa uzyskują dostęp do zmiennych środowiskowych VAR1 i VAR2.

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

tajemnic/haseł można użyć credentials binding plugin

Przykład:

UWAGA: CREDENTIALS_ID1 jest zarejestrowany tajny login/hasło od ustawień Jenkins.

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

jenkisn wyjście dziennika konsola ukrywa prawdziwe wartości:

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

Jenkins i poświadczenia jest to duży problem, prawdopodobnie zobaczyć: credentials plugin

Dla kompletności: Większość czasu, musimy sekrety zmiennych środowiskowych, ponieważ używamy ich ze skryptów powłoki, więc łączymy to zCredentials i zEnv w następujący sposób:

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 

     } 
    } 
} 
Powiązane problemy