Подтвердить что ты не робот

Как я могу ссылаться на каталог Jenkinsfile с Pipeline?

У меня есть файл groovy, я хочу запустить из файла Jenkins.

т. 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 script в Pipeline (Workflow) script. Но я нахожу, что это не так просто, как копировать и вставлять.

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)
    }
}
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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]/

Только в окне мастера Дженкинса. Не в поле работает агент1.

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

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

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

Ответ 3

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

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

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

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'

Затем вы должны иметь возможность ссылаться на groovy script в папке esb_deploy, например,

load 'esb_deploy/esb_deploybar_pipeline/deploy_esb.groovy'

Ответ 4

Вы можете просто предположить, что все операции с файлами в Jenkinsfile относятся к текущему рабочему пространству (которое является рабочим пространством по умолчанию при использовании load внутри a 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'

Ответ 5

Это должно работать

load "${WORKSPACE}/../${JOB_NAME}@script/esb_deploy/esb_deploybar_pipeline/deploy_esb.groovy"

Ответ 6

Имела та же проблема. Завершена операция дополнительного клонирования, чтобы получить копию сценария repo в каталоге рабочего пространства, чтобы я мог надежно получить доступ к файлам groovy:

dir ('SCRIPTS_DIR') {
    checkout scm
    commonScripts = load 'subdir/Common.groovy' // no def, so script is global
}

Ответ 7

../${JOB_BASE_NAME}@script/Bar.groovy

должно сработать