Переменная имени изображения не работает на всех этапах декларативного конвейера Дженкинса

#groovy #jenkins-pipeline #jenkins-groovy #jenkins-declarative-pipeline

Вопрос:

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

например:

  pipeline {
    agent any
    environment {
        JAVA_HOME="/usr/lib/jvm/java-11-openjdk-11.0.11.0.9-1.el7_9.x86_64"
        M2_HOME="/opt/tools/maven"
        PATH="${JAVA_HOME}/bin:${M2_HOME}/bin:$PATH"
        IMAGE_NAME = "us.gcr.io/myproject/myimage"
 

Здесь я использую переменную IMAGE_NAME, поэтому я могу вызывать эту переменную на разных этапах сценария. Ниже вы увидите часть сценария

 stage('Build DockerImage for Pathla Backend') {
            steps {
                
                echo "Build DockerImage of Pathla Backend"
                
                sh '''        
                   
                    d=`date  %Y%m%d%H%M`
                    build_version=${d}-v${BUILD_NUMBER}
                    pwd
                    cd mlp
                    cd pathla/pathla-service
                    cp -r /etc/mlp/./*.pem  src/main/resources/METINF/resources/
                    mvn -e clean install -DskipTests=true -Dquarkus.container-image.build=true
                    IMAGE_PATH="${IMAGE_NAME}:${build_version}"
                    docker tag us.gcr.io/myproject/myimage $IMAGE_PATH
                    echo "Docker image to Push:: $IMAGE_PATH"
                    echo "Once pushed run this command:: docker rmi $IMAGE_PATH"
                    " 

                '''
            }
        }
 

Теперь, если вы видите эту строку «IMAGE_PATH=»${ИМЯ_ОБРАЗА}:${build_version}» в приведенном выше сценарии, мы используем IMAGE_PATH в качестве переменной 1 (для указания имени изображения) и build_version (для указания версии сборки изображения).

мы вызываем ту же переменную (IMAGE_PATH) в приведенном ниже сценарии для сканирования изображения с помощью облачного сканера PRISMA, но это не работает.

 "stage('Scan via PrismaCloud for vulnerabilities of Pathla Backend') {
          steps {
            script {
               withCredentials([
               usernamePassword(credentialsId: 'mycluster',
                usernameVariable: 'username',
                passwordVariable: 'password')
                ])  
              
           {
            sh '''
                   
                   imagename=${IMAGE_PATH}
                   /opt/mlp/twistcli images scan -u $username -p $password --details --address https://10.XXX.XXX.XXX:8083 ${imagename}
> /bdnfs/pipelines/scan-out-details-backend.txt
 

если вы проверите указанную выше переменную «${imagename}», она должна вызвать переменную «IMAGE_PATH», но она ее не вызывает и не получает результатов. А также, когда я создаю это задание и запускаю его, я получаю следующую ошибку из журналов:

   imagename=
  /opt/mlp/twistcli images scan -u **** -p **** --details --address https://10.XXX.XXX.XXX:8083
**"missing image ID"**
 

Я хочу, чтобы это изображение us.gcr.io/myproject/myimage было преобразовано в переменную, а затем мы вызываем эту переменную на любом этапе этого сценария конвейера.

Комментарии:

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

2. Вы не можете повторно использовать переменную в оболочке, которая была установлена в другой оболочке… Создайте var IMAGE_PATH внутри блока среды…

3. @daggett я попытался создать путь к изображению внутри блока среды, но проблема в том, что я получаю только имя изображения «us.gcr.io/big-data-poc-216405/pathla-service-prod» и изображение должно сопровождаться датой и прикрепленной к нему версией. Что-то в этом роде: «us.gcr.io/big-data-poc-216405/pathshala-service-prod:$build_version»

4. Может ли кто-нибудь помочь мне с этим вопросом, пожалуйста.

5. Вы настраиваете IMAGE_PATH один из sh сценариев, а затем, на другой сцене, пытаетесь сослаться на это… это, вероятно, никогда не сработает. Если вы хотите sh , чтобы скрипт «связывался» с другим, который запускается после него, возможно, сохраните переменную в файле, а затем прочитайте ее.