Jenkins pipeline sh does not seem to respect pipe in shell command

前端 未结 6 1267
清歌不尽
清歌不尽 2020-12-15 20:29

I am using a Jenkinsfile in a pipeline on version 2.32.2.

For various reasons I want to extract the version string from the pom. I was hoping I wouldn\'t have to a

6条回答
  •  臣服心动
    2020-12-15 21:10

    So nothing detailed above worked for me using the scripted Jenkinsfile syntax with Groovy. I was able to get it working, however. The type of quotations you use are important. In the example below, I am trying to fetch the latest git tag from GitHub.

    ...
    
    stage("Get latest git tag") {
      if (env.CHANGE_BRANCH == 'master') {
        sh 'git fetch --tags'
        TAGGED_COMMIT = sh(script: 'git rev-list --branches=master --tags --max-count=1', returnStdout: true).trim()
        LATEST_TAG = sh(script: 'git describe --abbrev=0 --tags ${TAGGED_COMMIT}', returnStdout: true).trim()
        VERSION_NUMBER = sh(script: "echo ${LATEST_TAG} | cut -d 'v' -f 2", returnStdout: true).trim()
        echo "VERSION_NUMBER: ${VERSION_NUMBER}"
        sh 'echo "VERSION_NUMBER: ${VERSION_NUMBER}"'
      }
    }
    ...
    

    Notice how the shell execution to assign LATEST_TAG works as expected (assigning the variable to v2.1.0). If we were to try the same thing (with single quotes) to assign VERSION_NUMBER, it would NOT work - the pipe messes everything up. Instead, we wrap the script in double quotes.

    The first echo prints VERSION_NUMBER: 2.1.0 but the second prints VERSION_NUMBER:. If you want VERSION_NUMBER to be available in the shell commands, you have to assign the output of the shell command to env.VERSION_NUMBER as shown below:

    ...
    
    stage("Get latest git tag") {
      if (env.CHANGE_BRANCH == 'master') {
        sh 'git fetch --tags'
        TAGGED_COMMIT = sh(script: 'git rev-list --branches=master --tags --max-count=1', returnStdout: true).trim()
        LATEST_TAG = sh(script: 'git describe --abbrev=0 --tags ${TAGGED_COMMIT}', returnStdout: true).trim()
        env.VERSION_NUMBER = sh(script: "echo ${LATEST_TAG} | cut -d 'v' -f 2", returnStdout: true).trim()
        echo "VERSION_NUMBER: ${VERSION_NUMBER}"
        sh 'echo "VERSION_NUMBER: ${VERSION_NUMBER}"'
      }
    }
    ...
    

    The first echo prints VERSION_NUMBER: 2.1.0 and the second prints VERSION_NUMBER: 2.1.0.

提交回复
热议问题