Biến môi trường Jenkins / Hudson


101

Tôi đang chạy Jenkins từ người dùng jenkinsđã $PATHđặt thành thứ gì đó và khi tôi vào giao diện web của Jenkins, trong cửa sổ Thuộc tính Hệ thống ( http://$host/systemInfo), tôi thấy khác $PATH.

Tôi đã cài đặt Jenkins trên Centos với rpm gốc từ trang web Jenkins. Tôi đang sử dụng tập lệnh khởi động được cung cấp cùng với cài đặt bằngsudo /etc/init.d/jenkins start

Bất cứ ai có thể vui lòng giải thích cho tôi tại sao điều đó xảy ra?


1
Nếu bạn đăng nhập bằng jenkins và echo $PATH, nó có khớp với những gì bạn thấy trong jenkins không?
Upgradingdave

3
@Dave không, nó không khớp. không thể hiểu tại sao
Michael

8
Lý do nó không khớp là vì khi bạn đăng nhập với tư cách là người dùng jenkins, bạn đang gọi một trình bao đăng nhập, trong khi jenkins chỉ thực thi / bin / sh -xe {your script} nên nó không chạy qua cùng một bộ tập lệnh làm thay đổi biến môi trường PATH. Trên thực tế, tập hợp các tập lệnh thay đổi tùy theo hương vị cụ thể của * nix và / hoặc shell mà bạn đã cài đặt. Tôi đã thử nghiệm trên AWS Linux AMI với jenkins và đáng buồn là không ai trong số / etc / profile /etc/profile.d/xxx.sh / etc / bashrc / etc / environment ~ / .bash_profile ~ / .profile ~ / .bashrc có thể ảnh hưởng đến PATH được chuyển đến / bin / sh
Luke

Câu trả lời:


141

Michael,

Hai điều:

Khi Jenkins kết nối với máy tính, nó sẽ chuyển đến shshell chứ không phải bashshell (ít nhất đây là điều tôi đã nhận thấy - tôi có thể sai). Vì vậy, bất kỳ thay đổi nào bạn thực hiện đối với $ PATH trong tệp bashrc của mình đều không được xem xét.

Ngoài ra, bất kỳ thay đổi nào bạn thực hiện đối với $ PATH trong trình bao cục bộ của mình (một thay đổi mà bạn cá nhân sử dụng) sẽ không hiển thị trong Jenkins.

Để thay đổi đường dẫn mà Jenkins sử dụng, bạn có hai tùy chọn (AFAIK):

1) Chỉnh sửa /etc/profiletệp của bạn và thêm các đường dẫn bạn muốn ở đó

2) Đi tới trang cấu hình của máy nô lệ của bạn và thêm biến môi trường PATH, với giá trị:$PATH:/followed-by/paths/you/want/to/add

Nếu bạn sử dụng tùy chọn thứ hai, Thông tin Hệ thống của bạn sẽ vẫn không hiển thị, nhưng các bản dựng của bạn sẽ thấy các đường dẫn được thêm vào.


2
Câu trả lời này phù hợp với tôi, nhưng tôi nhận thấy rằng Jenkins rất nhạy cảm về những gì bạn viết vào trang cấu hình. Tôi không thể làm cho nó hoạt động với các đường dẫn có khoảng trắng.
miguelSantirso 23/10/12

Đúng vậy, nhưng khi bạn nhập các đường dẫn có khoảng trắng trong UNIX shell, khoảng trắng thường được thoát bằng ký tự ``. Do đó, nếu đường dẫn của bạn là "/ opt / bin / Tên thư mục của tôi", bạn có thể muốn thử "/ opt / bin / My \ Folder \ Name". Điều này sẽ thoát ra khỏi khoảng trống và cho phép bạn sử dụng chúng.
Sagar

11
Giải pháp 2 là con đường để đi.
gagarine

2
Tiếp theo: trên hệ thống Ubuntu của tôi, dịch vụ jenkins là một công việc mới bắt đầu, vì vậy tôi đã sửa đổi tập lệnh sơ khai sysvinit cũ. Sai chỗ. Khi tôi chỉnh sửa tập lệnh /etc/init/jenkins.conf và cập nhật PATH trước khi nó thực thi java, điều đó dường như hoạt động.
Stabledog

15
Có một góc tối nhỏ: jenkins master lưu trữ các biến môi trường từ các nô lệ để vá các tùy chỉnh. Vì vậy, nếu bạn thay đổi các biến môi trường trên một nô lệ (hệ thống hoặc người dùng), bạn cần khởi động lại chủ để cập nhật cấu hình nô lệ.
Thinkeye

36

Tôi tiếp tục gặp sự cố này, nhưng bây giờ tôi chỉ thêm:

source /etc/profile

Là bước đầu tiên trong quá trình xây dựng của tôi. Bây giờ tất cả các quy tắc tiếp theo của tôi đã được tải để Jenkins hoạt động trơn tru.


6
Huh? Còn chi tiết thì ... bạn bổ sung ở đâu? làm sao? khi nào? Nó có hoạt động trên Windows không?
HX_unbanned

Tôi giả sử bạn đang chạy một lệnh shell như một phần của bản dựng của bạn. Đặt source /etc/profilelàm lệnh đầu tiên trong Build> Execute Shell> Command textarea.
bryan kennedy

2
Nó hoạt động trên Mac, tôi cũng tìm thấy các đường dẫn như /usr/local/binđược chỉ định trong /etc/paths, và /etc/pathsđược sử dụng bởi /usr/libexec/path_helper, và path_helper được thực thi trong /etc/profile.
hiroshi

1
bạn đã cứu ngày của tôi :)
RameshVel

Tìm nguồn cung ứng / etc / profile không hiển thị đường dẫn khi thêm gỡ lỗi 'echo $ PATH' trong công việc, nhưng nếu tôi nhìn vào các biến môi trường cho công việc thì nó không giống nhau.
Elijah Lynn

23

Bạn cũng có thể chỉnh sửa /etc/sysconfig/jenkinstệp để thực hiện bất kỳ thay đổi nào đối với các biến môi trường, v.v. Tôi chỉ cần thêm vào source /etc/profilecuối tệp. /etc/profilecó tất cả PATHcác thiết lập biến thích hợp . Khi bạn làm điều này, hãy đảm bảo rằng bạn khởi động lại Jenkins

/etc/init.d/jenkins restart

Chúng tôi đang chạy ZendServer CE cài đặt lê, phing, v.v. theo một đường dẫn khác nên điều này rất hữu ích. Ngoài ra, chúng tôi không nhận được các LD_LIBRARY_PATHlỗi mà chúng tôi đã từng mắc phải với ứng dụng khách Oracle và Jenkins.


Đây là một nhận xét quan trọng hoặc khởi động lại jenkins từ {jenkins-url} / restart hoặc {jenkins-url} / safeRestart. Tôi đã đập đầu của tôi về việc tại sao thay đổi con đường đã không nhặt, thậm chí bằng cách chỉnh sửa / etc / environment trên máy chủ ubuntu - RESTART sẽ sửa chữa nó, như xác nhận qua {Jenkins-url} / systeminfo
Kert

Tất cả những cái khác đều thất bại, đây là cái duy nhất hiệu quả! Tôi ước nó phổ biến hơn để tôi không lãng phí vài giờ qua!
Brad Bonkoski

15

Tôi đã cố gắng /etc/profile, ~/.profile~/.bash_profilevà không ai trong số những người làm việc. Tôi thấy rằng chỉnh sửa ~/.bashrccho tài khoản nô lệ jenkins đã làm.


3
đó là bởi vì vỏ không đăng nhập không đọc không /etc/profilehay~/.profile
Vincenzo

9

Thông tin về câu trả lời này đã lỗi thời. Bạn cần đi tới Định cấu hình Jenkins> Và sau đó bạn có thể nhấp để thêm cặp khóa-giá trị Biến Môi trường từ đó.

ví dụ: export MYVAR=testsẽ MYVARlà khóa, và testlà giá trị.


5

Trên phiên bản EC2 mới hơn của tôi, chỉ cần thêm giá trị mới vào PATH của .profile của người dùng Jenkins và sau đó khởi động lại tomcat đã làm việc cho tôi.

Trên một phiên bản cũ có cấu hình khác, sử dụng # 2 từ câu trả lời của Sagar là cách duy nhất hoạt động (tức là .profile, .bash * không hoạt động).


4

Tôi đã tìm thấy hai plugin cho điều đó. Một tải các giá trị từ một tệp và một cho phép bạn định cấu hình các giá trị trong màn hình cấu hình công việc.

Envfile Plugin - Plugin này cho phép bạn thiết lập các biến môi trường thông qua một tệp. Định dạng của tệp phải là định dạng tệp thuộc tính Java tiêu chuẩn.

EnvInject Plugin - Plugin này giúp bạn có thể thêm các biến môi trường và thực thi tập lệnh thiết lập để thiết lập môi trường cho Công việc.


4

Bạn không thể thêm nó làm biến môi trường trong cài đặt Jenkins:

Quản lý Jenkins -> Thuộc tính toàn cục> Biến môi trường: Và sau đó nhấp vào "Thêm" để thêm thuộc tính PATH và giá trị của nó vào những gì bạn cần.


1
Có vẻ là "Quản lý Jenkins -> Định cấu hình Hệ thống -> Biến Môi trường" trong phiên bản 1.620.
akaihola

4

Đây là cách tôi giải quyết vấn đề khó chịu này:

Tôi đã thay đổi PATHbiến như @sagar đề xuất trong tùy chọn thứ 2 của anh ấy, nhưng tôi vẫn nhận được PATHgiá trị khác với mong đợi.

Cuối cùng tôi phát hiện ra rằng đó là EnvInjectplugin đã thay thế PATHbiến của tôi !

Vì vậy, tôi có thể gỡ cài đặt EnvInjecthoặc chỉ sử dụng nó để đưa biến PATH.

Vì nhiều công việc Jenkins của chúng tôi sử dụng plugin đó, tôi không muốn gỡ cài đặt nó ...

Vì vậy, tôi đã tạo một tệp: environment_variables.propertiestrong thư mục chính Jenkins của tôi.

Tập tin này chứa các giá trị môi trường con đường mà tôi cần: PATH=$PATH:/usr/local/git/bin/.

Từ giao diện web Jenkins: Manage Jenkins -> Configure System. Trong màn hình - Tôi đánh dấu vào Prepare jobs environmenttùy chọn, và trong Properties File Pathlĩnh vực tôi bước vào đường dẫn đến tập tin của tôi: /var/lib/jenkins/environment_variables.properties.

Bằng cách này, mọi công việc Jenkins chúng tôi thực hiện đều nhận được bất kỳ biến nào tôi đưa vào environment_variables.propertiestệp này .


1
Đây phải là câu trả lời chính xác. Như đã nêu, cập nhật / etc / profile không phải là một giải pháp khả thi trên OSX vì tệp chỉ được đọc và yêu cầu phải xáo trộn các quyền. Giải pháp này có vẻ sạch nhất và sử dụng các plugin hiện có trên Jenkins. Hãy nhớ khởi động lại Jenkins khi bạn tạo tập tin thuộc tính của bạn và đặt nó trên Jenkins
Voke Ransom Anighoro

3

Jenkins cũng hỗ trợ định dạng PATH+<name>để thêm trước vào bất kỳ biến nào, không chỉ PATH:

Biến Môi trường Toàn cầu hoặc Biến Môi trường nút:

Biến Jenkins + ký hiệu

Điều này cũng được hỗ trợ trong bước quy trình withEnv:

node {
  withEnv(['PATH+JAVA=/path/to/java/bin']) {
    ...
  }
}

Chỉ cần lưu ý, nó phụ thuộc vào biến. Nếu nó phải được thêm vào, bạn cần phải làm những gì các câu trả lời khác hiển thị.

Xem tài liệu các bước đường ống tại đây .

Bạn cũng có thể sử dụng cú pháp PATH + WHATEVER = / something để thêm / something vào $ PATH

Hoặc tài liệu java trên EnvVars tại đây .


2

Tôi chỉ có tiến bộ về vấn đề này sau khi "/etc/init.d/jenkins buộc tải lại". Tôi khuyên bạn nên thử điều đó trước bất kỳ thứ gì khác và sử dụng điều đó thay vì khởi động lại.


1
Và bạn đã thực sự thêm phần tử PATH vào đâu? Tôi đã thử mọi nơi tôi có thể tưởng tượng.
Stabledog

2

Trên Ubuntu 13.04 của mình, tôi đã thử một vài chỉnh sửa trước khi thành công với điều này:

  1. Chỉnh sửa /etc/init/jenkins.conf
  2. Xác định vị trí bắt đầu "thực thi start-stop-server ..."
  3. Chèn bản cập nhật môi trường ngay trước đó, tức là

xuất PATH = $ PATH: / some / new / path / bin


2

Thêm vào

/usr/bin/bash

tại

Jenkins -> Quản lý Jenkins -> cấu hình Hệ thống -> Shell-> Shell thực thi

Jenkins sử dụng sh để ngay cả / etc / profile cũng không hoạt động với tôi Khi tôi thêm cái này, tôi có tất cả env.


Phiên bản Jenkins nào phù hợp với bạn @ sumang_87? Nó không thể giúp tôi trên Jenkins 2.9
hamx0r

1

Giải pháp phù hợp với tôi

source ~/.bashrc

Giải trình

Lần đầu tiên tôi xác minh Jenkins đang chạy BASH, với echo $SHELLecho $BASH(lưu ý rằng tôi rõ ràng đang đặt #!/bin/bashvăn bản ở trên cùng trong Jenkins, tôi không chắc đó có phải là yêu cầu để có được BASH hay không). sourceing /etc/profilenhư những người khác đề xuất đã không hoạt động.

Nhìn vào /etc/profiletôi thấy

if [ "$PS1" ]; then
...

và kiểm tra "$ PS1" thấy nó không có giá trị. Tôi đã cố gắng giả mạo $PS1như vậy nhưng không có kết quả

export PS1=1
bash -c 'echo $PATH'

tuy nhiên điều này đã không tạo ra kết quả mong muốn (thêm phần còn lại của $PATHtôi mong đợi để xem). Nhưng nếu tôi bảo bash là tương tác

export PS1=1
bash -ci 'echo $PATH'

các $PATHđã được thay đổi như tôi mong đợi.

Tôi đang cố gắng tìm ra cách giả mạo đúng cách một shell tương tác /etc/bash.bashrcđể tải, tuy nhiên, hóa ra tất cả những gì tôi cần đều không có sẵn ~/.bashrc, vì vậy chỉ cần nhập sourcenó đã giải quyết được vấn đề.


Đảm bảo sử dụng #!/bin/bash -elđể yêu cầu bash khởi động dưới dạng trình bao đăng nhập. Điều đó sẽ khiến bash nguồn các tệp .rc cần thiết
Brandon

1

Tôi đã thử tất cả những điều từ trên - không hiệu quả với tôi.

Tôi đã tìm thấy hai giải pháp (cả cho SSH-Slave)

  1. Đi tới cài đặt nô lệ

  2. Thêm một biến môi trường mới

  3. CON ĐƯỜNG
  4. $ {PATH}: $ {HOME} /. Pub-cache / bin: $ {HOME} /. Local / bin

Phần "$ {HOME}" là quan trọng. Điều này làm cho PATH bổ sung là tuyệt đối. Con đường tương đối đã không làm việc cho tôi.

Tùy chọn II (tập lệnh đường ống)

pipeline {
    agent {
        label 'your-slave'
    }
    environment {
        PATH = "/home/jenkins/.pub-cache/bin:$PATH"
    }
    stages {
        stage('Test') {
            steps {
                ansiColor('xterm') {
                    echo "PATH is: $PATH"
                }
            }
        }
    }
}

0

Trên Ubuntu, tôi chỉ cần chỉnh sửa / etc / default / jenkins và thêm nguồn / etc / profile vào cuối và nó hoạt động với tôi.


0

Chạy lệnh với bộ biến môi trường cũng có hiệu quả. Tất nhiên, bạn phải làm điều đó cho mỗi lệnh bạn chạy, nhưng bạn có thể có một script công việc, vì vậy bạn có thể chỉ có một lệnh cho mỗi bản dựng. Tập lệnh công việc của tôi là một tập lệnh python sử dụng môi trường để quyết định sử dụng python nào, vì vậy tôi vẫn cần đặt /usr/local/bin/python2.7 trong đường dẫn của nó:

PATH=/usr/local/bin <my-command>

0

Điều làm việc cho tôi là ghi đè môi trường PATH cho nô lệ.

Set:   PATH 
To:    $PATH:/usr/local/bin

Sau đó ngắt kết nối và kết nối lại nô lệ.

Bất chấp những gì thông tin hệ thống cho thấy nó đã hoạt động.


0

Tôi đã cài đặt Jenkins 1.639 trên SLES 11 SP3 thông qua zypper (trình quản lý gói). Cài đặt đã định cấu hình jenkins như một dịch vụ

 # service jenkins
 Usage: /etc/init.d/jenkins {start|stop|status|try-restart|restart|force-reload|reload|probe}

Mặc dù /etc/init.d/jenkinscác nguồn /etc/sysconfig/jenkins, bất kỳ biến env nào được đặt ở đó không được quy trình jenkins kế thừa vì nó được khởi động trong một trình bao đăng nhập riêng biệt với một môi trường mới như sau:

startproc -n 0 -s -e -l /var/log/jenkins.rc -p /var/run/jenkins.pid -t 1 /bin/su -l -s /bin/bash -c '/usr/java/default/bin/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --javaHome=/usr/java/default --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --httpPort=8080 --ajp13Port=8009 --debug=9 --handlerCountMax=100 --handlerCountMaxIdle=20 &' jenkins

Cách tôi quản lý để đặt env vars cho quy trình jenkins là thông qua .bashrcthư mục chính của nó - /var/lib/jenkins. Tôi phải tạo /var/lib/jenkins/.bashrcnhư nó không tồn tại trước đây.


0

Đây là những gì tôi đã làm trên ubuntu 18.04 LTS với Jenkins 2.176.2

Tôi đã tạo tệp .bash_aliases và thêm vào đó đường dẫn, biến proxy, v.v.

Đầu .bashrc có định nghĩa này.

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Vì vậy, nó đang kiểm tra xem nếu chúng ta bắt đầu trình bao không tương tác thì chúng ta không làm gì ở đây.

dưới cùng của .bashrc có bao gồm cho .bash_aliases

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

vì vậy tôi đã chuyển .bash_aliases tải đầu tiên tại .bashrc ngay phía trên kiểm tra không tương tác.

Điều này không hoạt động đầu tiên nhưng sau đó tôi ngắt kết nối nô lệ và kết nối lại nó để nó tải lại các biến. Bạn không cần phải khởi động lại toàn bộ jenkins nếu bạn đang sửa đổi các biến phụ. chỉ cần ngắt kết nối và kết nối lại.


-1

1- thêm vào tệp hồ sơ ".bash_profile" của bạn

nó nằm trong thư mục "/ home / your_user /"

vi .bash_profile

thêm vào:

export JENKINS_HOME=/apps/data/jenkins  
export PATH=$PATH:$JENKINS_HOME

==> đó là không gian làm việc của e jenkins

2- Nếu bạn sử dụng cầu cảng: hãy truy cập tệp jenkins.xml

và thêm:

<Arg>/apps/data/jenkins</Arg>
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.