Я использую декларативный конвейер 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'
}
Думаю, я пропустил какой-то фундаментальный синтаксис, но просто не мог найти правильное ключевое слово для этого. Пожалуйста, порекомендуйте мне хороший способ обработки переменной и укажите официальный раздел документации, на который мне следует обратить внимание. Заранее спасибо за помощь !!