วิธีการตั้งค่าตัวแปรสภาพแวดล้อมในเจนกินส์?


228

ฉันต้องการที่จะทำสิ่งที่ชอบ:

AOEU=$(echo aoeu)

AOEU=aoeuและมีชุดเจนกินส์

ตัวแปรของสภาพแวดล้อมในส่วนเจนกินส์ไม่ได้ทำ AOEU='$(echo aoeu)'แต่จะกำหนด

ฉันจะทำให้เจนกินส์ประเมินค่าคำสั่งเชลล์และกำหนดผลลัพธ์ให้กับตัวแปรสภาพแวดล้อมได้อย่างไร

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


2
ปลั๊กอิน EnvInject มีช่องโหว่ด้านความปลอดภัยที่ร้ายแรง ตอนนี้เจนกินส์ได้รับการสนับสนุนแบบ inbuilt สำหรับstackoverflow.com/a/53430757/1753177
lambodar

@lambodar ลิงก์ไปที่คำถาม
Z. Cochrane

@ Z.Cochrane เป็นลิงก์ไปยังคำตอบที่ผู้เขียนลบไปแล้ว
Noel Yap

คำตอบ:


217

ซึ่งสามารถทำได้ผ่านปลั๊กอิน EnvInjectด้วยวิธีต่อไปนี้:

  1. สร้างขั้นตอนการสร้าง "Execute shell" ที่รัน:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. สร้างฉีดตัวแปรสภาพแวดล้อมที่สร้างขั้นตอนและการตั้งค่า "คุณสมบัติเส้นทาง propsfileFile"

หมายเหตุ : ปลั๊กอินนี้ (ส่วนใหญ่) เข้ากันไม่ได้กับปลั๊กอินไลน์


4
EnvInject ไม่สามารถจัดการกับสถานการณ์ที่ฉันได้กล่าวไว้ข้างต้น: [EnvInject] - การฉีดเป็นตัวแปรสภาพแวดล้อมเนื้อหาคุณสมบัติ AOEU = $ (echo aoeu) [EnvInject] - ตัวแปรถูกฉีดสำเร็จ [EnvInject] - ยกเลิกการตั้งค่าตัวแปร 'AOEU' ที่ยังไม่ได้แก้ไข
Noel Yap

1
โซลูชันนั้นใช้ไวยากรณ์ Unix shell และจะไม่ทำงานบน windows
fbmd

2
@fbmd ฉันใช้งานบน Windows คุณเพียงแค่ต้องแน่ใจว่าคุณมีshเส้นทาง
กุสโตดิโอ

2
EnvInject ไม่ทำงานหาก "execute shell" ออกมาพร้อมกับข้อผิดพลาดเนื่องจากบิลด์ไม่ดำเนินการต่อในส่วนการฉีด
Chadi

1
@ Vitim.us fooจะได้รับการส่งออกในการดำเนินการเชลล์ที่เฉพาะเจาะจง แต่ไม่ได้อยู่ในการดำเนินการอื่น
Noel Yap

109

วิธีที่ง่ายที่สุด

คุณสามารถใช้ปลั๊กอิน EnvInjectเพื่อฉีดตัวแปรสภาพแวดล้อมเมื่อเริ่มต้นบิลด์ ตัวอย่างเช่น:

เพิ่ม key = value (bash OK!) ภายใต้ 'Build Environment' -> 'ตัวแปรสภาวะแวดล้อม Inject เข้าสู่กระบวนการสร้าง' -> 'เนื้อหาคุณสมบัติ'

คุณรู้ได้อย่างไรว่ามันทำงานได้

EnvInject - ตัวแปรถูกฉีดสำเร็จ


5
ลองตั้งค่าตามเอาต์พุตของคำสั่งเชลล์
Noel Yap

1
@NoelYap key=valueธิเกินไปตราบใดที่ในท้ายที่สุดประเมินเส้น ในกรณีที่การใช้งานของฉันฉันสร้างสายสมบูรณ์: 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 คุณใช้ EnvInject รุ่นใดอยู่ ด้วย 1.91.3 คำสั่งเช่นคุณถูกตีความว่าเป็น "cat = app ... " คงจะดีถ้าคุณสมบัตินี้ได้รับการสนับสนุน แต่ฉันรู้สึกว่านี่อาจจะใช้ได้กับคุณโดยไม่ได้ตั้งใจ
killthrush

1
ความพยายามที่จะกำหนดค่าให้กับเอาต์พุตของคำสั่งเชลล์ไม่ทำงานสำหรับฉันเช่นกัน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"`ไม่ทำงานสำหรับฉัน
scottysseus

1
@scottyseus ฉันลงเอยด้วยการใช้wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Pluginนี้ทำงานได้เหมือนมนต์เสน่ห์ stackoverflow.com/a/38286383/1240268
Andy Hayden

56

ในกรณีของฉันฉันต้องเพิ่มJMETER_HOMEตัวแปรสภาพแวดล้อมเพื่อให้สามารถใช้งานได้ผ่านสคริปต์ Ant build ของฉันในทุกโครงการบนเซิร์ฟเวอร์ Jenkins (Linux) ของฉันในลักษณะที่จะไม่รบกวนการสร้างสภาพแวดล้อมในเครื่องของฉัน (Windows และ Mac) ในbuild.xmlสคริปต์ . การตั้งค่าตัวแปรสภาพแวดล้อมผ่านManage Jenkins - Configure System - คุณสมบัติทั่วโลกเป็นวิธีที่ง่ายที่สุดและรบกวนน้อยที่สุดในการทำสิ่งนี้ให้สำเร็จ ไม่จำเป็นต้องมีปลั๊กอิน

จัดการคุณสมบัติของ Jenkins Global


ตัวแปรสภาพแวดล้อมจะพร้อมใช้งานใน Ant ผ่าน:

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

สิ่งนี้สามารถตรวจสอบการทำงานได้โดยการเพิ่ม:

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

ซึ่งผลิต:

JMeter Home: ~ / .jmeter


นั่นคือทรัพย์สินทั่วโลก มันจะมีผลกับงานทั้งหมดในเจนกินส์ สมมติว่าฉันต้องการอสังหาริมทรัพย์นี้สำหรับงานเดียว?
IgorGanapolsky

ฉันได้เพิ่มการจัดการเจนกินส์ - การกำหนดค่าระบบ - คุณสมบัติทั่วโลกต่อไปนี้: และgit /path/to/my/git PATH+git /path/to/my/gitอย่างไรก็ตามหากฉันพยายามเข้าถึงgitจาก a Jenkins pipeline scriptฉันจะได้รับ: /bin/sh: git: command not found.
Octavian

1
ฉันต้องการตั้งค่าตัวแปรสภาพแวดล้อม JAVA_HOME และคำตอบนี้เป็นคำตอบที่ช่วยฉัน
Sandoval0992

19

คุณสามารถใช้Environment Injector Pluginเพื่อตั้งค่าตัวแปรสภาพแวดล้อมในเจนกินส์ที่ระดับงานและโหนด ด้านล่างฉันจะแสดงวิธีการตั้งค่าพวกเขาในระดับงาน

  1. จากเว็บอินเตอร์เฟส Jenkins ไปที่Manage Jenkins > Manage Pluginsและติดตั้งปลั๊กอิน

ปลั๊กอินหัวฉีดสภาพแวดล้อม

  1. ไปที่Configureหน้าจองานของคุณ
  2. ค้นหาAdd build stepในBuildส่วนและเลือกInject environment variables
  3. ตั้งค่าตัวแปรสภาพแวดล้อมที่ต้องการเป็นรูปแบบ VARIABLE_NAME = VALUE ในกรณีของฉันฉันเปลี่ยนค่าของตัวแปร USERPROFILE

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณต้องการกำหนดตัวแปรสภาพแวดล้อมใหม่ขึ้นอยู่กับเงื่อนไขบางประการ (เช่นพารามิเตอร์งาน) คุณสามารถอ้างถึงคำตอบนี้


16

คุณสามารถลองสิ่งนี้

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

นี่ไม่ได้แยกวิเคราะห์
rjurney

2
รูปแบบนี้ใช้สำหรับโครงการท่อส่ง Jenkinsfile คุณใช้งานตัวอย่างประเภทใดใน
JSixface

1
มันทำงานได้อย่างสมบูรณ์แบบJenkinsfileสำหรับท่อ (ไม่ใช่งาน)! เยี่ยมมากขอบคุณมาก!
mathielo

14

ปลั๊กอิน EnvInject aka ( Environment Injector Plugin ) มีตัวเลือกมากมายให้คุณตั้งค่าตัวแปรสภาพแวดล้อมจากการกำหนดค่า Jenkins

โดยการเลือกInject environment variables to the build processคุณจะได้รับ:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • Evaluated Groovy scriptและในที่สุดก็


Evaluated Groovy scriptให้ความเป็นไปได้ในการตั้งค่าตัวแปรสภาพแวดล้อมตามผลลัพธ์ของคำสั่งที่เรียกใช้ :

  • ด้วยexecuteวิธีการ:
    return [HOSTNAME_SHELL: 'hostname'.execute().text, 
        DATE_SHELL: 'date'.execute().text,
        ECHO_SHELL: 'echo hello world!'.execute().text
    ]
  • หรือด้วยGroovyรหัสที่ชัดเจน:
    return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
        DATE_GROOVY: new Date()
    ] 

(สามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับแต่ละวิธีได้ในวิธีใช้ build-in (?))


น่าเสียดายที่คุณไม่สามารถทำเช่นเดียวกันScript Contentกับที่ระบุ

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


12

มีปลั๊กอิน Env Propagatorซึ่งช่วยให้คุณเพิ่มตัวแปรสภาพแวดล้อมการสร้างใหม่ได้เช่น

Jenkins Build - เผยแพร่ตัวแปรสภาพแวดล้อมการสร้าง

ขั้นตอนการสร้างสภาพแวดล้อม Propagate แบบต่อเนื่องใด ๆ จะแทนที่ค่าตัวแปรสภาพแวดล้อมที่กำหนดไว้ก่อนหน้านี้


ขอบคุณ! ปลั๊กอิน Env Propagator ทำงานได้เมื่อฉันลองแล้วมันยอดเยี่ยมมากที่มีความสามารถในการตั้งค่าตัวแปรสภาพแวดล้อมในระหว่างขั้นตอนการสร้าง!
twasbrillig

10

ในกรณีของฉันฉันได้กำหนดค่าตัวแปรสภาพแวดล้อมโดยใช้ตัวเลือกต่อไปนี้และใช้งานได้ -

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

นี่เป็นวิธีที่ดีที่สุด
Long Nguyen

7

ปกติคุณสามารถกำหนดค่าตัวแปรสภาพแวดล้อมในทั่วโลกคุณสมบัติในการกำหนดค่าระบบ

อย่างไรก็ตามสำหรับตัวแปรแบบไดนามิกที่มีการทดแทนเชลล์คุณอาจต้องการสร้างไฟล์สคริปต์ใน Jenkins HOME dir และดำเนินการในระหว่างการสร้าง จำเป็นต้องเข้าถึง SSH ตัวอย่างเช่น.

  1. เข้าสู่ระบบเป็น Jenkins: sudo su - jenkinsหรือsudo su - jenkins -s /bin/bash
  2. สร้างเชลล์สคริปต์เช่น:

    echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
    echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
    chmod 750 ~/load_env.sh
    
  3. ใน Jenkins Build ( Execute shell ) ให้เรียกใช้สคริปต์และตัวแปรก่อนสิ่งอื่นเช่น

    source ~/load_env.sh
    

น่าเสียดายที่ไม่ได้ผลกับฉัน หลังจากที่sudo su - jenkinsยังคงให้ฉันecho $USER root
prayagupd

@prayagupd คุณต้องจำลองการเข้าสู่ระบบแบบเต็มดังนั้นใช้su -lพารามิเตอร์เพื่อทำสิ่งนั้นมิฉะนั้นถามคำถามแยกต่างหาก
kenorb

@kenorb หลังจากเรียกใช้สคริปต์ฉันจะอ่านตัวแปร env ได้อย่างไร ตัวอย่างเช่นวิธีนี้ใช้ไม่ได้กับแหล่ง "/" sh ~ "load_env.sh echo" VM_NAME: $ VM_NAME "echo" VM_NAME: $ {VM_NAME} "" ""
aung

7

นี่เป็นตัวอย่างข้อมูลเพื่อเก็บตัวแปรสภาพแวดล้อมและเข้าถึงได้

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

หมายเหตุ: ค่าของตัวแปรสภาพแวดล้อมจะมาเป็นสตริง ถ้าคุณต้องการใช้มันเป็นบูลีนคุณต้องแยกวิเคราะห์โดยใช้ Boolean.parse (env.DISABLE_SQL)


4

ลองใช้Environment Script Plugin ( GitHub ) ซึ่งคล้ายกับEnvInjectมาก อนุญาตให้คุณเรียกใช้สคริปต์ก่อนบิลด์ (หลังจากเช็คเอาต์ SCM) ที่สร้างตัวแปรสภาพแวดล้อมสำหรับมัน เช่น

Jenkins Build - งานปกติ - สร้างสภาพแวดล้อม

และในสคริปต์ของคุณคุณสามารถพิมพ์เช่น FOO=barเอาต์พุตมาตรฐานเพื่อตั้งค่าตัวแปรนั้น

ตัวอย่างการผนวกเข้ากับPATHตัวแปร -style ที่มีอยู่:

echo PATH+unique_identifier=/usr/local/bin

ดังนั้นคุณสามารถทำสิ่งที่คุณต้องการในสคริปต์ได้อย่างอิสระไม่ว่าจะcatเป็นไฟล์หรือเรียกใช้สคริปต์ในภาษาอื่น ๆ จากซอร์สโค้ดของโครงการของคุณเป็นต้น


1

คุณสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้ตามรายการด้านล่าง:

  1. ใช้Env Inject Pluginเพื่อสร้างตัวแปรสภาพแวดล้อม ปฏิบัติตามเพื่อการใช้งานและรายละเอียดเพิ่มเติมhttps://github.com/jenkinsci/envinject-plugin
    1. นำทางด้านล่างและสามารถเพิ่ม

จัดการ Jenkins -> กำหนดค่าระบบ -> คุณสมบัติทั่วโลก -> ตัวแปรสภาพแวดล้อม -> เพิ่ม

ป้อนคำอธิบายรูปภาพที่นี่


0

ด้วยเหตุผลบางอย่างsudo su - jenkinsไม่ได้ล็อกฉันกับjenkins ผู้ใช้ฉันลงเอยด้วยวิธีการต่าง ๆ

ฉันประสบความสำเร็จในการตั้งค่าตัวแปร env ทั่วโลกโดยใช้เจนกิ้นส์config.xmlที่/var/lib/jenkins/config.xml (ติดตั้งใน Linux / RHEL) - โดยไม่ต้องใช้ปลั๊กอินภายนอก

ฉันเพียงแค่ต้องหยุดเจนกินส์เพิ่มแล้วเพิ่มglobalNodePropertiesและจากนั้นเริ่มต้นใหม่

ตัวอย่างเช่นผมกำหนดตัวแปรAPPLICATION_ENVIRONMENTและSPRING_PROFILES_ACTIVEไปcontinious_integrationด้านล่าง

<?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>

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