用于用户和密码的jenkins管道上的环境变量

时间:2018-04-10 18:53:11

标签: jenkins groovy jenkins-pipeline credentials

我非常擅长将groovy用于jenkins管道。我有一个已经运行的管道执行一些步骤,如运行unitest,sonnarqube anaysis等。其中一个步骤是使用curl -u将工件上传到artifactory。我不想显示用户并传递输出脚本,所以我使用凭证插件在其中存储用户和密码并具有ID。但我不知道如何使用变量将其传递给sh命令。这就是我现在在使用withCredentials的那一步中所拥有的。

stage ('Upload war to Artifactory') {
            withCredentials([usernamePassword(credentialsId: '7c9e8186-1f16-4920-837b-b571ea88a7e8', usernameVariable: 'willy11', passwordVariable: 'hello123')])
sh "sudo curl -u ${willy11}:{$hello123} -T $warPath 'https://artifactory.xxxxx.com:443/artifactory/Platform/$warFile'" 

我不知道如何传递或定义要在curl命令上使用的 usernameVariable passwordVariable 的值。现在的方式,我得到输出脚本:

java.lang.IllegalStateException: **There is no body to invoke**
at org.jenkinsci.plugins.workflow.cps.CpsStepContext.newBodyInvoker(CpsStepContext.java:283)
at org.jenkinsci.plugins.workflow.cps.CpsStepContext.newBodyInvoker(CpsStepContext.java:95)

enter image description here

我怎样才能做到这一点?在凭证插件中,我读到了应该把***放在脚本的输出上,这是怎么回事?我应该声明“will11”和“hello123”else并使用env变量吗?

谢谢。

def call(body) {

def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
body()

def artifactName = 'extractor'
def artifactExt = '.war'
def artifactVersion = '0.0.1'

def buildPath = 'target/'
def warFile = artifactName + '-' + artifactVersion + artifactExt
def warPath = buildPath + warFile
def warNoVersion = artifactName + artifactExt

def deployPath = '/var/lib/tomcat8/webapps/'
def deployFile = deployPath + warNoVersion

node {
    // Clean workspace before doing anything
    //deleteDir()

    try {

        stage ('Code Checkout') {
            git branch: 'master',
                credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
                url: 'ssh://git@bitbucket.org/xxxxxxx/xxxxxxxctor'
        }


stage ('Configure Application') {
            configFileProvider([configFile(fileId: config.confiFileId, variable: 'CONFIG_FILE_PATH')]) {
                sh 'cp $CONFIG_FILE_PATH resources/config.properties'
            }
            sh "echo 'job_name: $JOB_NAME' > WebContent/version.txt"
            sh "echo 'job_number: $BUILD_NUMBER' >> WebContent/version.txt"
        }

        stage ('Run Unitests') {
            sh 'mvn test'
        }

        /*stage ('SonarQube analysis') {
          withSonarQubeEnv('xxxxxxxxxxxxxxxx) {
            sh 'mvn sonar:sonar'
          }  
        }*/

        stage ('Compile and Build WAR') {
            sh 'mvn clean compile war:war'
        }

        stage ('Upload war to Artifactory') {
            withCredentials([usernamePassword(credentialsId: '7c9e8186-1f16-4920-837b-b571ea88a7e8', usernameVariable: 'USER', passwordVariable: 'PASSWORD')])
            sh "sudo curl -u ${USER}:{$PASSWORD} -T $warPath 'https://artifactory.xxxxxxx.com:443/artifactory/Platform/$warFile'" 

        }




    } catch (err) {
        notifyBuild('FAILURE', config.slackChannel)
        throw err
    }
}

1 个答案:

答案 0 :(得分:1)

当您使用凭证绑定插件时,凭据将绑定到环境变量,并且要执行的代码必须位于withCredentials语句的大括号内,这是我们错过的。

所以使用:

 stage ('Upload war to Artifactory') {
       withCredentials([usernamePassword(credentialsId: '7c9e8186-1f16-4920-837b-b571ea88a7e8', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) {
           sh ("sudo curl -u $USER:$PASSWORD -T $warPath 'https://artifactory.xxxxx.com:443/artifactory/Platform/$warFile'")
       }
 }

而不是:

 stage ('Upload war to Artifactory') {
     withCredentials([usernamePassword(credentialsId: '7c9e8186-1f16-4920-837b-b571ea88a7e8', usernameVariable: 'USER', passwordVariable: 'PASSWORD')])
         sh "sudo curl -u ${USER}:{$PASSWORD} -T $warPath 'https://artifactory.xxxxxxx.com:443/artifactory/Platform/$warFile'" 

 }