19

Harika bir dosyam var, Jenkinsfile'dan çalıştırmak istiyorum.Boru Hattı ile Jenkinsfile dizinine nasıl başvurabilirim?

ie. load script.groovy

Ancak, bu dosyayı Jenkinsfile ile aynı dizinde saklanıyorsa nasıl başvurabileceğimi bilmiyorum. Jenkinsfile'ı git'ten yüklüyorum. Fark ettim ki [email protected] adında bir klasör oluşturuyor. Bunu çalışma alanı dizinine yerleştirmez. Klasörü yeniden kodlayabiliyordum ancak buradaki kurallardan emin değilim ve kodu tekrar kontrol etmek için biraz gereksiz görünüyor. Varsayılan olarak

java.io.FileNotFoundException: /opt/jenkins_home/jobs/my_job/workspace/script.groovy (No such file or directory) 

yerine ben Boru Hattı (İş Akışı) komut dosyasına bir bir BuildFlow senaryoyu dönüştürmek çalışıyorum [email protected]

arasında, çalışma alanından yükler. Ama buluyorum, bir kopya ve yapıştırmak kadar kolay değil.

Jenkinsfile

node { 

//get parameters from Job 
def builds = builds.tokenize(",") 
def ip_address_node = ip_address_node.trim() 
def port_node = port_node.trim() 
def branch = branch.trim() 
def workspace = pwd() 

stage 'Checking out code from esb repository' 
git branch: branch, url: 'ssh://[email protected]/integration_bus.git' 

load '../[email protected]/esb_deploybar_pipeline/deploy_esb.groovy' 

} 

deploy_esb.groovy

bu script.groovy dosya projenizin kök ise

import groovy.transform.ToString 
import groovy.transform.EqualsAndHashCode 
@EqualsAndHashCode 
@ToString 
class BarDeploy { 
    String barFile 
    String app 
    String integrationServer 
} 


//parse csv 
def csvItemsApps = new HashSet<BarDeploy>(); 
def csvItemsLibs = new HashSet<BarDeploy>(); 
def deploymentMapFile = new File(workspace + "/ESB_Deployment_Map.csv") 
def isFirstLine = true 

stage 'Parsing ESB Deployment CSV' 
deploymentMapFile.withReader { reader -> 
    while(line = reader.readLine()) { 
     if(isFirstLine) 
     { 
      isFirstLine = false 
      continue 
     } 

     csvLine = line.split(",") 
     app = csvLine[0] 
     intServer = csvLine[1] 

     def barDeploy = new BarDeploy() 
     barDeploy.app = app 
     barDeploy.integrationServer = intServer 
     csvItemsApps.add(barDeploy) 


     //get shared libs 
     if(csvLine.length > 2 && csvLine[2] != null) 
     { 
      def sharedLibs = csvLine[2].split(";") 
      sharedLibs.each { libString -> 
       if(!libString.isAllWhitespace()) 
       { 
        def lib = new BarDeploy() 
        lib.app = libString 
        lib.integrationServer = intServer 
        csvItemsLibs.add(lib) 
       } 
      }; 
     } 
    } 
}; 

//get list of bar files to deploy from html and consolidate bar files to deploy with apps in csv 
for (int i = 0; i < builds.size(); i+=3) 
{ 
    if(builds[i].equals("false")) 
    { 
     //Don't deploy bar if checkbox isn't selected 
     continue 
    } 

    foundInCSV = false 

    appToDeploy = builds[i + 1] 
    barFileToDeploy = builds[i + 2] 

    iterator = csvItemsApps.iterator() 
    while (iterator.hasNext()) 
    { 
     barDeploy = iterator.next() 
     if(appToDeploy.equalsIgnoreCase(barDeploy.app)) 
     { 
      barDeploy.barFile = barFileToDeploy 
      foundInCSV = true 
     } 
    } 

    iterator = csvItemsLibs.iterator() 
    while (iterator.hasNext()) 
    { 
     barDeploy = iterator.next() 
     if(appToDeploy.equalsIgnoreCase(barDeploy.app)) 
     { 
      barDeploy.barFile = barFileToDeploy 
      foundInCSV = true 
     } 
    } 

    if(foundInCSV == false) 
    { 
     throw new RuntimeException("App: " + appToDeploy + " not found in ESB_Deployment_Map.csv. Please add CSV Entry.") 
    } 
} 


//Do deploy, deploy shared libs first 
deployCSVItemsInParallel(ip_address_node,port_node,branch,env_key,csvItemsLibs) 
deployCSVItemsInParallel(ip_address_node,port_node,branch,env_key,csvItemsApps) 


def deploy(ip_address_node,port_node,branch,deployItem,env_key) 
{ 
    def integrationServer = deployItem.integrationServer 
    def app = deployItem.app 
    def barFile = deployItem.barFile 

    if(barFile == null) 
    { 
     return; 
    } 

    println("Triggering Build -> ESB App = " + app + ", Branch = " 
      + branch + ", Barfile: " + barFile + ", Integration Server = " + integrationServer + ", IP Address: " + ip_address_node 
      + ", Port: " + port_node + ", Env_Key: " + env_key) 

    build_closure = { -> 
     build("esb_deploybar", 
         ip_address_node: ip_address_node, port_node: port_node, 
         integrationServer: integrationServer, branch: branch, app: app, barFile: barFile, env_key: env_key) 
    } 

    return build_closure 
} 

def deployCSVItemsInParallel(ip_address_node,port_node,branch,env_key,csvItems) 
{ 
    def build_closures = [] 
    iterator = csvItems.iterator() 
    while (iterator.hasNext()) 
    { 
     barDeploy = iterator.next() 
     def build_closure = deploy(ip_address_node,port_node,branch,barDeploy,env_key) 

     if(build_closure != null) 
     { 
      build_closures.add(build_closure) 
     } 
    } 

    if(build_closures?.size() > 0) 
    { 
     parallel(build_closures) 
    } 
} 
+0

Lütfen jenkinsfile –

+0

'un ilgili bölümünü yükleyin Kullanılan tüm kaynak kodları ekledim. – CodyK

cevap

1

(bu bir boru hattı çalıştırmak için çalışıyor, eski buildflow dan), Jenkinsfile gibi, git ile Jenkins dosyasındaki aynı klasöre getirilecek. Yani kullandığınız komut, Tamam çalışmalıdır.

Bazı hatalar alıyor musunuz? Lütfen daha fazla bilgi verin.

DÜZENLEME: şimdi Jenkins dosyanızda ne olduğunu görebiliyorum, groovy betiğinin bulunduğu tümleştirme_bus adlı bir git projesini incelediğinizi görebiliyorum. Sonra bu

gibi esb_deploy klasöründe harika senaryoyu başvurmak gerekir

checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'esb_deploy']], submoduleCfg: [], userRemoteConfigs: [[url: 'ssh://[email protected]/integration_bus.git']]]) 

Eğer

git branch: branch, url: 'ssh://[email protected]/integration_bus.git' 

ne aksine: Bunu böyle teslim edilir konum belirtebilirsiniz

load 'esb_deploy/esb_deploybar_pipeline/deploy_esb.groovy' 
+0

Komut dosyası, çalışma alanı dizini yerine çalışma alanı dizininden yüklenir; – CodyK

+0

Mükemmel dosya aslında farklı bir depoda bulunur. Jenkinsfile ile aynı depoda bulunur. '…/[email protected]/esb_deploybar_pipeline/deploy_esb.groovy' gibi bir dosyayı referans alarak çalışmam gerekiyor. Başka sorunlar yaşıyorum ama bunlar farklı problemler. Teşekkürler – CodyK

+0

Bu hala biraz hacky hissediyor, değil mi? Yüce yardımcınızın gitmesi için bir yardımcı programa ekleyerek ilgili projelere bir alt modül olarak eklemeye ne dersiniz? – sebkraemer

0

sadece Jenkinsfile tüm dosya işlemlerikullanarak varsayılan çalışma alanı olan (geçerli çalışma göredir varsayabiliriz Bir node içinde). Hedef dosyası (deploy_esb.groovy diyelim ki) sizin SCM klasörün foo içinde olup olmadığını

Yani, bu ek yapılandırma olmadan çalışması gerekir:

git branch: branch, url: 'ssh://[email protected]/integration_bus.git' 
load 'foo/deploy_esb.groovy' 

Ya da bu yüklemek için dosya daha aynı depoda ise Jenkinsfile: deploy_esb.groovy dosya Jenkinsfile aynı SCM kaydedilmiş ise

checkout scm 
load 'foo/deploy_esb.groovy' 
+0

Sorun, grothy dosyası jenkinsfile ile aynı depoda bulunuyordu. Git klonunu görmezden gel, bunun dışında değil. Ben jenkins dosyasını kopyalayıp yapıştırdığımda ekledim. Ama jenkins dosyasını SCM'den yükledim, bu yüzden bir çalışma alanı @ komut dizini oluşturur. Bunu kullanmıştım: '../[email protected]/deploy_esb.groovy' komut dosyasını yükleyin – CodyK

+0

Sonra kullan: 'checkout scm' sonra' load' adımı. – amuniz

+2

Biliyorum, Kodu iki kez kontrol etmek için biraz gereksiz görünüyordu. – CodyK

9

yapabileceğiniz:

node {  
    def workspace = pwd() 
    load "${workspace}@script/esb_deploybar_pipeline/deploy_esb.groovy" 
} 
+3

İş, paralel olarak çalıştırılabildiğinde başarısız olur. Çünkü Jenkins, "jobname @ 2" ve "jobname @ 3" gibi çalışma alanları oluşturur, ancak 'jobname @ script' işlevini yeniden kullanır. – kadrach

7

Kimseden bahsetmediğim bir senaryo var.İşin, ana ana yerine bir Jenkins aracı/bağımlı üzerinde çalışması gerektiğinde Groovy komut dosyalarını yükleme şeklidir.

Master, SCM, 'dan Jenkins boru hattı projesini denetleyen ana olduğundan, Groovy komut dosyaları yalnızca master'ın dosya sisteminde bulunur. süre Yani bu çalışacaktır: SCM gelen boru hattı klonlar düğüm içinde harika komut dosyalarını yüklemeye çalışır aynı biridir çünkü

node {  
    def workspace = pwd() 
    def Bar = load "${workspace}@script/Bar.groovy" 
    Bar.doSomething() 
} 

Sadece mutlu bir tesadüf. Ancak, sadece üzerinde yürütmek için farklı bir ajanın adını ekleyerek:

java.io.IOException: java.io.FileNotFoundException: /Jenkins/workspace/[email protected]/Bar.groovy (No such file or directory) 

Bu bu yolu çünkü:

/Jenkins/workspace/[email protected]/ 

Sadece bulunduğunu

node("agent1"){ 
    def workspace = pwd() 
    def Bar = load "${workspace}@script/Bar.groovy" 
    Bar.doSomething() 
} 

sonuçlanan başarısız olacak Ana Jenkins kutusu. agent1 çalıştıran kutuda değil. Yani

bu sorunu karşı karşıya iseniz, küresel değişkenleri ilan içine ustadan harika komut dosyaları yüklemeye emin olun, bu nedenle ajan sonra bunları kullanabilirsiniz:

def Bar 
node {  
    def workspace = pwd() 
    if(isUnix()){ 
     Bar = load "${workspace}@script/Bar.groovy" 
    } 
    else{ 
     Bar = load("..\\[email protected]\\Bar.groovy") 
    } 
} 
node("agent1"){ 
    Bar.doSomething() 
} 

Not:değişkeni Modül düğümleri arasında geçiş için kullanılan,düğüm blokları dışında bildirilmelidir.

+1

Burada bir satır var, ana düğümdeki yürütücülerin sayısı sıfır olarak ayarlanmışsa. Bu durumda, 'load''un sizin yüce dosyanızı bulma yolunun olmadığı görülmektedir. –

+0

Haklısınız @HaroldPutman. Bu durumda, ileriye bakmamın tek yolu, kodları (Jenkinsfile ve Groovy) için yine de düğüm ("agent1") bloğu içinden yeniden kopyalamak için bir git adımı kullanmak olacaktır.Komut dosyalarını iki kez klonlamak zorunda olmak bir israftır (Ustadan ve sonra da ajandan), ancak ustanın izin vermediği bir ortam tarafından zorlanacaksınız. – Mig82

İlgili konular