在 jenkinsfile 的 Serverless.yml 文件中引用环境变量

Referencing Environment Variable in Serverless.yml File from jenkinsfile

我试图在我的 serverless.yml 文件中引用我的 jenkinsfile 中设置的变量。

在 jenkinsfile 我有这个

environment {
   HELLO = 'hello-world'
 }

在 serverless.yml 文件中我有这个

custom:
  secret: ${env:HELLO}

当 运行 jenkins 管道出现此错误时

A valid environment variable to satisfy the declaration 'env:HELLO' could not be found.

这是我要求的完整 jenkins 文件,最终目标是我想使用 val1 和 val2 以及 env 变量,但如果我能弄清楚如何使用 hello world,那是一回事。

import com.lmig.intl.cloud.jenkins.exception.BuildException

def getJobName() {
   return env.JOB_NAME
}

environment {
   HELLO = 'hello-world'

 }

def getEnvironment() {

   def jobName = getJobName().split('/')
   def environment = jobName[1].toLowerCase()
   return environment.toLowerCase()
}

node('linux'){

  stage('Checkout'){
      checkout scm
  }
  stage('Pull Secrets From Vault'){
     withAWS(credentials:'aws-cred'){
        def secret = vaultPullSecrets(app:"sls-auxiliary-service",appenv:"nonprod",runtime:'nonprod',keys:'["saslusername","saslpassword"]')
        def val1 = new groovy.json.JsonSlurper().parseText(secret)[0].SASLUSERNAME
        def val2 = new groovy.json.JsonSlurper().parseText(secret)[1].SASLPASSWORD
        if(val1 != '' && val2 != ''){
            echo "Vault Secret pulled Successfully"
        }else{
            echo "Vault Secret Not Found"
            throw new BuildException("Vault Secret Not Found")
        }
     }
  }
  stage('Deploy') {
        def ENVIRONMENT = getEnvironment().replaceAll("\_","")
        withAWS(credentials:'aws-cred') {
             sh 'npm i serverless-python-requirements'
             sh 'npm install --save-dev serverless-step-functions'
             sh 'npm install serverless-deployment-bucket --save-dev'
             sh 'npm i serverless-pseudo-parameters'
             sh 'npm i serverless-plugin-resource-tagging'
             sh 'pip3 install --user -r requirements.txt'
             sh "serverless deploy --stage ${ENVIRONMENT}"
        }
  }

} 

你可以使用 sed 来替换占位符:${env:HELLO} 到真实值,如果你能让 jenkin 作业总是在 Linux slave 上执行。

stage('Pull Secrets From Vault'){
  withAWS(credentials:'aws-cred'){
    def secret = vaultPullSecrets(app:"sls-auxiliary-service",appenv:"nonprod",runtime:'nonprod',keys:'["saslusername","saslpassword"]')
    def val1 = new groovy.json.JsonSlurper().parseText(secret)[0].SASLUSERNAME

    sh """
      sed -i 's/${env:HELLO}/${val1}/' <relative path to>/serverless.yml
    """

我用一个简单的管道进行了快速练习,如下所示,我给出的 sed 命令运行良好。

node('docker') {

 stage('A') {
    sh '''
        set +x
        echo 'custom:' > serverless.yml
        echo '  secret: ${env:HELLO}' >> serverless.yml
        echo '### Before replace ###'
        cat serverless.yml
    '''

    def val1 = 'hello'

    sh """
        set +x
        sed -i 's/${env:HELLO}/${val1}/' ./serverless.yml
        echo '### After replace ###'
        cat serverless.yml
    """

 }

}

作业构建的输出

[script-pipeline-practice] Running shell script
+ set +x
### Before replace ###
custom:
  secret: ${env:HELLO}
[Pipeline] sh
[script-pipeline-practice] Running shell script
+ set +x
### After replace ###
custom:
  secret: hello