2017-01-12 2 views
1

Я создаю работу трубопровода jenkins, чтобы посеять задания, используя плагин dzl для работы с jenkins. Как получить путь рабочей области внутри файла dsl? код Дженкинс трубопровод как таковойКак получить путь рабочей области в задании dsl внутри конвейера?

#!groovy 
node{ 
    stage("build jobs"){ 
     ws{ 
       git poll: true, credentialsId: 'xxxxx', url: 'ssh://[email protected]:/xxx/xxx-xxxx-xxxxx.git' 
       checkout scm 
       jobDsl(removedJobAction: 'DISABLE', removedViewAction: 'DELETE', targets: 'jobs/*.groovy', unstableOnDeprecation: true) 
      } 
    } 
} 

и DSL-код, который не удается это:

hudson.FilePath workspace = hudson.model.Executor.currentExecutor().getCurrentWorkspace() 

с ошибкой

Processing DSL script pipeline.groovy 
java.lang.NullPointerException: Cannot invoke method getCurrentWorkspace() on null object 
    at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:35) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117) 
    at pipeline.run(pipeline.groovy:1) 
    at pipeline$run.call(Unknown Source) 

Переменные, создаваемые в зоне трубопровода не, доступные внутри задания dsl step

+0

Возможный дубликат [Как получить текущее рабочее пространство с помощью Jenkins Pipeline Groovy скрипт?] (Http://stackoverflow.com/questions/37846028/how-to-retrieve-current-workspace-using-jenkins-pipe-groovy-script) – StephenKing

+0

Возможный дубликат [Получить абсолютный путь к каталогу рабочей области в плагине Jenkins Pipeline] (http: // stackoverflow.com/questions/36934028/get-absolute-path-to-workspace-directory-in-jenkins-pipe-plugin) –

ответ

1

Вы можете использовать __FILE__ переменной в сценарии DSL задания, чтобы получить путь к текущему сценарию. Возможно, вы можете использовать это для получения каталога рабочего пространства. См. Script Location.

def scriptDir = new File(__FILE__).parent.absolutePath 
+0

Спасибо, что заставило меня двигаться в правильном направлении, но у него есть ограничение только на возможность использовать мастер узел. к сожалению, создание на хозяине не допускается в организации, в которой я работаю. – graeme

+0

Вы должны открыть новый вопрос, описывающий проблему, которую вы хотите решить. Получение пути только кажется частью головоломки. Возможно, есть другое решение. – daspilker

+0

Я сделаю это – graeme

2

Я наткнулся на это, потому что, похоже, нет хорошего пути. Вот как я это делаю:

node { 
    stage('test') { 
     sh 'pwd > workspace.txt' 
     jobDsl scriptText: ''' 
      String workspace = readFileFromWorkspace('workspace.txt').trim() 
      def file = new File(workspace, 'test.txt') 
      file.append('It worked!')''' 
    } 
} 

Так первый захват рабочего пространства в сценарии трубопровода, а затем передать его на работу DSL. Если у вас есть больше, чем просто переменная рабочего пространства, что вам нужно в вашем сценарии, которые я предлагаю передачи через файл свойств:

node { 
    stage('test') { 
     sh 'echo "workspace="$(pwd) > build.properties' 
     jobDsl scriptText: ''' 
      Properties props = new Properties(); 
      props.load(streamFileFromWorkspace('build.properties')) 
      def file = new File(props.getProperty('workspace'), 'test.txt') 
      file.append('It worked!')''' 
    } 
} 
0

Это может быть достигнуто с помощью SEED_JOB переменной:

String workspacePath = SEED_JOB.lastBuild.checkouts[0].workspace 

Он описан в project's wiki:

Доступ к заданию на семена осуществляется через переменную SEED_JOB. Переменная содержит ссылку на внутренний объект Jenkins, который представляет начальное задание. Фактический тип объекта зависит от типа задания , выполняющего DSL. Для проекта фристайла объект является экземпляром hudson.model.FreeStyleProject. Подробную информацию см. В документации Jenkins API .

Переменная SEED_JOB доступна только в скриптах, а не в любых классах , используемых сценарием. И он доступен только при работе в Jenkins, , например. в шаге «Обработка заданий DSL».

В следующем примере показано, как применять тот же тихий период для заданного задания , что и для задания на семена.

работа ('пример') { quietPeriod (SEED_JOB.quietPeriod)}

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