2016-08-26 24 views
8

Tôi đang làm một đường ống đơn giản:tập tin tải với các biến môi trường Jenkins Pipeline

Build -> Staging -> Sản xuất

tôi cần biến môi trường khác nhau cho dàn dựng và sản xuất, vì vậy tôi đang cố gắng để nguồn biến số.

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

Nhưng nó trả Không tìm thấy

[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 

Đường dẫn là đúng, bởi vì tôi chạy lệnh tương tự khi tôi đăng nhập thông qua ssh, và nó hoạt động tốt.

Dưới đây là ý tưởng đường ống:

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

tôi nên làm gì?

  • Tôi đã suy nghĩ về việc không sử dụng đường ống dẫn (nhưng tôi sẽ không thể sử dụng Jenkinsfile của mình).
  • Hoặc làm công việc khác nhau cho dàn dựng và sản xuất, sử dụng EnvInject Plugin (Nhưng tôi mất điểm sân khấu của tôi)
  • Hoặc làm withEnv (nhưng mã trở nên trầm trọng, bởi vì hiện nay tôi đang làm việc với 12 env VAR)

Trả lời

12

Một cách bạn có thể tải các biến môi trường từ một tệp là tải một tệp Groovy.

Ví dụ:

  1. Hãy nói rằng bạn có một tập tin groovy trong '$ JENKINS_HOME/.envvars' gọi 'stacktest-staging.groovy'.
  2. Bên trong tập tin này, bạn xác định 2 biến môi trường bạn muốn tải

    env.DB_URL="hello" 
    env.DB_URL2="hello2" 
    
  3. Sau đó bạn có thể tải này trong việc sử dụng

    load "$JENKINS_HOME/.envvars/stacktest-staging.groovy" 
    
  4. Sau đó, bạn có thể sử dụng chúng trong tiếp theo echo/vỏ các bước.

Ví dụ, đây là một kịch bản đường ống ngắn:

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

Cảm ơn câu trả lời. Đó là chính xác những gì tôi cần. Và cũng nhờ lời giải thích chi tiết. Nó rất dễ tái tạo. – Rafael

+1

Xin lưu ý rằng việc sử dụng biến env không được khuyến khích, vì biến env là toàn cục. Thực hành được khuyến nghị là tải các biến cục bộ, và sau đó cuối cùng đặt chúng thành các biến môi trường nếu cần trong một phần của một đường ống bằng cách sử dụng cấu trúc 'withEnv'. – stoned

+0

@ ngạc nhiên như thế nào tôi có thể sử dụng một mật khẩu với withnnv và Jenkinsfile? (mà không lộ mật khẩu của tôi trên Jenkinsfile, bởi vì tôi không muốn nó trên kho git). Có cách nào không có 'tải 'myenvvars.groovy" '. – Rafael

7

Từ các ý kiến ​​cho accepted answer

Không sử dụng toàn cầu 'env' nhưng sử dụng cấu trúc 'withEnv', ví dụ: xem: vấn đề # 9: không đặt env vars với env toàn cầu trong top 10 best practices jenkins pipeline plugin

Trong ví dụ sau: VAR1 là một chuỗi java đơn giản (không có biến ngẫu nhiên nsion), VAR2 là một chuỗi groovy (do đó biến 'someGroovyVar' được mở rộng).

Tập lệnh được truyền là một chuỗi java đơn giản, vì vậy $ VAR1 và $ VAR2 được chuyển theo nghĩa đen tới trình bao, và của echo đang truy cập các biến môi trường VAR1 và 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 
    } 
} 

Đối với bí mật/mật khẩu, bạn có thể sử dụng credentials binding plugin

Ví dụ:

LƯU Ý: CREDENTIALS_ID1 là một bí mật tên người dùng/mật khẩu đã đăng ký vào các thiết lập Jenkins.

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

Sản lượng console log jenkisn ẩn giá trị thực:

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

Jenkins và các thông tin là một vấn đề lớn, có lẽ xem: credentials plugin

Đối với đầy đủ: Hầu hết thời gian, chúng ta cần những bí mật trong các biến môi trường, như chúng ta sử dụng chúng từ các kịch bản shell, vì vậy chúng ta kết hợp các withCredentials và withEnv như sau:

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 

     } 
    } 
} 
Các vấn đề liên quan