2017-07-28 53 views
0

我有詹金斯LTS 2.60.2在Windows Server 2016上,並使用這些插件:詹金斯複製神器無法找到文件夾/ multiProjectPipeline/branchWithSlash

  • 文件夾插件(6.1.0)
  • Copy Artifact插件(1.38 1.1)
  • 流水線插件(2.5)+所有相關的管線子插件
  • 其他各種相關的插件...

關於我的設置的詳細信息,請參閱Pipeline to use artifacts from 2 projects associated by the same git branch name,但概括起來我有以下項目:

  • 操場
  • 前端(多分支管道)(與文件夾插件將所有這些下列項目創建的文件夾)
  • 後端(多分支管道)
  • 配置(管道帶參數調用BRANCH_NAME)

的前端和後端git回購,都有一個分支叫做和一個叫版本/ 2017.2

想法是在每次成功構建之後自動調用配置管道,並傳遞git分支名稱。自動觸發配置管道工程。

什麼是行不通的,我需要你的幫助來修復,是配置管道從一個multibranchPipeline/specificBranch拷貝工件的步驟。

如果對於BRANCH_NAME參數(或上游管道)是主人它的工作原理。如果BRANCH_NAME是:發佈/ 2017.2我得到這個錯誤:

ERROR: Unable to find project for artifact copy: playground/frontend/release%2f2017.2 This may be due to incorrect project name or permission settings; see help for project name in job configuration. Finished: FAILURE

配置管道看起來是這樣的:

node { 
    stage('Prepare') { 
     def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2f") 
     step([$class: 'CopyArtifact', projectName: "${projectname}", selector: [$class: 'StatusBuildSelector', stable: false]]) 
    } 
    stage('Archive') { 
     archiveArtifacts '**' 
    } 
} 

正如你可以看到我已經更換/用%2F(這是需要)。

如果我不使用「操場」文件夾(我的所有管道原樣,不在文件夾項目內),它可以工作。如果我使用該文件夾並使用主分支,它就可以工作。如果我使用文件夾和2017.2這樣的分支名稱,它不起作用。我究竟做錯了什麼?你能幫助它工作嗎?很好,如果它是一個錯誤(我在https://issues.jenkins-ci.org搜索,發現一些錯誤,其中類似的文件夾設置不起作用,但他們已被修復...所以我真的很想知道...)在副本神器插件,請文件錯誤和分享鏈接在這裏,所以我們都可以監控其進展...

謝謝。

回答

1

我終於找到了問題。 配置由於編碼不正確,管道未能找到帶有斜線的分支。

所以,我的問題,在配置管道:

這個(更換/%2f)是錯誤的,併產生錯誤

def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2f") 

這是正確的方法編碼斜槓,它作品

def projectname = "playground/frontend/" + URLEncoder.encode("${BRANCH_NAME}", "UTF-8").replace("+", "%20") 

貸:http://www.pipegrep.se/copy-artifacts-from-jenkins-pipeline-jobs.html

UPDATE:其實,我調查了一下進一步的,只是step前加入echo "${projectname}",與前和固定的工程名,我注意到差異%2f小寫

大寫,就像這樣:%2F作品:

def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2F") 

因此,固定配置管道看起來像這樣(我一直在我替換功能,這是足以讓我的情況):

node { 
    stage('Prepare') { 
     def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2F") 
     step([$class: 'CopyArtifact', projectName: "${projectname}", selector: [$class: 'StatusBuildSelector', stable: false]]) 
    } 
    stage('Archive') { 
     archiveArtifacts '**' 
    } 
} 
0

我創建了一個sample project來嘗試重新創建您所看到的內容,並且在一種時尚之後我能夠這樣做,除了我遇到的構建是master而不是release/2017.2。最終,我意識到我從frontend項目中錯誤地執行了build job,並且它給了我同樣的錯誤,因爲我還沒有完成frontend/master分支的成功構建(我已經完成了release/2017.2的成功構建因爲我最初並沒有觸發configure構建,所以它沒有給我配置它以觸發configure構建時發生的相同錯誤)。

什麼工作是在frontendJenkinsfilebuild job更改爲此:

build job: 'playground/configure', parameters: [[$class: 'StringParameterValue', name: 'BRANCH_NAME', value: env.BRANCH_NAME]], quietPeriod: 2, wait: false

添加在quietPeriod給人安靜的時間幾秒鐘完成前一個任務之間(我不能肯定這是非常重要的,但它似乎可能是一個很好的失效保護措施,試圖確保有足夠的時間來完成構建),但重要的部分是wait: false,它指示詹金斯此構建不應等待觸發的構建完成。一旦我改變了這一點,frontend/master分支成功完成,並且它觸發的configure構建也成功完成。

希望這會有所幫助。我能夠正確地構建masterrelease/2017.2分支,所以我不相信項目名稱中的/有任何內在問題。您可以在引用的回購庫中看到我的簡單Jenkinsfile,並且我使用了與您在問題中發佈的管道腳本相同的流水線腳本。

+0

這也可能是我得到了一個稍微不同的錯誤,並且這不會解決您的問題。儘管如此,它確實表明你想要做的是可行的。 – Kdawg

+0

感謝您的回答Kdawg,也許我沒有指定,但問題出在* configure *作業中。我成功運行*前端*作業(最後一部分調用* configure *我包裝在一個try和catch中,即使它失敗,構建標記爲成功),然後再次運行configure作業,方法是指定參數「發佈/ 2017.2「,這是錯誤顯示的地方。同樣在我的設置中,我沒有使用github,而是使用gerrit作爲git存儲庫。也許在github上它可以工作,但在其他git服務器上卻不行? – firepol

+0

Kdawg,* quietPeriod *和* wait *幫助加快構建並避免使用* try/catch *,但* configure *管道總是失敗並出現此錯誤: 錯誤:無法找到工件副本的項目:遊樂場/前臺/版本%2f2017.2 這可能是由於項目名稱或權限設置不正確;請參閱作業配置中項目名稱的幫助。 Finished:FAILURE' – firepol