Как я могу использовать различные частные агенты докера, основанные на параметре в декларативном конвейере Jenkins? - PullRequest
2 голосов
/ 20 марта 2019

Я пытаюсь выбрать другой агент Docker из реестра частных контейнеров на основе параметра в конвейере Jenkins. Для моего примера, скажем, у меня есть «credsProd» и «credsTest» сохраненные в хранилище учетных данных. Моя попытка заключается в следующем:

pipeline {
    parameters {
        choice(
            name: 'registrySelection', 
            choices: ['TEST', 'PROD'],
            description: 'Is this a deployment to STAGING or PRODUCTION environment?'
        )
    }
    environment {
        URL_VAR = "${env.registrySelection == "PROD" ? "urlProd.azure.io" : "urlTest.azure.io"}"
        CREDS_VAR = "${env.registrySelection == "PROD" ? "credsProd" : "credsTest"}"
    }
    agent {
        docker {
            image "${env.URL_VAR}/image:tag"
            registryUrl "https://${env.URL_VAR}"
            registryCredentialsId "${env.CREDS_VAR}"
        }
    }
  stages{
      stage('test'){
          steps{
            echo "${env.URL_VAR}"
            echo "${env.CREDS_VAR}"
          }
      }
  }
}

Я получаю ошибку: Error response from daemon: Get https://null/v2/: dial tcp: lookup null on

Если я жестко закодирую RegistryUrl, я получаю аналогичную проблему с registryCredentialsId:

agent {
    docker {
        image "${env.URL_VAR}/image:tag"
        registryUrl "https://urlTest.azure.io"
        registryCredentialsId "${env.CREDS_VAR}"
    }
}

ERROR: Could not find credentials matching null

Успешно, если я жестко закодирую и RegistryUrl, и RegistryCredentialsId.

agent {
    docker {
        image "${env.URL_VAR}/image:tag"
        registryUrl "https://urlTest.azure.io"
        registryCredentialsId "credsTest"
    }
}

Похоже, что этап входа в докер agent{docker{}} не может получить доступ / разрешить переменные среды.

Есть ли способ обойти это, не включая дублирование кода? Я управляю изменениями с помощью многоотраслевого конвейера, поэтому в идеале не нужно иметь отдельные файлы Prod и test groovy или разные наборы последовательных шагов в одном файле.

1 Ответ

2 голосов
/ 21 марта 2019

Попробуйте запустить сценарий конвейера перед декларативным:

URL_VAR = null
CREDS_VAR = null

node('master') {
    stage('Choose') {
        URL_VAR = params.registrySelection == "PROD" ? "urlProd.azure.io" : "urlTest.azure.io"
        CREDS_VAR = params.registrySelection == "PROD" ? "credsProd" : "credsTest"
    }
}


pipeline {
    agent {
        docker {
            image "${URL_VAR}/image:tag"
            registryUrl "https://${URL_VAR}"
            registryCredentialsId "${CREDS_VAR}"
        }
    }
...

В качестве альтернативы, вы можете определить два этапа (с жестко запрограммированными URL-адресами и кредитами), но запустить только один из них, используя when в обоих случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...