Как добавить условие if в раздел среды jenkinsFile

#jenkins #jenkins-pipeline

#дженкинс #дженкинс-конвейер

Вопрос:

Я пишу сценарий jenkins, в котором мне нужно инициализировать среду на основе параметра (QA / Prod). Ниже приведен сценарий, который я написал:

 def serverName = ${ServerName} // I get this value from the parametrized job value.
pipeline {
    agent any

    agent any
    tools {
        terraform 'Terraform'
    }
    environment {
        AWS_ACCESS_KEY_ID = ""
        AWS_SECRET_ACCESS_KEY = ""
    }
    stages {
        stage('Set Environment') {
            steps {
                echo "Region is ${AWS_DEFAULT_REGION}"
                echo "Server Name is: " params.ServerName
                script{
                    if ("QA" == params.ServerName){
                        withEnv(['AWS_ACCESS_KEY_ID=' credentials ('AWS_ACCESS_KEY_ID_QA')], ['AWS_SECRET_ACCESS_KEY=' credentials ('AWS_SECRET_ACCESS_KEY_QA')]){
                            echo "Key is ${AWS_SECRET_ACCESS_KEY}"
                            echo "Key is ${AWS_SECRET_ACCESS_KEY}"
                        }
                    }
                    if ("PROD" == params.ServerName){
                        withEnv(["AWS_ACCESS_KEY_ID=credentials('AWS_ACCESS_KEY_ID_PROD')"], ["AWS_SECRET_ACCESS_KEY=credentials('AWS_SECRET_ACCESS_KEY_PROD')"]){
                            echo "Key is ${AWS_SECRET_ACCESS_KEY}"
                            echo "Key is ${AWS_SECRET_ACCESS_KEY}"
                        }
                    }
                }
            }
        }
  

Я получаю следующую ошибку:

00:59:22 java.lang.Исключение IllegalArgumentException: ожидаемые именованные аргументы, но получены [[AWS_ACCESS_KEY_ID=@credentials(=AWS_ACCESS_KEY_ID_QA)], [AWS_SECRET_ACCESS_KEY=@credentials(=AWS_SECRET_ACCESS_KEY_QA)]] 00:59:22 в org.jenkinsci.plugins.workflow.cps.DSL.parseArgs(DSL.java:588) 00:59:22 в org.jenkinsci.plugins.workflow.cps.DSL.parseArgs(DSL.java:521) 00:59:22 в org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:220) 00:59:22 в org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:179) 00:59:22 в org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)

Ответ №1:

Попробуйте

 pipeline {
    environment {
            AWS_ACCESS_KEY_ID = GET_AWS_ACCESS_KEY_ID(env.serverName)
            AWS_SECRET_ACCESS_KEY = GET_AWS_SECRET_ACCESS_KEY(env.serverName)
    }
    
    //your rest of the pipeline code
}
def GET_AWS_ACCESS_KEY_ID(Server_Name) {
    if("QA".equals(Server_Name)) {
        return credentials ('AWS_ACCESS_KEY_ID_QA');
    } else if ("PROD".equals(Server_Name)) {
        return credentials ('AWS_ACCESS_KEY_ID_PROD');
    } else {
        return 0;
    }
}
def GET_AWS_SECRET_ACCESS_KEY(Server_Name) {
    if("QA".equals(Server_Name)) {
        return credentials ('AWS_SECRET_ACCESS_KEY_QA');
    } else if ("PROD".equals(Server_Name)) {
        return credentials ('AWS_SECRET_ACCESS_KEY_PROD');
    } else {
        return 0;
    }
}
  

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

1. Получение этого: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 00:49:09 WorkflowScript: 9: Not a valid section definition: "if ("QA" == params.ServerName){ 00:49:09 echo "Server is ${serverName}" 00:49:09 environment { 00:49:09 AWS_ACCESS_KEY_ID = credentials ('AWS_ACCESS_KEY_ID_QA') 00:49:09 AWS_SECRET_ACCESS_KEY = credentials('AWS_SECRET_ACCESS_KEY_QA') 00:49:09 } 00:49:09 }". Some extra configuration is required. @ line 9, column 9.

2. будет ли переменная ServerName иметь значение QA или PROD ? и задано ли имя_сервера как переменная env ?

3. Да, имя сервера будет иметь значение QA или PROD. Это параметризованное задание, и значение будет приходить динамически. Я также попробовал params.ServerName и повторил значение. Значение приходит нормально.

4. Я также обновил сообщение с обновленным сценарием и ошибкой.

5. Обновлен ответ. Предполагая, что вы выполняете параметризованную сборку