19

У меня есть отличный файл, я хочу бежать из файла Jenkins.Как я могу ссылаться на каталог Jenkinsfile с Pipeline?

ie. load script.groovy

Однако я не уверен, как я могу ссылаться на этот файл, если он хранится в том же каталоге, что и файл Jenkins. Я загружаю файл Jenkins из git. Я заметил, что он создает папку с именем [email protected]. Он не помещает это в каталог рабочей области. Я мог бы жестко скопировать папку, но я не уверен в правилах по этому поводу, и кажется немного лишним проверить код снова.

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

По умолчанию он загружает из рабочей области, а не [email protected]

Я пытаюсь преобразовать сценарий BuildFlow к (Workflow) сценария трубопровода. Но я нахожу, что это не так просто, как копировать и вставлять.

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 (это от старого buildflow, пытаясь бежать в трубопроводе)

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

Пожалуйста, разместите соответствующий раздел вашего файла jenkins –

+0

. Я включил весь используемый исходный код. – CodyK

ответ

1

если script.groovy файл находится в корневом каталоге вашего проекта, как Jenkinsfile, он будет извлечен из git в ту же папку, что и ваш Jenkinsfile. Таким образом, команда, которую вы используете, должна работать нормально.

Вы получаете ошибку? Если да, укажите более подробную информацию.

EDIT: теперь я могу видеть, что находится в вашем файле Jenkins, я вижу, что вы просматриваете проект git, называемый integration_bus, где находится строгий скрипт. Вы можете указать место, где что проверили, как это:

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

в отличие от того, что у вас есть

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

Тогда вы должны быть в состоянии ссылаться на заводной скрипт в папке esb_deploy как это

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

Скрипт загружается из каталога рабочей области, а не из сценария рабочей области @, который не является большой сделкой, но скорее id, а не hardcode этого пути. – CodyK

+0

Файл groovy фактически расположен в другом хранилище. Он находится в том же хранилище, что и Jenkinsfile. Я получил его для работы, ссылаясь на файл, как на эту загрузку. ../[email protected]/esb_deploybar_pipeline/deploy_esb.groovy. У меня другие проблемы, но это разные проблемы. Спасибо – CodyK

+0

Это все еще немного взломанно, не так ли? Как насчет добавления вашего groovy helper script в git repo, который вы затем добавляете в соответствующие проекты в качестве подмодуля? – sebkraemer

0

Вы можете просто предположить, что все операции с файлами в Jenkinsfile относятся к текущей рабочей области (которая является рабочим местом по умолчанию при использовании load внутри node).

Так что, если целевой файл (скажем deploy_esb.groovy) находится внутри папки foo в вашем SCM, это должно работать без дополнительной настройки:

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

Или это, если файл для загрузки находится в том же хранилище, чем Jenkinsfile:

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

Проблема была в том, что файл groovy находится в том же хранилище, что и файл jenkins. Игнорируйте этот клон git, который не отделен от него. Я просто включил, когда копировал и вставлял файл jenkins. Но я загружаю файл jenkins из SCM, поэтому он создает каталог рабочего пространства @ script. Я просто использовал это: '../[email protected]/deploy_esb.groovy' t загрузить скрипт – CodyK

+0

Затем используйте: 'checkout scm', а затем шаг' load'. – amuniz

+2

Я знаю, это просто показалось немного лишним, чтобы дважды проверять код. – CodyK

9

Если deploy_esb.groovy файл хранится в той же SCM как Jenkinsfile вы можете сделать:

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

Это не сработает, если задание можно выполнить параллельно, так как Дженкинс создаст рабочие пространства, такие как 'jobname @ 2' и' jobname @ 3', но повторно используйте 'jobname @ script'. – kadrach

7

Существует один сценарий, который я не видел никого.Как загрузить сценарии Groovy, когда задание должно работать на Jenkins agent/slave, а не на мастер.

Поскольку мастер - это тот, который проверяет проект трубопровода Дженкинса от SCM, , скрипты Groovy находятся только в файловой системе мастера. Таким образом, в то время как это будет работать:

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

Это только счастливое совпадение, потому что узел, который клонирует трубопровод от SCM является тем же, что пытается загрузить заводные скрипты в нем. Однако, просто добавив имя другого агента для выполнения на:

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

потерпит неудачу, в результате чего:

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

Это происходит потому, что этот путь:

/Jenkins/workspace/[email protected]/ 

только существует на мастер Дженкинс. Не в поле работает agent1.

Так что, если вы столкнулись с этой проблемой, убедитесь, чтобы загрузить заводные скрипты от мастера в глобально объявленных переменных, поэтому агент может затем использовать их:

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() 
} 

Примечание: В переменных, используемый для передачи модуля между узлами, должен быть объявлен за пределамиузел блоки.

+1

Один из них: если количество исполнителей на главном узле установлено равным нулю. В этом случае кажется, что 'load' не имеет возможности найти ваш отличный файл. –

+0

Вы правы @HaroldPutman. В этом случае единственным способом, который я вижу в будущем, будет использование git-шага для клонирования репозитория для скриптов (Jenkinsfile и Groovy) еще раз из блока узла («агент1»).Это пустая трата времени для клонирования сценариев дважды (от мастера, а затем от агента), но вы должны быть вынуждены к нему в среде, где исполнителям не разрешалось выполнять мастер. – Mig82

Смежные вопросы