Variabel lingkungan Jenkins / Hudson

101

Saya menjalankan Jenkins dari pengguna yang jenkinstelah $PATHdiatur ke sesuatu dan ketika saya masuk ke antarmuka web Jenkins, di jendela System Properties ( http://$host/systemInfo) saya melihat yang berbeda $PATH.

Saya telah menginstal Jenkins di Centos dengan rpm asli dari situs web Jenkins. Saya menggunakan skrip startup yang disertakan dengan instalasi menggunakansudo /etc/init.d/jenkins start

Adakah yang bisa menjelaskan kepada saya mengapa itu terjadi?

Michael
sumber
1
Jika Anda login sebagai jenkins, dan echo $PATH, apakah itu cocok dengan yang Anda lihat di jenkins?
Upgradingdave
3
@Dave tidak, itu tidak cocok. tidak mengerti mengapa
Michael
8
Alasan tidak cocok adalah karena ketika Anda masuk sebagai pengguna jenkins Anda menggunakan shell login, sedangkan jenkins hanya mengeksekusi / bin / sh -xe {skrip Anda} sehingga tidak dijalankan melalui set skrip yang sama yang mengubah variabel lingkungan PATH. Nyatanya, sekumpulan skrip berbeda-beda sesuai dengan jenis * nix dan / atau shell yang telah Anda instal. Saya telah menguji di AWS Linux AMI dengan jenkins dan sayangnya tidak ada / etc / profile /etc/profile.d/xxx.sh / etc / bashrc / etc / environment ~ / .bash_profile ~ / .profile ~ / .bashrc yang mampu untuk memengaruhi PATH yang diteruskan ke / bin / sh
Luke

Jawaban:

141

Michael,

Dua hal:

Ketika Jenkins terhubung ke komputer, itu masuk ke shshell, dan bukan bashshell (setidaknya ini yang saya perhatikan - saya mungkin salah). Jadi setiap perubahan yang Anda lakukan pada $ PATH di file bashrc Anda tidak dianggap.

Selain itu, setiap perubahan yang Anda lakukan pada $ PATH di shell lokal Anda (yang Anda ssh secara pribadi) tidak akan muncul di Jenkins.

Untuk mengubah jalur yang digunakan Jenkins, Anda memiliki dua opsi (AFAIK):

1) Edit /etc/profilefile Anda dan tambahkan jalur yang Anda inginkan di sana

2) Buka halaman konfigurasi slave Anda, dan tambahkan variabel lingkungan PATH, dengan nilai:$PATH:/followed-by/paths/you/want/to/add

Jika Anda menggunakan opsi kedua, Informasi Sistem Anda masih tidak akan menampilkannya, tetapi build Anda akan melihat jalur yang ditambahkan.

Sagar
sumber
2
Jawaban ini berhasil untuk saya, tetapi saya perhatikan bahwa Jenkins sangat sensitif tentang apa yang Anda tulis di halaman konfigurasi. Saya tidak bisa membuatnya berfungsi dengan jalur dengan spasi.
miguelSantirso
Ya, tetapi ketika Anda memasukkan jalur dengan spasi di shell UNIX, spasi biasanya di-escape dengan karakter ``. Oleh karena itu, jika path Anda adalah "/ opt / bin / My Folder Name", Anda mungkin ingin mencoba "/ opt / bin / My \ Folder \ Name". Ini akan keluar dari ruang dan memungkinkan Anda untuk menggunakannya.
Sagar
11
Solusi 2 adalah jalan yang harus ditempuh.
gagarine
2
Tindak lanjut: di sistem Ubuntu saya, layanan jenkins adalah pekerjaan pemula, jadi saya memodifikasi skrip rintisan sysvinit lama. Salah tempat. Ketika saya men-tweak skrip /etc/init/jenkins.conf, dan memperbarui PATH sebelum itu java exec, itu sepertinya berhasil.
Stabledog
15
Ada sudut gelap kecil: Master jenkins menyimpan cache variabel lingkungan dari budak untuk menambal penyesuaian. Jadi jika Anda mengubah variabel lingkungan pada slave (sistem atau pengguna), Anda perlu memulai ulang master untuk memperbarui konfigurasi slave.
Thinkeye
36

Saya terus mengalami masalah ini, tetapi sekarang saya hanya menambahkan:

source /etc/profile

Sebagai langkah pertama dalam proses pembuatan saya. Sekarang semua aturan saya berikutnya dimuat agar Jenkins beroperasi dengan lancar.

Bryan kennedy
sumber
6
Hah? Secara detail, silahkan ... anda tambahkan dimana? bagaimana? kapan? Apakah ini berfungsi di Windows?
HX_unbanned
Saya berasumsi Anda menjalankan perintah shell sebagai bagian dari build Anda. Letakkan source /etc/profilesebagai perintah pertama di area teks Build> Execute Shell> Command.
Bryan kennedy
2
Ini berfungsi di Mac, saya juga menemukan jalur seperti /usr/local/binyang ditentukan di /etc/paths, dan /etc/pathsdigunakan oleh /usr/libexec/path_helper, dan path_helper dijalankan di /etc/profile.
hiroshi
1
Anda menyelamatkan hari saya :)
RameshVel
Sourcing / etc / profile memang menunjukkan jalur saat menambahkan debug 'echo $ PATH' dalam pekerjaan, tetapi jika saya melihat variabel lingkungan untuk pekerjaan itu tidak sama.
Elijah Lynn
23

Anda juga dapat mengedit /etc/sysconfig/jenkinsfile untuk membuat perubahan pada variabel lingkungan, dll. Saya hanya menambahkan source /etc/profiledi akhir file. /etc/profilememiliki semua PATHpengaturan variabel yang tepat . Saat Anda melakukan ini, pastikan Anda memulai ulang Jenkins

/etc/init.d/jenkins restart

Kami menjalankan ZendServer CE yang menginstal pir, phing, dll di jalur yang berbeda jadi ini sangat membantu. Selain itu, kami tidak mendapatkan LD_LIBRARY_PATHkesalahan yang biasa kami dapatkan dengan klien Oracle dan Jenkins.

dbiehl
sumber
Ini adalah komentar kunci, atau mulai ulang jenkins dari {jenkins-url} / restart atau {jenkins-url} / safeRestart. Saya membenturkan kepala saya mengapa perubahan jalur tidak diambil, dengan mengedit bahkan / etc / environment pada ubuntu host - RESTART akan memperbaikinya, seperti yang diverifikasi oleh {jenkins-url} / systemInfo
kert
Semua yang lain gagal, inilah satu-satunya yang berhasil! Saya berharap itu lebih umum jadi saya tidak akan menyia-nyiakan beberapa jam terakhir!
Brad Bonkoski
15

Aku mencoba /etc/profile, ~/.profiledan ~/.bash_profiletidak seorangpun dari mereka bekerja. Saya menemukan bahwa pengeditan ~/.bashrcuntuk akun budak jenkins berhasil.

mmacvicar.dll
sumber
3
itu karena shell non-login tidak membaca /etc/profileatau~/.profile
Vincenzo
9

Informasi tentang jawaban ini sudah ketinggalan zaman. Anda harus membuka Konfigurasi Jenkins> Dan Anda kemudian dapat mengklik untuk menambahkan pasangan nilai kunci Variabel Lingkungan dari sana.

Misalnya: export MYVAR=testakan menjadi MYVARkuncinya, dan testmerupakan nilainya.

TJ Biddle
sumber
5

Pada instans EC2 saya yang lebih baru, cukup menambahkan nilai baru ke PATH .profile pengguna Jenkins dan kemudian memulai ulang kucing jantan berhasil untuk saya.

Pada contoh yang lebih lama di mana konfigurasinya berbeda, menggunakan # 2 dari jawaban Sagar adalah satu-satunya hal yang berhasil (yaitu .profile, .bash * tidak berfungsi).

Rob Barreca
sumber
4

Saya menemukan dua plugin untuk itu. Satu memuat nilai dari file dan yang lainnya memungkinkan Anda mengonfigurasi nilai di layar konfigurasi pekerjaan.

Plugin Envfile - Plugin ini memungkinkan Anda untuk mengatur variabel lingkungan melalui file. Format file harus dalam format file properti Java standar.

Plugin EnvInject - Plugin ini memungkinkan untuk menambahkan variabel lingkungan dan menjalankan skrip pengaturan untuk mengatur lingkungan untuk Pekerjaan.

Vicro
sumber
4

Tidak bisakah Anda menambahkannya sebagai variabel lingkungan di setelan Jenkins:

Kelola Jenkins -> Properti global> Variabel lingkungan: Dan kemudian klik "Tambah" untuk menambahkan PATH properti dan nilainya ke yang Anda butuhkan.

Kiarash Zamanifar
sumber
1
Tampaknya menjadi "Kelola Jenkins -> Konfigurasi Sistem -> Variabel Lingkungan" di versi 1.620.
akaihola
4

Beginilah cara saya memecahkan masalah yang mengganggu ini:

Saya mengubah PATHvariabel seperti yang disarankan @sagar di opsi ke-2, tetapi saya masih mendapatkan PATHnilai yang berbeda dari yang saya harapkan.

Akhirnya saya menemukan bahwa itu adalah EnvInjectplugin yang menggantikan PATHvariabel saya !

Jadi saya bisa uninstall EnvInjectatau hanya menggunakannya untuk menginjeksi variabel PATH.

Karena banyak dari pekerjaan Jenkins kami menggunakan plugin itu, saya tidak ingin menghapusnya ...

Jadi saya membuat file: di environment_variables.propertiesbawah direktori home Jenkins saya.

File ini berisi nilai lingkungan jalan yang saya butuhkan: PATH=$PATH:/usr/local/git/bin/.

Dari antarmuka web Jenkins: Manage Jenkins -> Configure System. Dalam layar yang - saya berdetak Prepare jobs environmentpilihan, dan di Properties File Pathlapangan saya masuk path ke file saya: /var/lib/jenkins/environment_variables.properties.

Dengan cara ini setiap pekerjaan Jenkins kami menerima variabel apa pun yang saya masukkan ke dalam environment_variables.propertiesfile ini .

sering
sumber
1
Ini harus menjadi jawaban yang benar. Seperti yang dinyatakan, memperbarui / etc / profile bukanlah solusi yang layak di OSX karena file tersebut hanya dapat dibaca dan perlu dipusingkan dengan izin. Solusi ini tampaknya yang paling bersih dan menggunakan plugin yang sudah ada di Jenkins. Ingatlah untuk memulai ulang jenkins setelah Anda membuat file properti Anda dan mengaturnya di Jenkins
Voke Ransom Anighoro
3

Jenkins juga mendukung format PATH+<name>untuk menambahkan variabel apa pun, tidak hanya PATH:

Variabel Lingkungan Global atau variabel Lingkungan node:

Variabel Jenkins + notasi

Ini juga didukung pada langkah pipeline withEnv:

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

Perhatikan saja, ini ditambahkan ke variabel. Jika harus ditambahkan, Anda perlu melakukan apa yang ditunjukkan jawaban lain.

Lihat dokumen langkah pipeline di sini .

Anda juga dapat menggunakan sintaks PATH + WHATEVER = / sesuatu untuk menambahkan / sesuatu ke $ PATH

Atau dokumen java di EnvVars di sini .

CJCombrink
sumber
2

Saya hanya mengalami kemajuan dalam masalah ini setelah "/etc/init.d/jenkins force-reload". Saya sarankan untuk mencobanya sebelum melakukan hal lain, dan menggunakannya daripada memulai ulang.

Rene Wooller
sumber
1
Dan di mana Anda sebenarnya menambahkan elemen PATH? Saya sudah mencoba setiap tempat yang bisa saya bayangkan.
Stabledog
2

Di Ubuntu 13.04 saya, saya mencoba beberapa tweak sebelum berhasil dengan ini:

  1. Edit /etc/init/jenkins.conf
  2. Temukan tempat di mana "exec start-stop-server ..." dimulai
  3. Masukkan pembaruan lingkungan sebelum itu, yaitu

ekspor PATH = $ PATH: / beberapa / baru / jalur / bin

Stabledog
sumber
2

Menambahkan

/usr/bin/bash

di

Jenkins -> Kelola Jenkins -> konfigurasikan Sistem -> Shell-> Shell dapat dieksekusi

Jenkins menggunakan sh sehingga bahkan / etc / profile tidak bekerja untuk saya. Ketika saya menambahkan ini, saya memiliki semua env.

sumang_87
sumber
Versi Jenkins apa yang melakukan ini untuk Anda @ sumang_87? Gagal membantu saya di Jenkins 2.9
hamx0r
1

Solusi yang berhasil untuk saya

source ~/.bashrc

Penjelasan

Saya pertama kali memverifikasi Jenkins menjalankan BASH, dengan echo $SHELLdan echo $BASH(perhatikan saya secara eksplisit meletakkan #!/bin/bashdi atas textarea di Jenkins, saya tidak yakin apakah itu persyaratan untuk mendapatkan BASH). sourceing /etc/profileseperti yang disarankan orang lain tidak berfungsi.

Melihat /etc/profilesaya menemukan

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

dan memeriksa "$ PS1" ternyata nol. Saya mencoba spoofing tetapi $PS1tidak berhasil seperti itu

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

namun ini tidak membuahkan hasil yang diinginkan (tambahkan sisa yang $PATHsaya harapkan untuk dilihat). Tetapi jika saya memberi tahu bash untuk menjadi interaktif

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

yang $PATHtelah diubah seperti yang saya harapkan.

Saya mencoba mencari cara untuk memalsukan shell interaktif dengan benar /etc/bash.bashrcuntuk memuat, namun ternyata yang saya butuhkan hanyalah turun ~/.bashrc, jadi hanya sourcedengan itu menyelesaikan masalah.

quickshiftin
sumber
Pastikan menggunakan #!/bin/bash -eluntuk memberi tahu bash untuk memulai sebagai shell login. Itu seharusnya menyebabkan bash menjadi sumber file .rc yang diperlukan
Brandon
1

Saya mencoba semua hal dari atas - tidak berhasil untuk saya.

Saya menemukan dua solusi (keduanya untuk SSH-Slave)

  1. Pergi ke pengaturan budak

  2. Tambahkan variabel lingkungan baru

  3. PATH
  4. $ {JALAN}: $ {BERANDA} /. Pub-cache / bin: $ {BERANDA} /. Local / bin

Bagian "$ {HOME}" itu penting. Ini membuat PATH tambahan menjadi absolut. Jalur relatif tidak berhasil untuk saya.

Opsi II (skrip-pipeline)

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

Di Ubuntu saya hanya mengedit / etc / default / jenkins dan menambahkan source / etc / profile di akhir dan itu berfungsi untuk saya.

Arx Cruz
sumber
0

Menjalankan perintah dengan kumpulan variabel lingkungan juga efektif. Tentu saja, Anda harus melakukannya untuk setiap perintah yang Anda jalankan, tetapi Anda mungkin memiliki skrip pekerjaan, jadi Anda mungkin hanya memiliki satu perintah per build. Skrip pekerjaan saya adalah skrip python yang menggunakan lingkungan untuk memutuskan python mana yang akan digunakan, jadi saya masih perlu meletakkan /usr/local/bin/python2.7 di jalurnya:

PATH=/usr/local/bin <my-command>
Joshua Richardson
sumber
0

Apa yang berhasil bagi saya adalah mengesampingkan lingkungan PATH untuk budak itu.

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

Kemudian putuskan dan sambungkan kembali budak itu.

Terlepas dari apa yang ditunjukkan oleh informasi sistem itu berfungsi.

Matt
sumber
0

Saya menginstal Jenkins 1.639 di SLES 11 SP3 melalui zypper (manajer paket). Pemasangan dikonfigurasi jenkins sebagai layanan

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

Meskipun /etc/init.d/jenkinssumber /etc/sysconfig/jenkins, variabel env apa pun yang disetel di sana tidak diwarisi oleh proses jenkins karena dimulai di shell login terpisah dengan lingkungan baru seperti ini:

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

Cara saya mengatur env vars untuk proses jenkins adalah melalui .bashrcdi direktori home - /var/lib/jenkins. Saya harus membuat /var/lib/jenkins/.bashrckarena tidak ada sebelumnya.

Peter Dotchev
sumber
0

Inilah yang saya lakukan di ubuntu 18.04 LTS dengan Jenkins 2.176.2

Saya membuat file .bash_aliases dan menambahkan jalur di sana, variabel proxy, dan sebagainya.

Di awal .bashrc ada ini yang didefinisikan.

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

Jadi ini memeriksa bahwa jika kita memulai shell non-interaktif maka kita tidak melakukan apa-apa di sini.

bagian bawah .bashrc ada menyertakan untuk .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

jadi saya memindahkan .bash_aliases memuat pertama di .bashrc tepat di atas pemeriksaan non-interaktif.

Ini tidak berfungsi pertama kali tetapi kemudian saya memutus sambungan slave dan menghubungkannya kembali sehingga memuat variabel lagi. Anda tidak perlu memulai ulang seluruh jenkins jika Anda memodifikasi variabel budak. cukup putuskan dan sambungkan kembali.

Juge
sumber
-1

1- tambahkan ke file profil Anda ".bash_profile"

itu ada di folder "/ home / your_user /"

vi .bash_profile

Menambahkan:

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

==> ini adalah ruang kerja e jenkins

2- Jika Anda menggunakan jetty: buka file jenkins.xml

dan tambahkan :

<Arg>/apps/data/jenkins</Arg>
Fadid
sumber