2017-10-19 92 views
0

我需要在幾個階段之間共享一些代碼,這也需要添加發布操作。要做到這一點,我想到了把一切的方法,該方法將被稱爲從有沒有辦法在聲明式管道中以編程方式注入發佈操作

pipeline { 
    stages { 
     stage('Some') { 
      steps { 
       script { commonCode() } 
      } 
     } 
    } 
} 

但是,我不知道我怎麼會commonCode安裝後的行動。文檔沒有提到一件事。查看代碼,意味着這個DSL基本上只是在使用哈希映射,但我不知道是否有可能從該方法訪問它並在運行中進行修改。

基本上我願做這樣的事情在commonCode

if (something) { 
    attachPostAction('always', { ... }) 
} else { 
    attachPostAction('failure', { ... }) 
} 

,到目前爲止工作的唯一的事情是,在commonCode我做的:

try { 
... 
onSuccess() 
} catch (e) { 
onError() 
} finally { 
onAlways() 
} 

,但不知道是否有更優雅的方式...

回答

0

您可以在pipeline塊之外使用常規groovy腳本。雖然我沒有嘗試過,但你應該能夠在那裏定義一個方法,然後從管道內部調用它。但方法調用不能稱爲步驟。您需要將其包裝在腳本步驟中。但是post的操作與steps{}塊的操作步驟相同,因此如果您可以在steps中使用它,則可以在帖子部分中使用它。你需要仔細觀察範圍,否則你最終會試圖弄清楚爲什麼某些地方的東西是空的。

您也可以使用共享庫。您可以在共享庫中定義一個步驟,然後像使用steps{}塊或其中一個後置塊中的任何其他步驟一樣使用它。

+0

我想我可能不清楚我的問題。我知道我可以在'steps'和'post'中使用步驟和其他方法(假設我在'script'中包裝了一些方法)。我的問題是:我可以在「steps」中做些什麼,它會以編程方式附加新的「post」動作。 –

+0

啊......這不是我所理解的。很抱歉對於這個誤會。我想知道是否可以使用散列或列表來存儲您想要在後期運行的某些閉包,然後在到達時運行這些閉包。我會看看我以後能否搞砸。 –

1

現在我更好地理解這個問題(我希望)...

這是一個非常有趣的想法 - 產生於前階段的飛行您的文章的行動。

結果很簡單。我嘗試了一個選項(成功),將各種閉包存儲在一個列表中,然後遍歷列表並在後置動作中運行所有閉包。然後我做了另一個(失敗),我只保存了一個閉包作爲變量並運行它。兩者都很好。

下面是執行此操作的代碼。取消對error行的註釋以模擬失敗的構建。

def postSuccess = [] 
def postFailure 

pipeline { 
    agent any 
    stages { 
    stage('Success'){ 
     steps { 
      script { 
       println "Configure Success Post Steps" 
       postSuccess[0] = {echo "This is a successful build"} 
       postSuccess[1] = { 
            echo "Running multiple steps" 
            sh "ls -latr" 
            } 
      } 
     } 
    } 
    stage('Failure'){ 
     steps { 
      script { 
       println "Configure Failure Post Steps" 
       postFailure = { 
        echo "This build failed" 
        echo "Running multiple steps for failure" 
        sh """ 
         whoami 
         pwd 
        """ 
       } 
      } 
//   error "Simulate a failed build" //uncomment this line to make the build fail 
     } 
    } 
    } // stages 

    post { 
     success { 
      echo "SUCCESS" 
      script { 
       for (def my_closure in postSuccess) { 
        my_closure() 
       } 
      } 
     } 
     failure { 
      echo "FAILURE!" 
      script { 
       postFailure() 
      } 
     } 
    } 
} // pipeline 
+0

哇,這是一個非常酷的方法!是否有可能將其擴展到共享庫? –

+0

根據你想怎麼做,是的,我認爲這可以工作。你可以從庫中返回你想要的東西,並把它放到後期變量中。 –

相關問題