Jenkins logo

Относительно недавно начал заниматься DevOps. Встала банальная задача – в параметризированной джобе запоминать последние введенные разработчиками или тестерами значения (версия и тэг приложения). Плагинов для расширенной параметризации предостаточно: Active Choices PluginExtended Choice Parameter pluginExtensible Choice Parameter plugin и другие. Выбор пал на Extended Choice Parameter plugin.

По использованию вопросов возникнуть не должно – все предельно понятно. Помечаем что билд параметризирован (если еще не помечен) и добавляем Extended Choice Parameter. Указываем имя параметра, описание и тип. По заданному имени он будет доступен в пайплайне. Тип мне подошел Text Box – обычное поле для ввода текста, т.к. версия в формате 'v0.0.0'. Единственное что осталось определить – это тип дефолтного значения. В поле Choose Source for Default Value выбираем Default Groovy Script. Осталось написать скрипт который будет возвращать значение.

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

Нагуглить вариант решения оказалось не просто. Например вопрос на Stack Overflow с ответом от автора (?) плагина предлагает следующий код:

Map<String, String> props = System.getenv();
def currentDir = props.get('WORKSPACE');

Но такой переменной окружения не оказалось. Зато в итоге выяснилось что инстанс Jenkins'a получить все же можно:

jenkins.model.Jenkins.instance

Получить имя текущей джобы тоже оказалось возможно, хоть и решение 'a bit hacky'. Итоговый код получился следующий:

def get_job_name() {
    def build = Thread.currentThread().toString()
    def regexp= ".+?/job/([^/]+)/.*"
    def match = build  =~ regexp
    return match[0][1]
}
def version = jenkins.model.Jenkins.instance.getItem(get_job_name()).lastBuild.getEnvVars()['VERSION']
return [version]

На абсолютную правильность и оригинальность как обычно не претендую :)