ตัวแปรสภาพแวดล้อม Jenkins / Hudson


101

ฉันทำงานเจนกินส์จากผู้ใช้jenkinsthats ได้$PATHตั้งค่าให้บางสิ่งบางอย่างและเมื่อผมไปลงในเว็บอินเตอร์เฟสเจนกิ้นส์ในคุณสมบัติของระบบหน้าต่าง ( http://$host/systemInfo) $PATHผมเห็นที่แตกต่างกัน

ฉันได้ติดตั้ง Jenkins บน Centos ด้วย rpm ดั้งเดิมจากเว็บไซต์ Jenkins แล้ว ฉันใช้สคริปต์เริ่มต้นที่มาพร้อมกับการติดตั้งโดยใช้sudo /etc/init.d/jenkins start

ใครช่วยอธิบายให้ฉันฟังได้ไหมว่าทำไมถึงเกิดขึ้น


1
หากคุณเข้าสู่ระบบในฐานะเจนกินส์และecho $PATHตรงกับที่คุณเห็นในเจนกินส์หรือไม่?
Upgradingdave

3
@ เดฟไม่มันไม่ตรงกัน ไม่เข้าใจว่าทำไม
Michael

8
สาเหตุที่ไม่ตรงกันคือเมื่อคุณเข้าสู่ระบบในฐานะผู้ใช้เจนกินส์คุณกำลังเรียกใช้เชลล์การเข้าสู่ระบบในขณะที่เจนกินส์เพียงเรียกใช้ / bin / sh -xe {your script} ดังนั้นจึงไม่ทำงานผ่านชุดสคริปต์เดียวกัน ที่เปลี่ยนแปลงตัวแปรสภาพแวดล้อม PATH ในความเป็นจริงชุดของสคริปต์จะแตกต่างกันไปตามรสชาติเฉพาะของ * nix และ / หรือเชลล์ที่คุณติดตั้ง ฉันได้ทดสอบบน AWS Linux AMI กับเจนกินส์และน่าเสียดายที่ไม่มี / etc / profile /etc/profile.d/xxx.sh / etc / bashrc / etc / environment ~ / .bash_profile ~ / .profile ~ / .bashrc ก็สามารถทำได้ ส่งผลกระทบต่อ PATH ที่ส่งไปยัง / bin / sh
ลุค

คำตอบ:


141

ไมเคิล

สองสิ่ง:

เมื่อเจนกินส์เชื่อมต่อกับคอมพิวเตอร์มันจะไปที่shเชลล์ไม่ใช่bashเชลล์ (อย่างน้อยนี่คือสิ่งที่ฉันสังเกตเห็น - ฉันอาจจะผิด) ดังนั้นการเปลี่ยนแปลงใด ๆ ที่คุณทำกับ $ PATH ในไฟล์ bashrc ของคุณจะไม่ได้รับการพิจารณา

นอกจากนี้การเปลี่ยนแปลงใด ๆ ที่คุณทำกับ $ PATH ในเชลล์ในเครื่องของคุณ (การเปลี่ยนแปลงที่คุณใช้เอง) จะไม่ปรากฏใน Jenkins

ในการเปลี่ยนเส้นทางที่เจนกินส์ใช้คุณมีสองทางเลือก (AFAIK):

1) แก้ไข/etc/profileไฟล์ของคุณและเพิ่มเส้นทางที่คุณต้องการที่นั่น

2) ไปที่หน้าการกำหนดค่าของทาสของคุณและเพิ่มตัวแปรสภาพแวดล้อมPATHด้วยค่า:$PATH:/followed-by/paths/you/want/to/add

หากคุณใช้ตัวเลือกที่สองข้อมูลระบบของคุณจะยังไม่แสดง แต่งานสร้างของคุณจะเห็นเส้นทางที่เพิ่มเข้ามา


2
คำตอบนี้ใช้ได้ผลสำหรับฉัน แต่ฉันสังเกตว่าเจนกินส์มีความอ่อนไหวมากเกี่ยวกับสิ่งที่คุณเขียนลงในหน้าการกำหนดค่า ฉันไม่สามารถทำให้มันทำงานกับเส้นทางที่มีช่องว่างได้
miguelSantirso

ใช่ แต่เมื่อคุณป้อนพา ธ ที่มีช่องว่างใน UNIX เชลล์โดยปกติช่องว่างจะถูกหลีกเลี่ยงด้วยอักขระ ` ดังนั้นหากเส้นทางของคุณคือ "/ opt / bin / My Folder Name" คุณอาจต้องลองใช้ "/ opt / bin / My \ Folder \ Name" แทน สิ่งนี้จะหนีจากช่องว่างและอนุญาตให้คุณใช้งานได้
Sagar

11
ทางออกที่ 2 คือหนทางที่จะไป
gagarine

2
การติดตามผล: ในระบบ Ubuntu ของฉันบริการเจนกินส์เป็นงานที่เริ่มต้นขึ้นดังนั้นฉันจึงแก้ไขสคริปต์ต้นขั้ว sysvinit เก่า ผิดที่. เมื่อฉันปรับแต่งสคริปต์ /etc/init/jenkins.conf และอัปเดต PATH ก่อนที่จะเป็น java ของ exec ดูเหมือนจะใช้งานได้
Stabledog

15
มีมุมมืดเล็ก ๆ : เจนกินส์มาสเตอร์แคชตัวแปรสภาพแวดล้อมจากทาสเพื่อแก้ไขการปรับแต่ง ดังนั้นหากคุณเปลี่ยนตัวแปรสภาพแวดล้อมบนทาส (ระบบหรือผู้ใช้) คุณต้องรีสตาร์ทต้นแบบเพื่ออัพเดตการกำหนดค่าทาส
Thinkeye

36

ฉันพบปัญหานี้อยู่เรื่อย ๆ แต่ตอนนี้ฉันเพิ่งเพิ่ม:

source /etc/profile

เป็นขั้นตอนแรกในกระบวนการสร้างของฉัน ตอนนี้กฎที่ตามมาทั้งหมดของฉันถูกโหลดเพื่อให้เจนกินส์ทำงานได้อย่างราบรื่น


6
ฮะ? ในรายละเอียดกรุณา ... คุณเพิ่มที่ไหน? ยังไง เมื่อไหร่? ทำงานบน Windows หรือไม่
HX_unbanned

ฉันคิดว่าคุณกำลังเรียกใช้คำสั่งเชลล์เป็นส่วนหนึ่งของบิลด์ของคุณ ใส่source /etc/profileเป็นคำสั่งแรกใน Build> Execute Shell> Command textarea
bryan kennedy

2
มันใช้งานได้บน Mac และฉันพบเส้นทางเช่นที่/usr/local/binระบุไว้/etc/pathsและ/etc/pathsถูกใช้โดย/usr/libexec/path_helperและ path_helper ถูกเรียกใช้ใน/etc/profileไฟล์.
hiroshi

1
คุณบันทึกวันของฉัน :)
RameshVel

Sourcing / etc / profile แสดงเส้นทางเมื่อเพิ่ม debug ของ 'echo $ PATH' ในงาน แต่ถ้าฉันดูตัวแปรสภาพแวดล้อมสำหรับงานนั้นไม่เหมือนกัน
Elijah Lynn

23

คุณยังสามารถแก้ไข/etc/sysconfig/jenkinsไฟล์เพื่อทำการเปลี่ยนแปลงตัวแปรสภาพแวดล้อมได้อีกด้วยฉันเพียงแค่เพิ่มsource /etc/profileเข้าไปในตอนท้ายของไฟล์ /etc/profileมีการPATHตั้งค่าตัวแปรที่เหมาะสมทั้งหมด เมื่อคุณทำสิ่งนี้ให้แน่ใจว่าคุณรีสตาร์ท Jenkins

/etc/init.d/jenkins restart

เรากำลังใช้งาน ZendServer CE ซึ่งติดตั้งแพร์ฟิงและอื่น ๆ ในเส้นทางอื่นดังนั้นสิ่งนี้จึงมีประโยชน์ นอกจากนี้เราไม่ได้รับLD_LIBRARY_PATHข้อผิดพลาดที่เราเคยได้รับจากไคลเอนต์ Oracle และ Jenkins


นี่คือคีย์คอมเมนต์หรือรีสตาร์ทเจนกินส์จาก {jenkins-url} / restart หรือ {jenkins-url} / safeRestart ฉันรู้สึกสับสนว่าทำไมการเปลี่ยนแปลงเส้นทางไม่ได้รับการแก้ไขโดยการแก้ไขแม้กระทั่ง / etc / environment บนโฮสต์อูบุนตู - RESTART จะแก้ไขโดยตรวจสอบโดย {jenkins-url} /
systemInfo

คนอื่น ๆ ทั้งหมดล้มเหลวนี่เป็นสิ่งเดียวที่ได้ผล! ฉันหวังว่ามันจะแพร่หลายมากขึ้นดังนั้นฉันจะไม่เสียเวลาสองสามชั่วโมงที่ผ่านมา!
Brad Bonkoski

15

ฉันพยายาม/etc/profile, ~/.profileและ~/.bash_profileและไม่มีผู้ทำงาน ฉันพบว่ามีการแก้ไข~/.bashrcบัญชีทาสเจนกินส์


3
นั่นเป็นเพราะเชลล์ที่ไม่ใช่ล็อกอินไม่อ่าน/etc/profileหรือ~/.profile
Vincenzo

9

ข้อมูลในคำตอบนี้ล้าสมัย คุณต้องไปที่ Configure Jenkins> จากนั้นคุณสามารถคลิกเพื่อเพิ่มคู่คีย์ - ค่าตัวแปรสภาพแวดล้อมได้จากที่นั่น

เช่นexport MYVAR=testจะMYVARเป็นกุญแจสำคัญและtestเป็นค่า


5

ในอินสแตนซ์ EC2 ที่ใหม่กว่าของฉันเพียงแค่เพิ่มค่าใหม่ให้กับ PATH ของ .profile ของผู้ใช้ Jenkins จากนั้นการรีสตาร์ท tomcat ก็ใช้ได้สำหรับฉัน

ในอินสแตนซ์ที่เก่ากว่าซึ่งการกำหนดค่าแตกต่างกันการใช้ # 2 จากคำตอบของ Sagarเป็นเพียงสิ่งเดียวที่ใช้งานได้ (เช่น. profile, .bash * ไม่ทำงาน)


4

ฉันพบสองปลั๊กอินสำหรับสิ่งนั้น หนึ่งโหลดค่าจากไฟล์และอีกไฟล์ให้คุณกำหนดค่าในหน้าจอการกำหนดค่างาน

Envfile Plugin - ปลั๊กอินนี้ช่วยให้คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมผ่านไฟล์ รูปแบบของไฟล์ต้องเป็นรูปแบบไฟล์คุณสมบัติ Java มาตรฐาน

EnvInject Plugin - ปลั๊กอินนี้ทำให้สามารถเพิ่มตัวแปรสภาพแวดล้อมและเรียกใช้สคริปต์การตั้งค่าเพื่อตั้งค่าสภาพแวดล้อมสำหรับงาน


4

คุณไม่สามารถเพิ่มเป็นตัวแปรสภาพแวดล้อมในการตั้งค่า Jenkins:

จัดการ Jenkins -> คุณสมบัติส่วนกลาง> ตัวแปรสภาพแวดล้อม: จากนั้นคลิก "เพิ่ม" เพื่อเพิ่มเส้นทางคุณสมบัติและค่าของคุณสมบัติให้กับสิ่งที่คุณต้องการ


1
ดูเหมือนจะเป็น "Manage Jenkins -> Configure System -> Environment Variables" ในเวอร์ชัน 1.620
akaihola

4

นี่คือวิธีที่ฉันแก้ไขปัญหาที่น่ารำคาญนี้:

ฉันเปลี่ยนPATHตัวแปรตามที่ @sagar แนะนำในตัวเลือกที่ 2 ของเขา แต่ก็ยังได้PATHค่าที่แตกต่างจากที่ฉันคาดไว้

ในที่สุดฉันก็พบว่ามันเป็นEnvInjectปลั๊กอินที่มาแทนที่PATHตัวแปรของฉัน!

ดังนั้นฉันจึงสามารถถอนการติดตั้งEnvInjectหรือใช้เพื่อฉีดตัวแปร PATH

เนื่องจากงาน Jenkins ของเราหลายงานใช้ปลั๊กอินนั้นฉันจึงไม่ต้องการถอนการติดตั้ง ...

ดังนั้นฉันจึงสร้างไฟล์: environment_variables.propertiesภายใต้โฮมไดเร็กทอรีเจนกินส์ของฉัน

ไฟล์นี้มีค่าสภาพแวดล้อมเส้นทางที่ฉันต้องการ: PATH=$PATH:/usr/local/git/bin/.

Manage Jenkins -> Configure Systemจากอินเตอร์เฟซเว็บเจนกินส์: ในหน้าจอนั้น - ฉันทำเครื่องหมายที่Prepare jobs environmentตัวเลือกและในProperties File Pathฟิลด์ฉันป้อนเส้นทางไปยังไฟล์ของฉัน: /var/lib/jenkins/environment_variables.properties.

วิธีนี้ทุกงานของ Jenkins เราได้รับตัวแปรใด ๆ ที่ฉันใส่ไว้ในenvironment_variables.propertiesไฟล์นี้


1
นี่น่าจะเป็นคำตอบที่ถูกต้อง ตามที่ระบุไว้การอัปเดต / etc / profile ไม่ใช่วิธีแก้ปัญหาที่เป็นไปได้บน OSX เนื่องจากไฟล์เป็นแบบอ่านอย่างเดียวและต้องการการอนุญาต โซลูชันนี้ดูเหมือนจะสะอาดที่สุดและใช้ปลั๊กอินที่มีอยู่แล้วใน Jenkins อย่าลืมรีสตาร์ทเจนกินส์เมื่อคุณสร้างไฟล์คุณสมบัติของคุณและตั้งค่าบน Jenkins
Voke Ransom Anighoro

3

Jenkins ยังสนับสนุนรูปแบบที่PATH+<name>จะนำหน้าตัวแปรใด ๆ ไม่เพียง แต่ PATH:

ตัวแปรสภาพแวดล้อมส่วนกลางหรือตัวแปรสภาพแวดล้อมโหนด:

ตัวแปร Jenkins + สัญกรณ์

นอกจากนี้ยังรองรับในขั้นตอนไปป์ไลน์withEnv:

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

เพียงแค่สังเกตว่ามันนำหน้าตัวแปร หากต้องต่อท้ายคุณต้องทำตามที่คำตอบอื่น ๆ แสดง

ดูขั้นตอนท่อเอกสารที่นี่

คุณยังสามารถใช้ไวยากรณ์ PATH + WHATEVER = / something เพื่อนำหน้า / บางอย่างไปที่ $ PATH

หรือเอกสาร Java บน EnvVars ที่นี่


2

ฉันมีความคืบหน้าเกี่ยวกับปัญหานี้หลังจาก "/etc/init.d/jenkins force-reload" เท่านั้น ฉันขอแนะนำให้ลองใช้ก่อนสิ่งอื่นใดและใช้สิ่งนั้นแทนการรีสตาร์ท


1
แล้วคุณเพิ่มองค์ประกอบเส้นทางตรงไหน? ฉันได้ลองทุกสถานที่ที่ฉันสามารถจินตนาการได้
Stabledog

2

ใน Ubuntu 13.04 ของฉันฉันได้ลองปรับแต่งเล็กน้อยก่อนที่จะประสบความสำเร็จ:

  1. แก้ไข /etc/init/jenkins.conf
  2. ค้นหาจุดที่ "exec start-stop-server ... " เริ่มต้น
  3. แทรกการอัปเดตสภาพแวดล้อมก่อนหน้านั้นเช่น

ส่งออก PATH = $ PATH: / some / new / path / bin


2

เพิ่ม

/usr/bin/bash

ที่

Jenkins -> จัดการ Jenkins -> กำหนดค่าระบบ -> Shell-> Shell ที่ปฏิบัติการได้

Jenkins ใช้ sh เพื่อให้แม้ / etc / profile ไม่ได้ผลสำหรับฉันเมื่อฉันเพิ่มสิ่งนี้ฉันมี env ทั้งหมด


เจนกินส์รุ่นไหนที่ใช้งานคุณ @ sumang_87? มันล้มเหลวที่จะช่วยฉันใน Jenkins 2.9
hamx0r

1

วิธีแก้ปัญหาที่ได้ผลสำหรับฉัน

source ~/.bashrc

คำอธิบาย

ฉันตรวจสอบครั้งแรกว่าเจนกินส์ใช้ BASH ด้วยecho $SHELLและecho $BASH(โปรดทราบว่าฉันวาง#!/bin/bashบนพื้นที่ข้อความใน Jenkins อย่างชัดเจนฉันไม่แน่ใจว่าเป็นข้อกำหนดในการรับ BASH หรือไม่) sourceing /etc/profileตามที่คนอื่นแนะนำไม่ได้ผล

มองไปที่/etc/profileฉันพบ

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

และตรวจสอบ "$ PS1" พบว่าเป็นโมฆะ ฉันพยายามปลอมแปลงโดย$PS1ไม่มีประโยชน์เช่นนั้น

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

อย่างไรก็ตามสิ่งนี้ไม่ได้ผลลัพธ์ที่ต้องการ (เพิ่มส่วนที่เหลือที่$PATHฉันคาดว่าจะเห็น) แต่ถ้าฉันบอกทุบตีให้โต้ตอบ

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

การ$PATHเปลี่ยนแปลงตามที่ฉันคาดไว้

ฉันพยายามหาวิธีการสวมรอยเชลล์แบบโต้ตอบอย่างถูกต้องเพื่อ/etc/bash.bashrcให้โหลดได้ แต่ปรากฎว่าทั้งหมดที่ฉันต้องการคือลงไป~/.bashrcดังนั้นเพียงแค่เข้าsourceมันก็แก้ปัญหาได้


อย่าลืมใช้#!/bin/bash -elเพื่อบอกให้ bash เริ่มต้นเป็นล็อกอินเชลล์ นั่นน่าจะทำให้ bash ซอร์สไฟล์. rc ที่จำเป็น
Brandon

1

ฉันลองทุกสิ่งจากด้านบน - ไม่ได้ผลสำหรับฉัน

ฉันพบสองวิธีแก้ปัญหา (ทั้งสำหรับ SSH-Slave)

  1. ไปที่การตั้งค่าทาส

  2. เพิ่มตัวแปรสภาพแวดล้อมใหม่

  3. เส้นทาง
  4. $ {PATH}: $ {HOME} /. pub-cache / bin: $ {HOME} /. local / bin

ส่วน "$ {HOME}" มีความสำคัญ สิ่งนี้ทำให้ PATH เพิ่มเติมเป็นค่าสัมบูรณ์ เส้นทางสัมพัทธ์ไม่ได้ผลสำหรับฉัน

ตัวเลือก II (ไปป์ไลน์สคริปต์)

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

0

บน Ubuntu ฉันเพิ่งแก้ไข / etc / default / jenkins และเพิ่ม source / etc / profile ในตอนท้ายและมันก็ใช้ได้กับฉัน


0

การรันคำสั่งด้วยชุดตัวแปรสภาพแวดล้อมก็มีผลเช่นกัน แน่นอนคุณต้องทำสำหรับแต่ละคำสั่งที่คุณรัน แต่คุณอาจมีสคริปต์งานดังนั้นคุณอาจมีเพียงหนึ่งคำสั่งต่อบิลด์ สคริปต์งานของฉันคือสคริปต์ python ที่ใช้สภาพแวดล้อมในการตัดสินใจว่าจะใช้ python ใดดังนั้นฉันยังคงต้องใส่ /usr/local/bin/python2.7 ในพา ธ :

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

0

สิ่งที่ได้ผลสำหรับฉันคือการลบล้างสภาพแวดล้อม PATH สำหรับทาส

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

จากนั้นถอดและเชื่อมต่อทาสใหม่

แม้ว่าข้อมูลระบบจะแสดงให้เห็นว่ามันใช้งานได้


0

ฉันติดตั้ง Jenkins 1.639 บน SLES 11 SP3 ผ่าน zypper (ตัวจัดการแพ็คเกจ) การติดตั้งกำหนดค่าเจนกินส์เป็นบริการ

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

แม้ว่า/etc/init.d/jenkinsแหล่งที่มา/etc/sysconfig/jenkinsตัวแปร env ใด ๆ ที่ตั้งค่าไว้จะไม่ได้รับการสืบทอดโดยกระบวนการเจนกินส์เนื่องจากเริ่มต้นในเชลล์ล็อกอินที่แยกจากกันพร้อมกับสภาพแวดล้อมใหม่เช่นนี้:

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

ฉันวิธีการจัดการเพื่อชุด env vars สำหรับกระบวนการเจนกินส์จะผ่าน.bashrcในไดเรกทอรีบ้านของ /var/lib/jenkins- ฉันต้องสร้าง/var/lib/jenkins/.bashrcอย่างที่มันไม่เคยมีมาก่อน


0

นี่คือสิ่งที่ฉันทำบน Ubuntu 18.04 LTS กับ Jenkins 2.176.2

ฉันสร้างไฟล์. bash_aliases และเพิ่มพา ธ ตัวแปรพร็อกซีและอื่น ๆ

ในจุดเริ่มต้นของ. bashrc มีการกำหนดสิ่งนี้

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

ดังนั้นจึงตรวจสอบว่าหากเราเริ่มเชลล์แบบไม่โต้ตอบเราจะไม่ทำอะไรเลยที่นี่

ด้านล่างของ. bashrc มีสำหรับ. 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

ดังนั้นฉันจึงย้าย. bash_aliases กำลังโหลดครั้งแรกที่. bashrc เหนือการตรวจสอบแบบไม่โต้ตอบ

สิ่งนี้ใช้ไม่ได้ก่อน แต่จากนั้นฉันก็ยกเลิกการเชื่อมต่อทาสและเชื่อมต่อใหม่ดังนั้นจึงโหลดตัวแปรอีกครั้ง คุณไม่จำเป็นต้องรีสตาร์ทเจนกินส์ทั้งหมดหากคุณกำลังแก้ไขตัวแปรทาส เพียงแค่ตัดการเชื่อมต่อและเชื่อมต่อใหม่


-1

1- เพิ่มไฟล์โปรไฟล์ของคุณ ".bash_profile"

อยู่ในโฟลเดอร์ "/ home / your_user /"

vi .bash_profile

เพิ่ม:

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

==> มันคือพื้นที่ทำงานของ e jenkins

2- หากคุณใช้ท่าเทียบเรือ: ไปที่ไฟล์ jenkins.xml

และเพิ่ม:

<Arg>/apps/data/jenkins</Arg>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.