2017-07-04 48 views
9

我有一個名爲multibranch-test的github repo,帶有兩個子目錄Project1,Project2。如何只在Jenkins多分支管道作業中建立一個目錄?

PS C:\Repos\multibranch-test> tree . Folder PATH listing for volume Windows Volume serial number is 2085-6D3D C:\REPOS\MULTIBRANCH-TEST ├───Project1 └───Project2

每個子目錄有Jenkinsfile和該項目的代碼。

在詹金斯我有兩個多分支管道工作 - 一個用於Project1和一個用於Project2。在Project1的配置中,如果在Project2的子目錄中推送提交,我不希望推送通知或輪詢生成Project1。

所以在PROJECT1我已經配置的其他行爲:

  • 先進的克隆行爲:淺克隆檢查
  • 稀疏結賬路徑被設置到Project#
  • 輪詢忽略提交的某些路徑
    • 包括地區: PROJECT1/*
    • 排除地區: *
  • 生成配置:腳本路徑:PROJECT1/Jenkinsfile

正在發生的事情是,如果我把一個提交掌握子目錄Project2, Project1和Project2作業建立。我只想要Project2構建。有人能指出我做錯了什麼嗎?

Jenkinsfiles這兩個項目是相似的,看起來像:

#!groovy 
node { 
    stage ('checkout') { 
     checkout scm 
    } 

    stage ('build') { 
     dir ('Project1') { 
      bat 'powershell -Command gci' 
      bat 'powershell -Command gci env:' 
      bat 'powershell -File .\\Project1.ps1' 
     } 
    } 

回答

1

默認詹金斯的行爲是項目得到重建,如果他們的回購得到一個承諾,讓你犯回購兩個詹金斯項目生成事件並觸發兩建立。看看Jenkins文檔:https://jenkins.io/doc/book/pipeline/

從詹金斯的角度來看,很難判斷更改是否進入項目1或2 - 立即可見的是「新提交的監視回購」。

簡單的解決方案是將每個項目的回購分爲兩個獨立回購單。由於它們應該單獨構建,所以不應該成爲問題。

+2

由於工作,但我不能分解回購。 –

0

您可以創建整個回購工作,它看起來在提交給你帶來的變化,然後觸發項目1或2或兩者

+1

如何使用聲明式流水線語法來做到這一點? –

4

這一直是我們的一個大麻煩的相應Jenkinsfile,但我們能夠通過一些解決方法來解決它。

我們有一個由GitHub提交鉤子觸發的主Jenkins作業。它會計算出自上次提交以來更改的內容,然後觸發其他服務特定的 Jenkins作業。

我們有我們使用(如命名服務,目錄和詹金斯的工作慣例)這裏沒有指定的其他一些公約,但希望這會幫助別人。

下面是在該溶液中各成分的細分:對應Jenkinsfiles在monorepo每個服務

  1. 詹金斯作業和。

C:\REPOS\MULTIBRANCH-TEST\Project1\Jenkinsfile(這裏您構建邏輯) C:\REPOS\MULTIBRANCH-TEST\Project2\Jenkinsfile(你在這裏建邏輯)

  • shell腳本,是可以獲得的,因爲上次提交什麼改變列表(改編自this blog post)。
  • C:\REPOS\MULTIBRANCH-TEST\change-sets.sh

    #!/usr/bin/env bash 
    
        changeSets=(`git diff-tree --name-status HEAD`) 
        for((i=0; i<${#changeSets[@]}; i++)) 
        do 
         if [ ${changeSets[$i]} == "M" ] 
         then 
         echo ${changeSets[$i+1]} 
         fi 
        done 
    
  • 甲詹金斯其構建在GitHub commit鉤子
  • C:\REPOS\MULTIBRANCH-TEST\Jenkinsfile

    #!/usr/bin/env groovy 
    
        pipeline { 
         agent any 
    
         stages { 
    
          stage('Define Services to Build') { 
           steps { 
            script { 
    
             def SERVICES_TO_BUILD = sh script:"./change-sets.sh", returnStdout: true 
             SERVICES_TO_BUILD.split("\n").each { 
              echo "Triggering build for ${it}" 
              try { 
               build job: "${it}", propagate: false, wait: false 
              } catch (ex) { 
               echo "Failed to trigger build for ${it}: ${ex.message}" 
              } 
    
             } 
            } 
           } 
          } 
         } 
        } 
    
    +0

    但是這對於多分支線來說並不適用,對吧?情景:現有分支(=分支2)正在進行「project2」的工作;我創建新的分支(= branch1)只更改「project1」代碼。 我在分支1中提交對「project1」的更改,觸發分支 - 多分支管道爲project1,發現新的分支 - 構建。 其他人將更改提交到branch2,觸發了project2的多分支管道 - 爲branch2構建更改並發現新分支 - branch1 - 並構建它。 – mrzodiak

    +0

    我們能夠通過上述解決方案解決您所描述的場景。多分支管道運行'〜\ change-sets.sh',它決定自上次提交以來哪些目錄(項目)發生了變化。然後它引發其他非多分支,構建每個項目的特定項目的管道作業。所以,在你的場景中,多分支工作將會看到branch1的變化,並導致project1的Jenkins工作。隨後的分支2提交,只會看到自上次提交以來project2中的更改,所以多分支管道作業只會觸發project2的Jenkins作業。 –

    相關問題