Làm cách nào để đặt biến môi trường trong Jenkins?


228

Tôi muốn có thể làm một cái gì đó như:

AOEU=$(echo aoeu)

và có Jenkins thiết lập AOEU=aoeu.

Phần Biến môi trường trong Jenkins không làm điều đó. Thay vào đó, nó thiết lập AOEU='$(echo aoeu)'.

Làm cách nào để Jenkins đánh giá lệnh shell và gán đầu ra cho biến môi trường?

Cuối cùng, tôi muốn có thể gán người thực thi công việc cho một biến môi trường có thể được truyền vào hoặc sử dụng bởi các tập lệnh khác.


2
Plugin EnvInject đang có một số lỗ hổng bảo mật nghiêm trọng. Bây giờ Jenkins đang có hỗ trợ sẵn có cho stackoverflow.com/a/53430757/1753177
lambodar

@lambodar liên kết chỉ đi đến câu hỏi
Z. Cochrane

@ Z.Cochrane, đó là một liên kết đến một câu trả lời đã bị xóa bởi tác giả.
Noel Yap

Câu trả lời:


217

Điều này có thể được thực hiện thông qua plugin EnvInject theo cách sau:

  1. Tạo một bước xây dựng "Thực thi shell" chạy:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Tạo bước xây dựng biến môi trường Tiêm biến và đặt "Đường dẫn tệp thuộc tính" thành propsfile.

Lưu ý : Plugin này (hầu hết) không tương thích với plugin Pipeline.


4
EnvInject không xử lý tình huống tôi đã đưa ra ở trên: [EnvInject] - Tiêm dưới dạng biến môi trường nội dung thuộc tính AOEU = $ (echo aoeu) [EnvInject] - Biến được tiêm thành công. [EnvInject] - Bỏ đặt biến 'AOEU' chưa được giải quyết.
Noel Yap

1
Giải pháp đó sử dụng cú pháp shell Unix và sẽ không hoạt động trên windows.
fbmd

2
@fbmd Tôi đang chạy nó trên Windows. Bạn chỉ cần chắc chắn rằng bạn có shtrên con đường.
Custodio

2
EnvInject không hoạt động nếu "shell thực thi" xuất hiện lỗi do quá trình xây dựng không tiến hành phần tiêm.
Chadi

1
@ Vitim.us, foosẽ được xuất trong hành động shell cụ thể đó nhưng không được thực hiện trong các hành động khác.
Noel Yap

109

Cách đơn giản nhất

Bạn có thể sử dụng plugin EnvInject để tiêm các biến môi trường khi xây dựng khởi động. Ví dụ:

Thêm khóa = giá trị (bash OK!) Trong 'Xây dựng môi trường' -> 'Tiêm các biến môi trường vào quy trình xây dựng' -> 'Nội dung thuộc tính'

Sao bạn biết nó hoạt động

EnvInject - Biến được tiêm thành công


5
Hãy thử thiết lập giá trị dựa trên đầu ra của lệnh shell.
Noel Yap

1
@NoelYap Hoạt động quá, miễn là cuối cùng dòng đánh giá key=value. Trong trường hợp sử dụng của tôi, tôi tạo ra dòng hoàn toàn: cat app/build.gradle | grep "def majorVersion" | python -c 'import sys,re,os; print("VERSION_NUMBER="+re.findall(r"[\d+\.]+", sys.stdin.read())[0]+os.environ["BUILD_NUMBER"])'
kenny_k

@theFunkyEngineer bạn đang sử dụng phiên bản nào của EnvInject? Với 1.91.3, một lệnh như của bạn được hiểu là "cat = app ...". Sẽ rất tuyệt nếu tính năng này được hỗ trợ, nhưng tôi có cảm giác rằng tính năng này có thể đã làm việc cho bạn một cách tình cờ.
killthrush

1
cố gắng gán một giá trị cho các sản phẩm của một lệnh shell không được làm việc cho tôi, hoặc: BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S")BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`không làm việc cho tôi
scottysseus

1
@scottyseus Tôi đã kết thúc bằng cách sử dụng wiki.jenkins-ci.org/display/JENKINS/En Môi+Script + Plugin này hoạt động như một bùa. stackoverflow.com/a/38286383/1240268
Andy Hayden

56

Trong trường hợp của tôi, tôi cần thêm JMETER_HOMEbiến môi trường có sẵn thông qua các tập lệnh xây dựng Ant của tôi trên tất cả các dự án trên máy chủ Jenkins của tôi (Linux), theo cách không can thiệp vào môi trường xây dựng cục bộ của tôi (Windows và Mac) trong build.xmltập lệnh . Đặt biến môi trường thông qua Manage Jenkins - Cấu hình hệ thống - Thuộc tính toàn cầu là cách dễ nhất và ít xâm phạm nhất để thực hiện việc này. Không có plugin nào là cần thiết.

Quản lý tài sản toàn cầu của Jenkins


Biến môi trường sau đó có sẵn trong Ant thông qua:

<property environment="env" />
<property name="jmeter.home" value="${env.JMETER_HOME}" />

Điều này có thể được xác minh để hoạt động bằng cách thêm:

<echo message="JMeter Home: ${jmeter.home}"/>

Sản xuất:

Trang chủ JMeter: ~ / .jmeter


Đó là một tài sản toàn cầu. Nó sẽ ảnh hưởng đến TẤT CẢ công việc trên Jenkins. Giả sử tôi chỉ muốn tài sản này cho một công việc?
IgorGanapolsky

Tôi đã thêm vào Manage Jenkins - Cấu hình hệ thống - Thuộc tính toàn cầu, như sau: git /path/to/my/gitPATH+git /path/to/my/git. Tuy nhiên, nếu tôi đang cố gắng truy cập gittừ a Jenkins pipeline script, tôi nhận được : /bin/sh: git: command not found.
octavian

1
Tôi chỉ cần thiết lập biến môi trường JAVA_HOME và câu trả lời này là câu trả lời giúp tôi.
Sandoval0992

19

Bạn có thể sử dụng Plugin Môi trường phun để đặt các biến môi trường trong Jenkins ở cấp độ công việc và nút. Dưới đây tôi sẽ chỉ cho bạn cách đặt chúng ở cấp độ công việc.

  1. Từ giao diện web Jenkins, hãy đến Manage Jenkins > Manage Pluginsvà cài đặt plugin.

Plugin phun môi trường

  1. Đi đến Configuremàn hình công việc của bạn
  2. Tìm Add build steptrong Buildphần và chọnInject environment variables
  3. Đặt biến môi trường mong muốn là mẫu VARIABLE_NAME = VALUE. Trong trường hợp của tôi, tôi đã thay đổi giá trị của biến USERPROFILE

nhập mô tả hình ảnh ở đây

Nếu bạn cần xác định một biến môi trường mới tùy thuộc vào một số điều kiện (ví dụ: tham số công việc), thì bạn có thể tham khảo câu trả lời này .


16

Bạn có thể thử một cái gì đó như thế này

stages {
        stage('Build') {
            environment { 
                    AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
                }
            steps {
                sh 'env'
                sh 'echo $AOEU'
            }
        }
    }

Điều này không phân tích.
rjurney

2
Formatt này là dành cho dự án đường ống Jenkinsfile. Loại công việc nào bạn đang sử dụng đoạn trích này?
JSixface

1
Điều này hoạt động hoàn hảo trong Jenkinsfilemột đường ống (không phải công việc)! Thật tuyệt vời, cảm ơn vì điều đó!
mathielo

14

EnvInject Plugin aka ( Plugin In phun môi trường ) cung cấp cho bạn một số tùy chọn để đặt các biến môi trường từ cấu hình Jenkins.

Bằng cách chọn Inject environment variables to the build processbạn sẽ nhận được:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • và cuối cùng Evaluated Groovy script.


Evaluated Groovy scriptcung cấp cho bạn khả năng đặt biến môi trường dựa trên kết quả của lệnh đã thực hiện :

  • với executephương pháp:
    return [HOSTNAME_SHELL: 'hostname'.execute().text, 
        DATE_SHELL: 'date'.execute().text,
        ECHO_SHELL: 'echo hello world!'.execute().text
    ]
  • hoặc với Groovymã rõ ràng :
    return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
        DATE_GROOVY: new Date()
    ] 

(Chi tiết khác về từng phương pháp có thể được tìm thấy trong trợ giúp tích hợp (?))


Thật không may, bạn không thể làm tương tự Script Contentnhư nó nói:

Thực hiện một tệp tập lệnh nhằm thiết lập một môi trường như tạo thư mục, sao chép tệp, v.v. Đưa ra nội dung tập tin kịch bản. Bạn có thể sử dụng các biến thuộc tính trên. Tuy nhiên, việc thêm hoặc ghi đè các biến môi trường trong tập lệnh không có bất kỳ tác động nào trong công việc xây dựng .


12

Plugin Build Env Propagator cho phép bạn thêm các biến môi trường xây dựng mới, vd

Jenkins Build - Tuyên truyền các biến môi trường xây dựng

Bất kỳ bước biến môi trường xây dựng Propagate kế tiếp sẽ ghi đè các giá trị biến môi trường được xác định trước đó.


Cảm ơn bạn! Build Env Propagator Plugin hoạt động khi tôi dùng thử và thật tuyệt khi có khả năng đặt các biến môi trường trong các bước Xây dựng!
twasbrillig

10

Trong trường hợp của tôi, tôi đã cấu hình các biến môi trường bằng cách sử dụng tùy chọn sau và nó đã hoạt động-

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add

Đây là cách tốt nhất
Long Nguyễn

7

Thông thường bạn có thể định cấu hình các biến Môi trường trong thuộc tính Toàn cầu trong Cấu hình Hệ thống .

Tuy nhiên, đối với các biến động có thay thế shell, bạn có thể muốn tạo tệp tập lệnh trong thư mục Jenkins HOME và thực thi nó trong quá trình xây dựng. Truy cập SSH là bắt buộc. Ví dụ.

  1. Đăng nhập với tên Jenkins: sudo su - jenkinshoặcsudo su - jenkins -s /bin/bash
  2. Tạo một tập lệnh shell, ví dụ:

    echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
    echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
    chmod 750 ~/load_env.sh
    
  3. Trong Jenkins Build ( Execute shell ), gọi tập lệnh và các biến của nó trước bất kỳ thứ gì khác, vd

    source ~/load_env.sh
    

tiếc là không làm việc cho tôi Sau sudo su - jenkins, vẫn echo $USERcho tôi root.
nguyện

@prayagupd Bạn cần mô phỏng đăng nhập đầy đủ, vì vậy hãy sử dụng su -ltham số để làm điều đó, nếu không hãy hỏi một câu hỏi riêng.
kenorb

@kenorb sau khi gọi tập lệnh, làm thế nào để tôi đọc lại biến env? ví dụ: điều này không hoạt động sh "" "source ~ / load_env.sh echo" VM_NAME: $ VM_NAME "echo" VM_NAME: $ {VM_NAME} "" "
aung

7

Đây là đoạn mã để lưu trữ biến môi trường và truy cập nó.

node {
   withEnv(["ENABLE_TESTS=true", "DISABLE_SQL=false"]) {
      stage('Select Jenkinsfile') {
          echo "Enable test?: ${env.DEVOPS_SKIP_TESTS}
          customStep script: this
      }
   }
}

Lưu ý: Giá trị của biến môi trường sắp có dưới dạng Chuỗi. Nếu bạn muốn sử dụng nó như một boolean thì bạn phải phân tích cú pháp bằng Boolean.parse (env.DISABLE_Query).


4

Hãy thử Plugin Script môi trường ( GitHub ) rất giống với EnvInject . Nó cho phép bạn chạy một tập lệnh trước khi xây dựng (sau khi kiểm tra SCM) tạo ra các biến môi trường cho nó. Ví dụ

Jenkins Build - Công việc thường xuyên - Xây dựng môi trường

và trong tập lệnh của bạn, bạn có thể in ví dụ như FOO=barđầu ra tiêu chuẩn để đặt biến đó.

Ví dụ để thêm vào một PATHbiến kiểu hiện có :

echo PATH+unique_identifier=/usr/local/bin

Vì vậy, bạn có thể tự do làm bất cứ điều gì bạn cần trong tập lệnh - hoặc catlà tập tin hoặc chạy tập lệnh bằng một số ngôn ngữ khác từ cây nguồn của dự án, v.v.


1

Bạn có thể sử dụng một trong những cách sau được liệt kê dưới đây:

  1. Sử dụng Env Tiêm Plugin để tạo các biến môi trường. Thực hiện theo cách này để sử dụng và biết thêm chi tiết https://github.com/jenkinsci/envinject-plugin
    1. Điều hướng bên dưới và có thể thêm

Quản lý Jenkins -> Cấu hình hệ thống -> Thuộc tính toàn cầu -> Biến môi trường -> Thêm

nhập mô tả hình ảnh ở đây


0

Vì một số lý do sudo su - jenkinskhông đăng nhập tôi với jenkins người dùng , cuối cùng tôi đã sử dụng cách tiếp cận khác.

Tôi đã thành công khi thiết lập các biến env toàn cầu bằng cách sử dụng jenkins config.xmltại /var/lib/jenkins/config.xml(được cài đặt trong Linux / RHEL) - mà không cần sử dụng các plugin bên ngoài.

Tôi chỉ đơn giản là phải dừng jenkins thêm sau đó thêm globalNodeProperties, và sau đó khởi động lại.

Ví dụ, tôi đang xác định các biến APPLICATION_ENVIRONMENTSPRING_PROFILES_ACTIVEđể continious_integrationbên dưới,

<?xml version='1.0' encoding='UTF-8'?>
<hudson>

  <globalNodeProperties>
    <hudson.slaves.EnvironmentVariablesNodeProperty>
      <envVars serialization="custom">
        <unserializable-parents/>
        <tree-map>
          <default>
            <comparator class="hudson.util.CaseInsensitiveComparator"/>
          </default>
          <int>2</int>
          <string>APPLICATION_ENVIRONMENT</string>
          <string>continious_integration</string>
          <string>SPRING_PROFILES_ACTIVE</string>
          <string>continious_integration</string>
        </tree-map>
      </envVars>
    </hudson.slaves.EnvironmentVariablesNodeProperty>
  </globalNodeProperties>
</hudson>

-3

Chúng tôi sử dụng tệp công việc Groovy:

description('')
steps {
    environmentVariables {
        envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.