В блоке сценариев декларативного Jenkins, как я должен ссылаться на переменную при выполнении команды? - PullRequest
0 голосов
/ 16 января 2019

Я использую декларативный конвейер Jenkins для безсерверного приложения. Попытка абстрагировать логику путем создания функций. Но я застрял при обращении к переменной функции 'имя_стека' при выполнении команды 'sam deploy --template-file packaged.yaml --stack-name stackname'.

Ниже приведена TLDR-версия моего кода:

    stages {
        stage('Deploy') {
            steps {
                echo '[STAGE] Deploying...'
                //switch to each lambda sub-folder as working directory
                dir ("${env.WORKSPACE}") {
                    deployAllProject("my-test-stack")
                }
            }
        }
    }

/*
 * Deploy lambda functions
*/
void deployAllProject(stackname){
    sh 'sam package  --output-template-file packaged.yaml --s3-bucket my-lambda-midway'
    sh 'sam deploy --template-file packaged.yaml --stack-name stackname'
}

Я пытался изменить синтаксис переменной, например. $ stackname, $ {stackname}, также пытался заключить в блок Script. Вот более полная версия кода:

def LAMBDA_BUILD_LIST = "dailybackup-ebs-volumes,dailybackup-ebs-volumes-test"
def CLOUDFORMATION_STACK = "DEVOPS-serverless-apps"
def LAMBDAS

pipeline {

    agent {
        node {
            label 'docker'
        }
    }

    stages {
        //checkout scm in defined through Jenkins console

        stage('Init'){
            steps {
                echo "[STAGE] Init..."

                script {

                    // init variables
                    LAMBDAS = splitStringWithComma(LAMBDA_BUILD_LIST)

                    // check lambda sub-folders exist
                    for(String lambda: LAMBDAS) {
                        def var_lambda_dir = "${env.WORKSPACE}/${lambda}"
                        if (!fileExists(var_lambda_dir)) {
                            println("[WARNING]"+ var_lambda_dir +" does not exist.")
                        }
                    }
                }
            }
        }
        stage('Build') {
            steps {
                echo '[STAGE] Building...'

                script {
                    for(String lambda: LAMBDAS) {
                        println("lambda is:"+lambda)
                        def var_lambda_dir = "${env.WORKSPACE}/${lambda}"

                        //switch to each lambda sub-folder as working directory 
                        dir (var_lambda_dir) {
                            buildNodejsProject()
                        }
                    }
                }
            }
        }
        stage('Deploy') {
            steps {
                echo '[STAGE] Deploying...'
                //switch to each lambda sub-folder as working directory
                dir ("${env.WORKSPACE}") {
                    //TODO change hardcoded to variable 'CLOUDFORMATION_STACK'
                    deployAllProject("my-test-stack")
                }
            }
        }
    }
}

/*
 * Transform a comma delimited String into a String list/array
*/
def splitStringWithComma(projects){
    println ("splitStringWithComma() - result: "+projects.split(","))

    return projects.split(",")
}

/*
 * Build lambda functions
*/
void buildNodejsProject(){
    sh 'npm prune'
    sh 'npm install'
}

/*
 * Deploy lambda functions
*/
void deployAllProject(stackname){
    sh 'sam package  --output-template-file packaged.yaml --s3-bucket my-lambda-midway'
    sh 'sam deploy --template-file packaged.yaml --stack-name stackname'
}

Думаю, я пропустил какой-то фундаментальный синтаксис, но просто не мог найти правильное ключевое слово для этого. Пожалуйста, порекомендуйте мне хороший способ обработки переменной и укажите официальный раздел документации, на который мне следует обратить внимание. Заранее спасибо за помощь !!

1 Ответ

0 голосов
/ 16 января 2019

Я нашел сообщение, которое поможет мне решить проблему. Как передать переменные из Jenkinsfile в команду оболочки

Но я до сих пор не знаю, каковы основные различия между тем, что я написал ранее, и работоспособным решением, которое я использую, как показано ниже.

Спасибо за чтение этого поста. Если у вас есть лучшие обходные пути или вы можете указать мне документ, который я должен прочитать, я проголосую !! TA

/*
 * Deploy lambda functions
*/
void deployAllProject(stackname){
    sh 'sam package  --output-template-file packaged.yaml --s3-bucket bc-lambda-midway'
    sh """
        sam deploy --template-file packaged.yaml --stack-name ${stackname}
    """
}
...