Назад | Перейти на главную страницу

Скрипт конвейера Jenkins - осознайте себя - нужен каталог Jenkinsfile

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

Я просмотрел несколько идей в отличном коде, но не смог найти, как это получить.

Для тех, кому нужно увидеть что-то конкретное, файл Jenkins вверху выглядит так:

#!/usr/bin/env groovy
pipeline {
  agent any
  environment {
    tf='/var/lib/jenkins/tools/terraform0108/terraform'
    dir='clients/xyz/us-east-1/dev'
}

Эта переменная реж назначается местоположению этого Jenkinsfile. dir доступен позже в коде groovy. Я хочу иметь возможность опустить это назначение и просто выбрать этот каталог из контекста выполняющегося скрипта.

Я пробовал несколько разных вещей, например, шаги, содержащие

script {
    println __FILE__
}

и

script { 
    scriptDir = new File(getClass().protectionDomain.codeSource.location.path).parent
    println scriptDir
}

Ни один из них не запустился (дал несуществующую переменную в ФАЙЛ случай и нарушение разрешения во втором случае). Я пробовал "$ {ФАЙЛ} "и другие варианты.

Мне нужно использовать каталог в блоке step - sh, поэтому я считаю, что он должен быть в элементе среды.

Теперь конфигурация задания Jenkins дает путь к файлу Jenkins, но я не хочу повторять это для создания другой переменной среды на этом уровне.

Уже консультировались:

Помощь приветствуется.

Есть много способов сделать это. Вот два способа, о которых я могу придумать:

steps {
  println(WORKSPACE)
}

или

steps {
  def foo = sh(script: 'pwd', returnStdout: true)
  println(foo)
}

Вы спрашиваете о конвейерах, а не о JobDSL, но, надеюсь, это поможет / применимо:

В моих посевных работах DSL я использую:

// Boilerplate
def dslWorkspacePath = new File(__FILE__).parent
evaluate(new File("${dslWorkspacePath}/scaffolding.groovy"))

чтобы определить путь к начальному заданию, которое в настоящее время обрабатывается JobDSL, а затем запустить некоторый установочный код.

Мои исходные задания находятся не в корне репозитория, который клонируется, а скорее в чем-то вроде /src/main/groovy/jobdsl/

В моем MultiBranchPipeline я достиг цели, используя этот код общей библиотеки:

#!groovy
import jenkins.model.Jenkins

String call() {
    String thisMultiBranchProjectName = JOB_NAME.split('/')[0]
    def thisMultiBranchProject = Jenkins.getInstance().getItemByFullName(thisMultiBranchProjectName)
    def thisBranchProjectFactory = thisMultiBranchProject.getProjectFactory()
    String thisStringPath = thisBranchProjectFactory.getScriptPath()

    return thisStringPath
}

Я признаю, что это больше похоже на взлом ...