Jenkins - değişkenler işler arasında aktarılıyor mu?


88

Jenkins'te her ikisi de aynı parametreye ihtiyaç duyan iki işim var.

İlk işi bir parametre ile nasıl çalıştırabilirim, böylece ikinci işi tetiklediğinde aynı parametre kullanılır?


Pek çok yol kullanabiliriz: En iyi yol, mevcut iş parametrelerini kullanmak veya tetikleyici aşağı akış işinde önceden tanımlanmış parametreleri kullanmaktır
ksr

1
Bu başlık çok kafa karıştırıcı. Bu nasıl "değişkenler işler arasında geçiriliyor?" Ayrıca kabul edilen cevap bir eklentidir. Fantezi bu!
Rakib

Yanıtlar:


73

Parametreleri bir görevden diğerine aktarmanıza izin veren Parametreli Tetik Eklentisini kullanabilirsiniz .

Ayrıca aşağı akışta yukarı akıştan geçirdiğiniz bu parametreyi de eklemeniz gerekir.


10
Merhaba, çaylak gibi konuştuğum için üzgünüm, ancak birisi bunu Parametreli Tetikleme Eklentisi ile nasıl yapılacağına dair ayrıntılarla düzenleyebilirse sorun olur mu?
Fadi

10
Yan not: bash betiği bölümlerinde oluşturulan dışa aktarılan ortam değişkenleri, çıktı parametrelerinde ikame için uygun görünmüyor (örneğin, 'VERSİYONU dışa aktar' 'UPSTREAM_VERSION = $ VERSION' doğru değeri almayacak; sadece Bunun yerine '$ VERSION').
Mark McKenna

21
Bu cevap yetersiz
tarabayt

6
Parametrelerin hedef işe nasıl aktarılacağına dair bir tür örnek olması gerektiğine katılıyorum. Mevcut Parametreli Tetik Eklentisi sayfası bu konuda iyi bilgi vermiyor. Örneğin, parametreleri geçirirken ne tür bir sözdizimi kullanmanız gerektiği olabilir.
skrii

2
Eklenti artık çalışmıyor gibi görünüyor. Açık sorunların uzun listesine bakın . Artık bu eklenti ile herhangi bir parametre değeri geçiremiyorum. Başka bir çözüm var mı?
Markus L

38

1. Post-Build Eylemleri> "Diğer projelerde parametreleştirilmiş derlemeyi tetikle" seçeneğini belirleyin

2. value ile ortam değişkenini girin.Value ayrıca Jenkins Build Parameters olabilir.

Ayrıntılı adımlar burada görülebilir: -

https://itisatechiesworld.wordpress.com/jenkins-related-articles/jenkins-configuration/jenkins-passing-a-parameter-from-one-job-to-another/

Umarım yardımcı olur :)


Bu cevap, OP'nin bir eklenti gerektirmeden veya DSL kullanmadan sorduğu soruyu karşılar.
BTC

8
Bilginize, bu cevabın hala eklentiye ihtiyacı var.
Thomas Lee

Eklenti ne zaman harikadır, ancak kabuk yürütme komut bölümlerinde ayarlanan değişken değerleri geçemez.
Tara Prasad Gurung

25

Kabul cevabı burada kullanım örneği için çalışmaz. Bir işte dinamik olarak parametreler oluşturabilmem ve bunları diğerine aktarabilmem gerekiyordu. As Mark McKenna sonrası inşa eylemlerine bir kabuk yapı adımdan bir değişkeni dışa yolu görünüşte yoktur bahseder.

Parametreli Tetik Eklentisini kullanarak değerleri bir dosyaya yazarak ve bu dosyayı 'Derleme sonrası eylem ekle' -> 'Parametreli yapıyı tetikle ...' ve ardından 'Parametre Ekle'yi seçerek içe aktarılacak parametreler olarak kullanarak bir geçici çözüm elde ettim - > 'Özellikler dosyasından parametreler'.


İhtiyacım olan bu. Teşekkürler.
luckytaxi

Jenkins 2.x ardışık düzenini kullanmak istiyorsanız, işler arasında durum verilerini kopyalamak için writeFile / stash-> unstash / readFile'ı kullanabilirsiniz. slideshare.net/ericlongtx/… Örnek için 21. slaydı kontrol edin.
siesta

SHELL değişkenlerinin geçmesini istiyorsanız bu gereklidir. Bu cevap için çok minnettarım.
Carl Wainwright

18

Sanırım yukarıdaki cevabın biraz güncellenmesi gerekiyor:

Yukarı akış derleme yapılarımı depolamak için dinamik bir dizin oluşturmaya çalışıyordum, bu nedenle yukarı akış iş oluşturma numaramı aşağı akış işine geçirmek istedim, yukarıdaki adımları denedim ancak çalışmasını sağlayamadım. İşte böyle çalıştı:

  1. Eserleri kopyala eklentisini kullanarak mevcut işimdeki eserleri kopyaladım.
  2. Yukarı akış işinin derleme sonrası eyleminde "SOURCE_BUILD_NUMBER = $ {BUILD_NUMBER}" gibi değişkeni ekledim ve aşağı akış işini tetikleyecek şekilde yapılandırdım.
  3. Aşağı akış işimin dizini oluşturmak için $ SOURCE_BUILD_NUMBER $ alamaması dışında her şey çalıştı.
  4. Bu yüzden, bu değişkeni kullanmak için aşağı akış işinde aynı değişkeni aşağıdaki resimde olduğu gibi bir parametre değişkeni olarak tanımlamam gerektiğini öğrendim:

enter image description here

Bunun nedeni, jenkins'in yeni sürümünün, aşağı akış işinde de değişkeni tanımlamanızı gerektirmesidir. Umarım yardımcı olur.


Tamamen katılıyorum. Bu, ilk cevabı% 100 tamamlayan zorunlu bir güncellemedir.
CodeSlave

Ayrıca, daha fazla oy alan iki seçeneği de denedim, ancak yukarıda 4. adımda belirtilen ekstra yapılandırmayı ekleyene kadar hiçbiri işe yaramadı. Çalışması için kopya yapılarının etkinleştirilmesine gerek yoktu.
Jeff Fol

10

(Google çalışanları için)

Build Flow Plugin ile ciddi bir ardışık düzen oluşturuyorsanız , parametreleri DSL ile işler arasında şu şekilde geçirebilirsiniz:

Diğer işlere aktarmak için kullanılabilir bir "CVS_TAG" dize parametresi varsayarsak:

build("pipeline_begin", CVS_TAG: params['CVS_TAG'])
parallel (
   // will be scheduled in parallel.
   { build("pipeline_static_analysis", CVS_TAG: params['CVS_TAG']) },
   { build("pipeline_nonreg", CVS_TAG: params['CVS_TAG']) }
)
// will be triggered after previous jobs complete
build("pipeline_end", CVS_TAG: params['CVS_TAG'])

Mevcut değişkenleri / parametreleri görüntülemek için ipucu:

// output values
out.println '------------------------------------'
out.println 'Triggered Parameters Map:'
out.println params
out.println '------------------------------------'
out.println 'Build Object Properties:'
build.properties.each { out.println "$it.key -> $it.value" }
out.println '------------------------------------'

Derleme Akış Eklentisi kullanımdan kaldırıldı, kullanıcılar wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin'e geçmelidir
vhamon

7

Henüz yorum yapamadığım için Nigel Kirby'nin yanı sıra cevabımı eklemen yeterli:

Dinamik olarak oluşturulmuş bir parametreyi geçirmek için, değişkeni 'Kabuğu Çalıştır' kutucuğuna dışa aktarabilir ve ardından onu 'Diğer projelerde parametreleştirilmiş yapıyı tetikle' => 'Önceden tanımlanmış parametreler "=>' YOUR_VAR = $ YOUR_VAR 'verebilirsiniz. Ekibim bu özelliği, npm paket sürümünü derleme işinden dağıtım işlerine geçirmek için kullanıyor

GÜNCELLEME: Yukarıdaki yalnızca Jenkins'in enjekte ettiği parametreler için çalışır, kabuktan oluşturulan parametrenin yine de aynı yöntemi kullanması gerekir. Örneğin. echo YOUR_VAR = $ {YOUR_VAR}> variable.properties ve bu dosyayı aşağı akışa aktar


3

Aşağı akışlı bir Rundeck işine bir pom sürümünü geçirmem gerektiğinde aynı sorunla karşılaştım.

Yaptığım şey, aşağıdaki gibi bir özellikler dosyası aracılığıyla parametre enjeksiyonu kullanmaktı:

1) Özellikler dosyasında kabuk aracılığıyla özellikler oluşturma:

Eylemler oluşturun:

  • Bir kabuk betiğini yürütün
  • Ortam değişkenlerini enjekte edin

Örneğin: özellik tanımı

2) Tanımlanan özellikleri aşağı akış işine geçirme: Derleme Sonrası İşlemler:

  • Diğer projede parametreleştirilmiş derlemeyi tetikle
  • Parametre ekle: Mevcut derleme parametreleri
  • Parametre ekle: önceden tanımlanmış parametreler

Örneğin: gönderen özellikler

3) Daha sonra aşağı akış Rundeck işinde olduğu gibi $ POM_VERSION kullanmak mümkün oldu.

/! \ Jenkins Sürüm: 1.636

/! \ Tetiklenen yapıyı oluştururken bazı nedenlerden dolayı, özellikleri geçmek için 'Mevcut yapı parametreleri' seçeneğini eklemek gerekiyordu.


DÜZENLEME: Yazdıklarımda bir hata buldum. Özellikler tanımında şu olmalıydı: echo POM_VERSION = $ POM_VERSION> play.properties ve değil: echo $ POM_VERSION >> play.properties Üzgünüz.
Eli Mous

2

Cevapları okurken sevdiğim başka bir seçenek de görmüyorum, bu yüzden de sunacak. İşlerin parametrelendirilmesini seviyorum ama her zaman iyi ölçeklenmiyor. Doğrudan ilk işin aşağı akışında olmayan ancak boru hattının daha aşağısında olan işleriniz varsa, parametreleri baştan sona geçirebilmek için boru hattındaki her işi gerçekten parametrelendirmek istemezsiniz. Veya çeşitli diğer işler tarafından kullanılan çok sayıda parametreniz varsa (özellikle bir ana işe veya ana işe bağlı olmayanlar), yine parametrelendirme çalışmaz.

Bu durumlarda, değerleri bir özellikler dosyasına yazdırmayı ve ardından EnvInject eklentisini kullanarak ihtiyacım olan her işte bunu enjekte etmeyi tercih ederim . Bu dinamik olarak yapılabilir, bu da parametreleştirilmiş işlerin hala kullanıldığı yukarıdaki başka bir cevaptan sorunu çözmenin başka bir yoludur. Bu çözüm birçok senaryoda çok iyi ölçeklenir.



0

Bunu anladım!

Neredeyse 2 saatlik deneme yanılma ile anladım.

Bu ÇALIŞIR ve değişkenleri uzak işe geçirmek için yaptığınız şeydir:

    def handle = triggerRemoteJob(remoteJenkinsName: 'remoteJenkins', job: 'RemoteJob' paramters: "param1=${env.PARAM1}\nparam2=${env.param2}")

Boşluk olmadan iki parametreyi ayırmak için \ n kullanın.

Parametrelerin aksine: '' 'someparam'lar' ''

parametreleri kullanıyoruz: "someparams"

"..." bize istenen değişkenlerin değerlerini veren şeydir. (Bunlar çift tırnaktır, iki tek tırnak değil)

'' '...' '' veya '...' bize bu değerleri vermeyecektir. (Üç tek tırnak veya yalnızca tek tırnak)

Buradaki tüm parametreler, boru hattının başlangıcında {} ortamı bloğunda tanımlanır ve gerektiğinde aşamalar> adımlar> komut dosyaları şeklinde değiştirilir.

Ayrıca test ettim ve "..." kullandığınızda "" ... "..." "'' veya" ... "..'..." gibi bir şeyi veya o...

Buradaki püf noktası, parametreler bölümünde "..." kullandığınızda, bir dize parametresini geçemezsiniz; örneğin Bu ÇALIŞMAZ:

    def handle = triggerRemoteJob(remoteJenkinsName: 'remoteJenkins', job: 'RemoteJob' paramters: "param1=${env.PARAM1}\nparam2='param2'")

Yukarıdakine benzer bir şeyi geçmek istiyorsanız, bir ortam değişkeni param2 = 'param2' ayarlamanız ve ardından uzaktan tetikleme eklentisi adımının parametreler bölümünde $ {env.param2} kullanmanız gerekir.

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.