2017-07-30 42 views
2

我在BitBucket上有兩個分支:masterdevelop。我還在我的Jenkins服務器上配置了一個BitBucket團隊文件夾作業來構建該存儲庫。在develop分支有以下Jenkinsfile:在Jenkinsfile中籤出不同的分支是不可能的嗎?

node { 
    stage('Checkout') { 
     checkout scm 
    } 

    stage('Try different branch') { 
     sh "git branch -r" 
     sh "git checkout master" 
    } 
} 

當詹金斯運行它,在構建時,它試圖籤master失敗:

[Pipeline] stage 
[Pipeline] { (Try different branch) 
[Pipeline] sh 
[e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA] Running shell script 
+ git branch -r 
    origin/develop 
[Pipeline] sh 
[e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA] Running shell script 
+ git checkout master 
error: pathspec 'master' did not match any file(s) known to git. 
[Pipeline] } 

我曾預計git branch -r命令打印出兩個origin/masterorigin/develop,但由於某種原因它只打印後者。

我讀過周圍,試圖想出什麼方法可以做到這一點:例如,我嘗試安裝了SSH代理插件詹金斯,改變了Jenkinsfile到:

node { 
    stage('Checkout') { 
     checkout scm 
    } 

    stage('Try different branch') { 
     sshagent(['Bitbucket']) { 
      sh "git branch -r" 
      sh "git checkout master" 
     } 
    } 
} 

但它仍然沒有按似乎找不到origin/master。更糟的是,SSH代理好像它試圖籤master之前被殺害:

[Pipeline] { (Try different branch) 
[Pipeline] sshagent 
[ssh-agent] Using credentials ThomasKasene (Used to communicate with Bitbucket) 
[ssh-agent] Looking for ssh-agent implementation... 
[ssh-agent] Exec ssh-agent (binary ssh-agent on a remote machine) 
$ ssh-agent 
SSH_AUTH_SOCK=/tmp/ssh-M6pIguCUpAV4/agent.11899 
SSH_AGENT_PID=11902 
$ ssh-add /var/jenkins_home/workspace/e_jenkinsfile-tes[email protected]tmp/private_key_2394129657382526146.key 
Identity added: /var/jenkins_home/workspace/e_jenkinsfile-tes[email protected]tmp/private_key_2394129657382526146.key (/var/jenkins_home/workspace/e_jenkinsfile-tes[email protected]tmp/private_key_2394129657382526146.key) 
[ssh-agent] Started. 
[Pipeline] { 
[Pipeline] sh 
[e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA] Running shell script 
+ git branch -r 
    origin/develop 
[Pipeline] sh 
$ ssh-agent -k 
unset SSH_AUTH_SOCK; 
unset SSH_AGENT_PID; 
echo Agent pid 11902 killed; 
[ssh-agent] Stopped. 
[e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA] Running shell script 
+ git checkout master 
error: pathspec 'master' did not match any file(s) known to git. 
[Pipeline] } 

我的最終計劃是承諾的東西develop,然後將其合併到master,但到目前爲止,我有非常一點運氣。有沒有人有可能的解決方案或解決方法?

PS:這似乎只是Jenkinsfile中的一個問題;我有一個自由式的工作,可以完成類似於我想要的任務,並且工作正常。

回答

1

經過幾個小時的反覆試驗,我想出了一個可能的解決方案。它部分建立在馬特的答案上,但我不得不改變它以使其工作。

馬特在要領中是正確的:checkout scm根本沒有足夠的靈活性讓我做我需要的東西,所以我不得不使用GitSCM來定製它。感興趣的主要點是:

  • 添加的擴展LocalBranch,以確保我檢查出實際的分支,而不僅僅是脫離HEAD
  • 增加了擴展WipeWorkspace刪除工作區中的所有內容並強制完成一個克隆。我不認爲這是解決我的問題的一部分,但它仍然很方便。
  • 由於存儲庫是私有的,因此使用credentialsId屬性指定SSH憑據。

無論出於何種原因,當執行checkout步驟時,它只會檢出分支,但不會將其設置爲跟蹤遠程分支。在找到更優雅的解決方案之前,我必須手動完成此操作。

完成這一切後,我可以使用常規的sh "git checkout master"甚至sh "git push",只要我將它們包含在sshagent步驟中。

我在下面添加了一個生成的Jenkinsfile的工作示例,但請記住,它不應該用於接近生產的任何東西,因爲它仍處於初期階段;例如,硬編碼的版本號,並且不檢查您所在的分支。

node { 
    mvnHome = tool 'Maven' 
    mvn = "${mvnHome}/bin/mvn" 

    stage('Checkout') { 
     checkout([ 
      $class: 'GitSCM', 
      branches: scm.branches, 
      extensions: scm.extensions + [[$class: 'LocalBranch'], [$class: 'WipeWorkspace']], 
      userRemoteConfigs: [[credentialsId: 'Bitbucket', url: '[email protected]:NAVFREG/jenkinsfile-tests.git']], 
      doGenerateSubmoduleConfigurations: false 
     ]) 
    } 

    stage('Release') { 
     // Preparing Git 
     sh "git branch -u origin/develop develop" 
     sh "git config user.email \"[email protected]\"" 
     sh "git config user.name \"Jenkins\"" 

     // Making and committing new verison 
     sh "${mvn} versions:set -DnewVersion=2.0.0 -DgenerateBackupPoms=false" 
     sh "git commit -am \"Released version 2.0.0\"" 

     // Merging new version into master 
     sh "git checkout master" 
     sh "git merge develop" 
     sh "git checkout develop" 

     // Making and committing new snapshot version 
     sh "${mvn} versions:set -DnewVersion=3.0.0-SNAPSHOT -DgenerateBackupPoms=false" 
     sh "git commit -am \"Made new snapshot version 3.0.0-SNAPSHOT\"" 

     // Pushing everything to remote repository 
     sshagent(['Bitbucket']) { 
      sh "git push" 
      sh "git checkout master" 
      sh "git push" 
     } 
    } 
} 
2

您可以使用Jenkins Pipeline中的內在函數爲Git創建克隆和拉取。我也建議將分支克隆到不同的目錄中。

checkout([$class: 'GitSCM', 
    branches: [[name: '*/branch_name']], 
    doGenerateSubmoduleConfigurations: false, 
    extensions: [[$class: 'RelativeTargetDirectory', 
    relativeTargetDir: 'different_directory']], 
    submoduleCfg: [], 
    userRemoteConfigs: [[url: '[email protected]:org/repo.git']]]) 
+0

兩個解決方案做出來的你有什麼建議cloing到一個單獨的任何特別的原因目錄,除了搞砸東西的潛在風險之外? –

+0

@ThomasKåsene如果您將兩個存儲庫克隆到相同的目錄,這會導致您的'.git'目錄出現問題。 –

+0

假設我不先擦拭它,我完全同意。該計劃從未將多個分支克隆到同一個文件夾,而是在同一個倉庫中的分支之間來回切換,這在理論上應該工作得很好。順便謝謝你的回答! –

0

我無法得到上述兩個答案的工作。我被觸發,通過指定一個分支詹金斯管道的工作,並試圖結帳作業另一分支(開發),它與失敗:

error: pathspec 'develop' did not match any file(s) known to git. 

我可能會在失敗的作業看到這一點,這表明只有觸發分公司被提取:

git fetch --no-tags --progress https://<github URL> +refs/heads/branch-name:refs/remotes/origin/branch-name 

我把它通過改變遠程讀取配置,並通過做只是默認checkout scm步在觸發任務的Jenkinsfile後執行以下操作獲取所有分行的工作:

sh """ 
    git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*' 
    git fetch --all 
""" 

這要歸功於這個答案https://stackoverflow.com/a/39986737/1988883

這也避免了配置詹金斯GitSCM script approvals這我有嘗試上述

相關問題