Относительно недавно начал заниматься DevOps. Встала банальная задача – в параметризированной джобе запоминать последние введенные разработчиками или тестерами значения (версия и тэг приложения). Плагинов для расширенной параметризации предостаточно: Active Choices Plugin, Extended Choice Parameter plugin, Extensible 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]
На абсолютную правильность и оригинальность как обычно не претендую :)