Переменная среды Jenkinsfile из общей библиотеки не работает

У меня есть проект Bitbucket с растущим числом репозиториев, в каждом из которых есть Jenkinsfile, который извлекает один и тот же образ докера для проверки файла, отправленного в Bitbucket.

Проблема в том, что по какой-то причине я не могу использовать «последний» тег в своем образе докера, поэтому каждый файл имеет изображение докера с номером версии.

Чтобы обойти эту проблему, я нашел эту статью, в которой общая библиотека используется для возврата значения для установки переменной среды, которая будет использоваться в команде «image» в моем файле Jenkins. Однако при запуске моего конвейера номер версии, используемый в моем образе докера, отображается как нулевой. Значит, что-то не работает, и я не знаю, что именно.

Это верхняя часть моего файла Jenkins:

@Library(['toolbox','library']) _
pipeline {
    environment {
        IMAGE_VERSION = getImageVersion()
    }
    agent {
        docker {
            image "dockerhub.mycompany.net/docker-repo/validator:${env.IMAGE_VERSION}"
            args '-u root -v /var/run/docker.sock:/var/run/docker.sock'
        }
    }

Это каталог vars моей «библиотеки» (это общая библиотека на уровне папки)

getImageVersion.groovy:

Защитный вызов() { вернуть '1.0.25' }

Но при запуске конвейера я вижу такой вывод:

`

  • докер проверить -f. dockerhub.mycompany.net/docker-repo/validator:null

Ошибка: такого объекта нет: dockerhub.mycompany.net/docker-repo/validator:null `

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

Кто-нибудь имеет представление о проблеме?

"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
0
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не существует четко определенного порядка, в котором различные разделы и директивы оцениваются в декларативном конвейере, поэтому я думаю, вы обнаружили, что agent оценивается раньше environment. Возможно, есть более «декларативное» решение, но это должно работать:

@Library(['toolbox','library']) _
def imageVersion = getImageVersion()
pipeline {
    agent {
        docker {
            image "dockerhub.mycompany.net/docker-repo/validator:${imageVersion}"
            args '-u root -v /var/run/docker.sock:/var/run/docker.sock'
        }
    }

Великолепно! Это работает приятно. Я новичок в использовании Jenkins, но спасибо за информацию о порядке оценки. Большое спасибо.

RonV 10.05.2024 07:25

Другие вопросы по теме