2017-10-16 127 views
1

摘要:當使用並行構建時,Groovy中的工作空間路徑與shell相比有所不同。我如何從DSL或Groovy獲得實際的工作空間?Jenkins多分支管道工作空間位置:shell與Groovy

詳細說明:

我們的工作區經由ws('/path/to/workspace')定義。

我試圖使用相對路徑,只需package.json,在通常是工作區根目錄的當前目錄中打開該文件。當作爲外殼運行時,sh 'jq -r ".version" package.json'它工作正常,我可以讀取package.json沒有任何問題。

但是使用Groovy:

def version = new groovy.json.JsonSlurper().parseText(new File("package.json").text)[ 'version' ] 

new File("package.json")那麼它失敗並聲稱$WORKSPACE/package.json不存在。儘管我們使用ws來設置上面的工作空間,但我可以看到它最終成爲像/path/to/workspace/my_job-SOMERANDOMCHARS ...而不是ws中指定的目錄。

我知道在並行工作負載中,我們需要使工作空間獨特,所以這並非意外。但是,我應該如何確定Groovy中的工作空間?或者期望總是突然出現在實際在節點上運行的shell中?

更新:更多的上下文

這是如何被使用的一些詳細信息。我們的Groovy(不是聲明式)管道沿着這些線做了一些事情:

stage('tests') { 
    parallel(
    'Unit Tests': { 
     node('unitNode') { 
     ws('/path/to/workspace') { 
      new file("${env.WORKSPACE}/package.json") // does not work 
      sh 'cat $WORKSPACE/package.json' // works OK 
     } 
     } 
    }, 
    'E2E Tests': { 
     node('e2eNode') { 
     ws('/path/to/workspace') { 
      new file("${env.WORKSPACE}/package.json") // does not work 
      sh 'cat $WORKSPACE/package.json' // works OK 
     } 
     } 
    } 
) 
} 

回答

0

訪問文件相對於工作區的最佳方式是使用readFile,或者在這種情況下更容易使用readJSON。這適用於我,我不必關心工作區的實際絕對路徑。

還有其他readXXXX方法,如readYAML,readManifest,readMavenPom等。有關完整列表和示例,請參閱Pipeline Utility Steps文檔。

0

我正在假設你是如何使用ws()。沒有看到您的實際代碼,您的描述意味着你正在做這樣的事情:

ws(/new/path/to/workspace) { 
    sh "cat package.json" 
} 

def version = new groovy.json.JsonSlurper().parseText(new File("package.json").text)[ 'version' ] 

如果是這樣,你是如何做的,那麼工作區將不再是WS {}塊的適用之外。

在運行ws()之前,您顯示的路徑(/ path/to/workspace/my_job-SOMERANDOMCHARS)看起來是原始的工作區路徑。或者它可能是你的管道文件檢出的地方。沒有看到你的代碼,很難猜測你想把你的工作區文件放在哪裏。

無論哪種方式,如果使用WORKSPACE變量,您可以獲取當前工作區。運行以下管道代碼並檢查輸出。這應該解釋這是如何工作的。

pipeline { 
    agent any 

    stages { 
     stage('first'){ 
      steps { 
       ws('/tmp/foobar') { 
        sh "pwd" 
        sh 'echo New Workspace - ${WORKSPACE}' //environment variable 
        echo 'New Workspace' + WORKSPACE //groovy variable 
       } 
       sh "pwd" 
       sh "echo Original Workspace - ${WORKSPACE}" //interpolated groovy variable 
       echo "Original Workspace - ${WORKSPACE}"  //interpolated groovy variable 
      } 
     } 
    } 

} 

編輯:我修改你的榜樣是我的機器嘗試重現上正在運行的例子,但它工作得很好。這是否在Jenkins上運行?

stage('tests') { 
    parallel(
    'Unit Tests': { 
     node('Linux') { 
     ws('/tmp/foobar') { 
      def file1 = new File("${env.WORKSPACE}/package.json") 
      println 'File1 is: ' + file1 
      echo "${env.WORKSPACE}" 
      sh 'echo $WORKSPACE/package.json' 
     } 
     } 
    }, 
    'E2E Tests': { 
     node('Linux') { 
     ws('/tmp/baz') { 
      def file2 = new File("${env.WORKSPACE}/package.json") 
      println 'File2 is: ' + file2 
      echo "${env.WORKSPACE}" 
      sh 'echo $WORKSPACE/package.json' 
     } 
     } 
    } 
) 
} 

也許問題是不是你認爲它是,或可能存在或版本詹金斯您使用的是插件的錯誤。如果文件句柄的println顯示正確的路徑,那麼其他問題可能就是問題。

+0

我已經添加了一些更多的上下文,以瞭解我如何嘗試使用工作區位置。 –

+0

我玩過你的額外細節。我似乎無法複製。這些代碼在你那正常嗎? –

+0

如果將'ws'位置設置爲兩個並行分支的同一目錄,該怎麼辦? –

相關問題