Bagaimana cara mengatur variabel lingkungan di Jenkins?

228

Saya ingin dapat melakukan sesuatu seperti:

AOEU=$(echo aoeu)

dan memiliki Jenkins set AOEU=aoeu.

Bagian Variabel Lingkungan di Jenkins tidak melakukan itu. Alih-alih, itu mengatur AOEU='$(echo aoeu)'.

Bagaimana saya bisa membuat Jenkins mengevaluasi perintah shell dan menetapkan output ke variabel lingkungan?

Akhirnya, saya ingin dapat menetapkan pelaksana pekerjaan ke variabel lingkungan yang dapat diteruskan ke atau digunakan oleh skrip lain.

Noel Yap
sumber
2
Plugin EnvInject memiliki kerentanan keamanan serius. Sekarang Jenkins memiliki dukungan
bawaan
@lambodar tautannya langsung ke pertanyaan
Z. Cochrane
@ Z.Cochrane, ini adalah tautan ke jawaban yang telah dihapus oleh penulis.
Noel Yap

Jawaban:

217

Ini dapat dilakukan melalui plugin EnvInject dengan cara berikut:

  1. Buat langkah build "Execute shell" yang berjalan:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Buat langkah lingkungan penyuntikan variabel dan set "Properties File Path" ke propsfile.

Catatan : Plugin ini (kebanyakan) tidak kompatibel dengan plugin Pipeline.

malenkiy_scot
sumber
4
EnvInject tidak menangani situasi yang saya berikan di atas: [EnvInject] - Menyuntikkan sebagai variabel lingkungan konten properti AOEU = $ (echo aoeu) [EnvInject] - Variabel berhasil disuntikkan. [EnvInject] - Batalkan variabel 'AOEU' yang belum terselesaikan.
Noel Yap
1
Solusi itu menggunakan sintaksis Unix shell dan tidak akan berfungsi di windows.
fbmd
2
@ fbmd Saya menjalankannya di Windows. Anda hanya perlu memastikan bahwa Anda ada shdi jalur.
Custodio
2
EnvInject tidak berfungsi jika "eksekusi shell" keluar dengan kesalahan karena build tidak melanjutkan ke bagian injeksi.
Chadi
1
@ Vitim.us, fooakan diekspor dalam tindakan shell tertentu tetapi tidak dalam tindakan lain.
Noel Yap
109

Cara paling sederhana

Anda dapat menggunakan plugin EnvInject untuk menyuntikkan variabel lingkungan saat membangun startup. Sebagai contoh:

Tambahkan kunci = nilai (bash OK!) Di bawah 'Bangun Lingkungan' -> 'Suntikkan variabel lingkungan ke proses pembuatan' -> 'Konten Properti'

Bagaimana Anda tahu itu berhasil

EnvInject - Variabel berhasil disuntikkan

kenny_k
sumber
5
Coba atur nilai berdasarkan output dari perintah shell.
Noel Yap
1
@NoelYap Pekerjaan juga, asalkan pada akhirnya mengevaluasi line untuk key=value. Dalam kasus penggunaan saya, saya menghasilkan garis sepenuhnya: 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 versi EnvInject apa yang Anda gunakan? Dengan 1.91.3, perintah seperti milik Anda ditafsirkan sebagai "cat = app ...". Akan lebih bagus jika fitur ini didukung, tetapi saya merasa bahwa ini mungkin berhasil untuk Anda secara tidak sengaja.
killthrush
1
mencoba untuk memberikan nilai pada output dari perintah shell tidak bekerja untuk saya juga: BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"dan BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S")dan BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`tidak bekerja untuk saya
scottysseus
1
@scottyseus Saya akhirnya menggunakan ini wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Plugin bekerja seperti pesona. stackoverflow.com/a/38286383/1240268
Andy Hayden
56

Dalam kasus saya, saya perlu menambahkan JMETER_HOMEvariabel lingkungan agar tersedia melalui skrip build Ant di semua proyek di server Jenkins (Linux), dengan cara yang tidak akan mengganggu lingkungan build lokal saya (Windows dan Mac) dalam build.xmlskrip . Mengatur variabel lingkungan melalui Kelola Jenkins - Sistem Konfigurasi - Properti global adalah cara termudah dan paling tidak mengganggu untuk mencapai ini. Tidak diperlukan plug-in.

Kelola Jenkins Global Properties


Variabel lingkungan kemudian tersedia di Ant melalui:

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

Ini dapat diverifikasi untuk berfungsi dengan menambahkan:

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

Yang menghasilkan:

Beranda JMeter: ~ / .jmeter

vallismortis
sumber
Itu adalah properti global. Ini akan memengaruhi SEMUA pekerjaan di Jenkins. Misalkan saya hanya menginginkan properti ini untuk satu pekerjaan?
IgorGanapolsky
Saya telah menambahkan ke Manage Jenkins - Configure System - Global properties, berikut ini: git /path/to/my/gitdan PATH+git /path/to/my/git. Namun, jika saya mencoba untuk akses gitdari yang Jenkins pipeline script, saya mendapatkan: /bin/sh: git: command not found.
oktavan
1
Saya hanya perlu menyiapkan variabel lingkungan JAVA_HOME dan jawaban ini adalah yang membantu saya.
Sandoval0992
19

Anda dapat menggunakan Plugin Injector Lingkungan untuk mengatur variabel lingkungan di Jenkins di tingkat pekerjaan dan node. Di bawah ini saya akan menunjukkan cara mengaturnya di tingkat pekerjaan.

  1. Dari antarmuka web Jenkins, buka Manage Jenkins > Manage Pluginsdan instal plugin.

Plugin Injector Lingkungan

  1. Pergi ke Configurelayar pekerjaan Anda
  2. Temukan Add build stepdi Buildbagian dan pilihInject environment variables
  3. Tetapkan variabel lingkungan yang diinginkan sebagai VARIABLE_NAME = pola VALUE. Dalam kasus saya, saya mengubah nilai variabel USERPROFILE

masukkan deskripsi gambar di sini

Jika Anda perlu mendefinisikan variabel lingkungan baru tergantung pada beberapa kondisi (misalnya parameter pekerjaan), maka Anda dapat merujuk ke jawaban ini .

Ayaz Alifov
sumber
16

Anda dapat mencoba sesuatu seperti ini

stages {
        stage('Build') {
            environment { 
                    AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
                }
            steps {
                sh 'env'
                sh 'echo $AOEU'
            }
        }
    }
Wajah JSixface
sumber
Ini tidak menguraikan.
rjurney
2
Format ini untuk proyek pipa Jenkinsfile. Jenis pekerjaan apa yang Anda gunakan dalam cuplikan ini?
JSixface
1
Ini berfungsi dengan baik Jenkinsfileuntuk pipa (bukan pekerjaan)! Itu luar biasa, terima kasih untuk itu!
mathielo
14

EnvInject Plugin aka ( Environment Injector Plugin ) memberi Anda beberapa opsi untuk mengatur variabel lingkungan dari konfigurasi Jenkins.

Dengan memilih Inject environment variables to the build processAnda akan mendapatkan:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • dan akhirnya Evaluated Groovy script.


Evaluated Groovy scriptmemberi Anda kemungkinan untuk mengatur variabel lingkungan berdasarkan hasil dari perintah yang dieksekusi :

  • dengan executemetode:
    return [HOSTNAME_SHELL: 'hostname'.execute().text, 
        DATE_SHELL: 'date'.execute().text,
        ECHO_SHELL: 'echo hello world!'.execute().text
    ]
  • atau dengan Groovykode eksplisit :
    return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
        DATE_GROOVY: new Date()
    ] 

(Detail lebih lanjut tentang masing-masing metode dapat ditemukan dalam bantuan bawaan (?))


Sayangnya Anda tidak dapat melakukan hal yang sama Script Contentseperti yang dinyatakan:

Jalankan file skrip yang bertujuan mengatur lingkungan seperti membuat folder, menyalin file, dan sebagainya. Berikan konten file skrip. Anda dapat menggunakan variabel properti di atas. Namun, menambahkan atau mengesampingkan variabel lingkungan dalam skrip tidak memiliki dampak apa pun dalam pekerjaan pembuatan .

luka5z
sumber
12

Ada Build Env Propagator Plugin yang memungkinkan Anda menambahkan variabel lingkungan build baru, misalnya

Jenkins Build - Menyebarkan variabel lingkungan build

Setiap langkah variabel lingkungan Propagate build yang berurutan akan menimpa nilai variabel lingkungan yang ditentukan sebelumnya.

kenorb
sumber
Terima kasih! Plugin Env Propagator Build berfungsi ketika saya mencobanya, dan senang memiliki kemampuan untuk mengatur variabel lingkungan selama langkah Build!
twasbrillig
10

Dalam kasus saya, saya telah mengkonfigurasi variabel lingkungan menggunakan opsi berikut dan itu berhasil-

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
nik
sumber
Ini adalah cara terbaik
Long Nguyen
7

Biasanya Anda dapat mengonfigurasi variabel Lingkungan di properti Global di Sistem Konfigurasi .

Namun untuk variabel dinamis dengan substitusi shell, Anda mungkin ingin membuat file skrip di dir Jenkins HOME dan jalankan selama build. Diperlukan akses SSH. Sebagai contoh.

  1. Masuk sebagai Jenkins: sudo su - jenkinsatausudo su - jenkins -s /bin/bash
  2. Buat skrip shell, misalnya:

    echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
    echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
    chmod 750 ~/load_env.sh
    
  3. Dalam Jenkins Build ( Execute shell ), aktifkan skrip dan variabel-variabelnya sebelum yang lainnya, mis

    source ~/load_env.sh
    
kenorb
sumber
sayangnya tidak berhasil untuk saya. setelah itu sudo su - jenkins, masih echo $USERmemberi saya root.
prayagupd
@prayagupd Anda perlu mensimulasikan login lengkap, jadi gunakan su -lparameter untuk melakukan itu, jika tidak, ajukan pertanyaan terpisah.
kenorb
@kenorb setelah menjalankan skrip, bagaimana cara membaca variabel env lagi? misalnya, ini tidak bekerja dengan "" "sumber ~ / load_env.sh echo" VM_NAME: $ VM_NAME "echo" VM_NAME: $ {VM_NAME} "" ""
aung
7

Ini adalah cuplikan untuk menyimpan variabel lingkungan dan mengaksesnya.

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

Catatan: Nilai variabel lingkungan akan datang sebagai String. Jika Anda ingin menggunakannya sebagai boolean maka Anda harus menguraikannya menggunakan Boolean.parse (env.DISABLE_SQL).

barotdeep
sumber
4

Coba Plugin Skrip Lingkungan ( GitHub ) yang sangat mirip dengan EnvInject . Ini memungkinkan Anda untuk menjalankan skrip sebelum membangun (setelah checkout SCM) yang menghasilkan variabel lingkungan untuk itu. Misalnya

Jenkins Build - Pekerjaan rutin - Membangun Lingkungan

dan dalam skrip Anda, Anda dapat mencetak misalnya FOO=barke output standar untuk mengatur variabel itu.

Contoh untuk menambahkan PATHvariabel-gaya yang ada :

echo PATH+unique_identifier=/usr/local/bin

Jadi, Anda bebas melakukan apa pun yang Anda butuhkan dalam skrip - catfile, atau jalankan skrip dalam bahasa lain dari hierarki sumber proyek Anda, dll.

kenorb
sumber
1

Anda dapat menggunakan salah satu dari cara berikut yang tercantum di bawah ini:

  1. Gunakan Env Inject Plugin untuk membuat variabel lingkungan. Ikuti ini untuk penggunaan dan detail lebih lanjut https://github.com/jenkinsci/envinject-plugin
    1. Menavigasi di bawah ini dan dapat menambahkan

Kelola Jenkins -> Configure System -> Global Properties -> Variabel Lingkungan -> Tambah

masukkan deskripsi gambar di sini

Sumit
sumber
0

Untuk beberapa alasan sudo su - jenkinstidak mencatat saya ke jenkins pengguna , saya akhirnya menggunakan pendekatan yang berbeda.

Saya berhasil mengatur variabel env global menggunakan menggunakan jenkins config.xmldi/var/lib/jenkins/config.xml (diinstal di Linux / RHEL) - tanpa menggunakan plugin eksternal.

Saya hanya harus berhenti menambahkan jenkins lalu menambahkan globalNodeProperties, dan kemudian restart.

Contoh, saya mendefinisikan variabel APPLICATION_ENVIRONMENTdan SPRING_PROFILES_ACTIVEke continious_integrationbawah,

<?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>
prayagupd
sumber
-3

Kami menggunakan file pekerjaan asyik:

description('')
steps {
    environmentVariables {
        envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
    }
}
techguy2000
sumber