Jenkins'te ortam değişkenleri nasıl ayarlanır?


228

Gibi bir şey yapabilmek istiyorum:

AOEU=$(echo aoeu)

ve Jenkins'in hazır olmasını sağlayın AOEU=aoeu.

Ortam Değişkenleri Jenkins bölümünde bunu yapmaz. Bunun yerine ayarlanır AOEU='$(echo aoeu)'.

Jenkins'in bir kabuk komutunu değerlendirmesini ve çıktıyı bir ortam değişkenine atamasını nasıl sağlayabilirim?

Sonunda, bir işin yürütücüsünü başka komut dosyalarına aktarılabilen veya diğer komut dosyaları tarafından kullanılabilen bir ortam değişkenine atamak istiyorum.


2
EnvInject eklentisinde ciddi bir güvenlik açığı bulunmaktadır. Şimdi Jenkins buna ilişkin dahili destek yaşıyor stackoverflow.com/a/53430757/1753177
lambodar

@lambodar bağlantı sadece soruya gidiyor
Z. Cochrane

@ Z.Cochrane, yazar tarafından silinen bir cevabın bağlantısı.
Noel Yap

Yanıtlar:


217

Bu, EnvInject eklentisi aracılığıyla şu şekilde yapılabilir:

  1. Çalışan bir "Execute shell" oluşturma adımı oluşturun:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Bir Inject ortam değişkenleri oluşturma adımı oluşturun ve "Özellikler Dosya Yolu" olarak ayarlayın propsfile.

Not : Bu eklenti (çoğunlukla) Pipeline eklentisi ile uyumlu değildir.


4
EnvInject yukarıda verdiğim durumu işlemez: [EnvInject] - Ortam değişkenleri olarak enjekte edilir özellik içeriği AOEU = $ (echo aoeu) [EnvInject] - Değişkenler başarıyla enjekte edilir. [EnvInject] - Çözülmemiş 'AOEU' değişkeninin ayarını kaldırın.
Noel Yap

1
Bu çözüm Unix kabuk sözdizimini kullanır ve pencerelerde çalışmaz.
fbmd

2
@fbmd Windows üzerinde çalıştırıyorum. Sadece shyolda olduğunuzdan emin olmanız gerekir .
Custodio

2
Derleme enjeksiyon parçasına geçmediği için "execute shell" hata ile çıkarsa EnvInject çalışmaz.
Chadi

1
@ Vitim.us, foobu belirli kabuk eyleminde dışa aktarılır, ancak diğer eylemlerde dışa aktarılmaz.
Noel Yap

109

En basit yol

EnvInject eklentisini derleme başlangıcında ortam değişkenlerini enjekte etmek için kullanabilirsiniz . Örneğin:

'Oluşturma Ortamı' -> 'Ortam değişkenlerini oluşturma işlemine enjekte et' -> 'Özellikler İçeriği' altına key = value (bash OK!) Ekleyin

Çalıştığını nasıl biliyorsun?

EnvInject - Değişkenler başarıyla enjekte edildi


5
Bir kabuk komutunun çıkışına göre değeri ayarlamayı deneyin.
Noel Yap

1
@NoelYap Satır değerlendirildiği sürece de çalışır key=value. Benim kullanım durumunda tamamen çizgi oluşturmak: 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'in hangi sürümünü kullanıyorsunuz? 1.91.3 ile sizinki gibi bir komut "cat = app ..." olarak yorumlanır. Bu özellik desteklenirse harika olurdu, ancak bunun sizin için yanlışlıkla işe yaramış olabileceğini anlıyorum.
killthrush

1
Bir kabuk komutunun çıktısına bir değer atamak için teşebbüs Benim için de çalışmıyor: BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"ve BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S")ve BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`benim için çalışmalarını vermedi
scottysseus


56

Benim durumumda, ben eklemek için gerekli JMETER_HOMEde benim yerel yapı ortamında (Windows ve Mac) müdahale olmaz bir şekilde, benim Jenkins sunucusuna (Linux) tüm projeler bazında benim Ant yapı komut yoluyla olmak kullanılabilir ortam değişkeni build.xmlkomut . Ortam değişkenini Jenkins'i Yönet - Sistemi Yapılandır - Global özellikler aracılığıyla ayarlamak, bunu gerçekleştirmenin en kolay ve en az müdahaleci yoluydu. Eklenti gerekmez.

Jenkins Global Özelliklerini Yönetme


Ortam değişkeni daha sonra Ant'de şu yolla kullanılabilir:

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

Bu, aşağıdakiler eklenerek işler için doğrulanabilir:

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

Hangi üretir:

JMeter Ana Sayfası: ~ / .jmetre


Bu küresel bir özelliktir. Jenkins üzerindeki TÜM işleri etkileyecektir. Bu mülkü sadece bir iş için mi istiyordum?
IgorGanapolsky

Jenkins'i Yönet - Sistemi Yapılandır - Global özelliklerine ekledim: git /path/to/my/gitve PATH+git /path/to/my/git. Erişmeye çalışıyorum Ancak, gita dan Jenkins pipeline scriptalıyorum: /bin/sh: git: command not found.
octavian

1
Sadece JAVA_HOME ortam değişkenini kurmam gerekiyordu ve bu cevap bana yardımcı oldu.
Sandoval0992

19

İş ve düğüm seviyelerinde Jenkins'te ortam değişkenlerini ayarlamak için Ortam Enjektörü Eklentisi'ni kullanabilirsiniz . Aşağıda bunları iş düzeyinde nasıl ayarlayacağımı göstereceğim.

  1. Jenkins web arayüzünden Manage Jenkins > Manage Pluginseklentiye gidin ve yükleyin.

Ortam Enjektörü Eklentisi

  1. İş Configureekranınıza gidin
  2. Bul Add build stepiçinde Buildbölümü ve seçmekInject environment variables
  3. İstenen ortam değişkenini VARIABLE_NAME = VALUE kalıbı olarak ayarlayın. Benim durumumda, USERPROFILE değişkeninin değerini değiştirdim

resim açıklamasını buraya girin

Bazı koşullara (örneğin iş parametreleri) bağlı olarak yeni bir ortam değişkeni tanımlamanız gerekiyorsa, bu cevaba başvurabilirsiniz .


16

Böyle bir şey deneyebilirsin

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

Bu ayrıştırılmaz.
rjurney

2
Bu format Jenkinsfile boru hattı projesi içindir. Bu pasajı hangi iş türünde kullanıyorsunuz?
JSixface

1
Bu Jenkinsfilebir boru hattında (iş değil) mükemmel çalışır ! Harika, bunun için teşekkürler!
mathielo

14

EnvInject Eklentisi aka ( Ortam Enjektörü Eklentisi ) Jenkins yapılandırmasından ortam değişkenlerini ayarlamak için çeşitli seçenekler sunar.

Seçerek Inject environment variables to the build processelde edersiniz:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • ve son olarak Evaluated Groovy script.


Evaluated Groovy scriptçalıştırılan komutun sonucuna göre ortam değişkenini ayarlamanıza olanak tanır :

  • ile executeyöntem:
    return [HOSTNAME_SHELL: 'hostname'.execute().text, 
        DATE_SHELL: 'date'.execute().text,
        ECHO_SHELL: 'echo hello world!'.execute().text
    ]
  • veya açık Groovykodla:
    return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
        DATE_GROOVY: new Date()
    ] 

(Her yöntem hakkında daha fazla ayrıntı yerleşik yardımda (?) Bulunabilir)


Maalesef Script Contentbelirttiği gibi aynı şeyi yapamazsınız :

Klasör oluşturma, dosya kopyalama vb. Gibi bir ortam ayarlamayı amaçlayan bir komut dosyası yürütün. Komut dosyası içeriği verin. Yukarıdaki özellik değişkenlerini kullanabilirsiniz. Ancak, komut dosyasına ortam değişkenleri eklemenin veya geçersiz kılmanın derleme işinde herhangi bir etkisi yoktur .


12

Orada Yapı Zarf Propagator Eklentisi Eğer örneğin yeni inşa ortam değişkenleri, eklemenize izin verir

Jenkins Build - İnşa ortamı değişkenlerini yay

Art arda yayılan derleme ortamı değişkenleri adımı, daha önce tanımlanan ortam değişkeni değerlerini geçersiz kılar.


Teşekkür ederim! Build Env Propagator Plugin denediğimde çalıştı ve Build adımları sırasında ortam değişkenlerini ayarlama yeteneğine sahip olmak harika!
twasbrillig

10

Benim durumumda, ortam değişkenlerini aşağıdaki seçeneği kullanarak yapılandırdım ve işe yaradı.

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

Bu en iyi yoldur
Long Nguyen

7

Normalde Yapılandırabileceğiniz Çevre değişkenleri de Küresel özelliklerinde de yapılandır Sistemi .

Ancak kabuk değiştirme özelliğine sahip dinamik değişkenler için Jenkins HOME dizininde bir komut dosyası oluşturmak ve derleme sırasında yürütmek isteyebilirsiniz. SSH erişimi gerekiyor. Örneğin.

  1. Jenkins olarak giriş yapın: sudo su - jenkinsveyasudo su - jenkins -s /bin/bash
  2. Bir kabuk komut dosyası oluşturun, örneğin:

    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'da ( Kabuğu yürüt ), komut dosyasını ve değişkenlerini her şeyden önce çağırın, örn.

    source ~/load_env.sh
    

maalesef benim için çalışmadı. sonra sudo su - jenkinshala echo $USERbana veriyor root.
prayagupd

@prayagupd Tam bir girişi simüle etmeniz gerekir, bu nedenle su -lbunu yapmak için parametreyi kullanın, aksi takdirde ayrı bir soru sorun.
kenorb

@kenorb betiği çağırdıktan sonra env değişkenini tekrar nasıl okurum? örneğin, bu çalışmaz "" "kaynak ~ / load_env.sh echo" VM_NAME: $ VM_NAME "echo" VM_NAME: $ {VM_NAME} "" ""
01'de

7

Bu, ortam değişkenini depolamak ve ona erişmek için kullanılan snippet'tir.

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

Not: Ortam değişkeninin değeri bir String olarak geliyor. Bir boolean olarak kullanmak istiyorsanız, Boolean.parse (env.DISABLE_SQL) kullanarak ayrıştırmanız gerekir.


4

Deneyin Çevre Senaryo Plugin ( GitHub çok benzer) EnvInject . Komut dosyasını, ortam değişkenleri oluşturan derlemeden önce (SCM kontrolünden sonra) çalıştırmanızı sağlar. Örneğin

Jenkins Build - Düzenli iş - Build Environment

ve betiğinizde, FOO=barbu değişkeni ayarlamak için örneğin standart çıktıya yazdırabilirsiniz .

Mevcut bir PATHstil değişkenine ekleme örneği :

echo PATH+unique_identifier=/usr/local/bin

Böylece, komut dosyasında ihtiyacınız olan her şeyi yapabilirsiniz - catbir dosya veya projenizin kaynak ağacından başka bir dilde bir komut dosyası çalıştırın.



0

Herhangi bir nedenden dolayı sudo su - jenkinsbeni jenkins kullanıcıya kaydetmiyor , farklı bir yaklaşım kullandım.

Ben Jenkins'i kullanarak kullanarak küresel env değişkenleri ayarlayarak başarılı config.xmlde /var/lib/jenkins/config.xmldış eklentileri kullanmadan - (Linux / RHEL yüklü).

Ben sadece eklemek sonra eklemek globalNodePropertiesve sonra yeniden jenkins durdurmak zorunda kaldı .

Örnek, ben değişkenleri tanımlayarak ediyorum APPLICATION_ENVIRONMENTve SPRING_PROFILES_ACTIVEhiç continious_integrationaşağıya,

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

-3

Harika iş dosyası kullanıyoruz:

description('')
steps {
    environmentVariables {
        envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.