Я нахожусь в одном шаге от возможности заменить множество настроенных файлов 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
}
Я признаю, что это больше похоже на взлом ...