使用sh运行脚本时出现Jenkinsfile问题

时间:2019-11-19 17:32:42

标签: jenkins jenkins-pipeline

我有以下Jenkinsfile

def ARTIFACTS_JOB_ID;
def ARTIFACTS_URL;

node('CentOs') {
    checkout scm
    stage('Example') {
        echo 'Download artifacts'
        sh 'curljson  --header "PRIVATE-TOKEN: tdzis3" "https://gitlab-sample.com/api/v4/projects/63/jobs" > jobs.json'
        ARTIFACTS_JOB_ID = sh(returnStdout: true, script: 'python GetID.py').trim()
        ARTIFACTS_URL = "https://gitlab-sample.com/api/v4/projects/63/jobs/${ARTIFACTS_JOB_ID}/artifacts"
        echo "======> $ARTIFACTS_URL"
        sh 'echo $ARTIFACTS_URL'
        sh 'curl --output artifacts.zip --header "PRIVATE-TOKEN: tdzis3" "$ARTIFACTS_URL"'
    }
}

在尝试获取工件时,它正在调用

'curl --output artifacts.zip --header "PRIVATE-TOKEN: tdzis3" ""'(网址为空)

类似地

echo "======> $ARTIFACTS_URL" //works fine
sh 'echo $ARTIFACTS_URL' // shows empty string, tried with ${ARTIFACTS_URL} aswell.

有没有一种方法可以如下运行(因此我不必使用sh

def ARTIFACTS_JOB_ID;
def ARTIFACTS_URL;

node('CentOs') {
    checkout scm
    stage('Example') {
        script {
            echo 'Download artifacts'
            curljson  --header "PRIVATE-TOKEN: tdzis3" "https://gitlab-sample.com/api/v4/projects/63/jobs" > jobs.json
        }
    }
}

没有sh时,我收到无效的语法错误 curljson --header

2 个答案:

答案 0 :(得分:3)

变量声明ARTIFACTS_URL = "https://..."是Groovy全局变量。因此,sh步骤自然无法将其作为shell变量使用。

您需要在命令sh内用双引号而不是sh "echo $ARTIFACTS_URL"括住单引号,以便Groovy将其作为Groovy变量插值。

答案 1 :(得分:1)

您尝试过

sh "curl --output artifacts.zip --header 'PRIVATE-TOKEN: tdzis3' '{$ARTIFACTS_URL}'"

对于多个sh命令,您也可以使用

sh """
curl command here
cd command next 
etc
"""