2017-08-29 64 views
0

我在詹金斯流水線作業的以下Groovy代碼:分割文件內容爲鍵值MAP

stage 'Get ddplist file for rel:' + item    
myUrl ='http://mygitrepo.net/cgit/testing.git/plain/' +item + '.ddplist ' 
def data = new URL(myUrl).getText() 
echo data 

返回下面的輸出:

Entering stage Get ddpfile for rel:20170815.2 Proceeding [Pipeline] echo source= http://mygitrepo.net/cgit/repo1/snapshot/source-v20170815.2.tar.bz2 ltp= http://mygitrepo.net/cgit/repo2.git/snapshot/ltp-v20170815.1.tar.bz2 car= http://mygitrepo.net/cgit/repo3.git/snapshot/car-v20170815.1.tar.bz2

問題

如何我可以「查詢」這個字符串來找出什麼源文件或ltp文件?

什麼我試過到目前爲止

我嘗試添加的代碼如下兩行,像這樣:

def mymap = data.split("\n").collect{ it.split("=", 2) }.collectEntries() 
echo mymap 

但我得到的錯誤:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getText java.net.URL 
    at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectStaticMethod(StaticWhitelist.java:190) 

任何建議,將不勝感激。

編輯1

所以當我在下面選擇的答案在這個意義上技術上的工作,它顯示的回波結果。我本來就不是能夠在任何地方使用,因爲序列化錯誤的數據。使用下面的代碼

[ssh-agent] Started. 
[Pipeline] { 
[Pipeline] echo 
SRC: http://mygitrepo.net/cgit/repo1/snapshot/abc.tar.bz 
[Pipeline] echo 
INV: http://mygitrepo.net/cgit/repo2/snapshot/def.tar.bz2 
[Pipeline] echo 
CTG: testvalue 
[Pipeline] echo 
ANSIBLE_HOST: 10.1.1.1 
[Pipeline] echo 
ANSIBLE_DIR: /etc/ansible/mytestdirectory 
[Pipeline] stage (Copy new code to Ansible) 
Entering stage Copy new code to Ansible 
Proceeding 
[Pipeline] sh 
[workspace] Running shell script 
[Pipeline] } 
[Pipeline] } 
[Pipeline] End of Pipeline 
java.io.NotSerializableException: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream 

:具體來說,我漸漸從詹金斯以下輸出

 myUrl = "http://mygitrepo/cgit/testing.git/plain/" + item + ".dpplist" 
     // Requires script approval 
     def inStream = new URL(myUrl).openStream() //open up the dpplist for this release 
     def prop = new Properties() 
     prop.load(inStream) //create a properties object out of it. 
     src= prop.src 
     inv= prop.inv 
     ctg=prop.ctg 
     sshagent(['johndoe']) { 
       rbdbox(ANSIBLE_HOST,ANSIBLE_DIR, src, inv, ctg) 
     } 

def rbdbox(ANSIBLE_HOST,ANSIBLE_DIR, SRC, INV, CTG) { 

    echo "SRC: ${SRC}" 
    echo "INV: ${INV}" 
    echo "CTG: ${CTG}" 
    echo "ANSIBLE_HOST: ${ANSIBLE_HOST}" 
    echo "ANSIBLE_DIR: ${ANSIBLE_DIR}" 

    stage 'Copy new code to Ansible' 
     sh "ssh -A [email protected]${ANSIBLE_HOST} 'rm -rf ${ANSIBLE_DIR}/*'" 
} 

因此,要得到它的工作我不得不更改代碼以

 myUrl = "http://mygitrepo.net/cgit/testing.git/plain/" + item + ".ddplist " 
     // Requires script approval    
     def prop = new Properties() 
     prop.load(new URL(myUrl).openStream()) 

而且那麼一切都開始奏效。換句話說,我沒有定義插槽。

+0

什麼你覺得呢? (「=」)} .collectEntries {[(it.split(「=」)[0]):it.split(「 =「)[1]]}' – fsi

+0

我將如何訪問屬性/地圖? – dot

+0

'mymap .source'或'mymap .ltp'或'mymap .car' – fsi

回答

0

這裏在這種情況下,需要將其轉換爲Properties這會更簡單。

在這裏你去:

def myUrl ='http://mygitrepo.net/cgit/testing.git/plain/' +item + '.ddplist ' 
def inStream = new URL(myUrl).openStream() 

def prop = new Properties() 
prop.load(inStream) 

//Now you should be able to query easily 
println prop.source 
+0

btw。由於序列化錯誤,我不得不減少代碼。請參閱原始帖子中的「編輯1」部分。 – dot