簡體   English   中英

在多個工作中重復使用jenkins管道的各個階段

[英]Reusing stages of a jenkins pipeline in multiple jobs

我的團隊正在轉向Jenkins 2,我正在使用管道插件,以便我們的構建可以存在於我們的存儲庫中。 因為在我們公司中獲得分配的存儲庫有很多開銷,所以我們有一個存儲庫,其中包含許多子項目和子模塊。

我想要的是為每個子模塊單獨構建和報告Junit / checkstyle / etc報告,以及每個子項目的最終“構建和部署”步驟。

我目前的計划是為每個子模塊創建單獨的作業,以便他們獲得自己的junit / checkstyle / etc報告頁面。 然后有一個多作業項目來為子項目編排子模塊構建。 由於所有子項目都是簡單的jar構建,我想將大量邏輯放在一個公共文件中,讓我們在子項目的根目錄中調用它為JenkinsfileForJars。 回購結構是

  • 子項目
    • JenkinsfileForJars.groovy
    • 子moduleA
      • Jenkinsfile
    • 子moduleB
      • Jenkinsfile

我的Jenkinsfile包含

def submoduleName = "submoduleA"
def pipeline
node {

    pipeline = load("${env.WORKSPACE}/subproject/JenkinsfileForJars.groovy")

}
pipeline.build()
pipeline.results()

我的JenkinsfileForJars包含

def build() {

    stage('Build') {
        // Run the maven build
        dir("subproject") {
            sh "./gradlew ${submoduleName}:build"
        }

    }
}
def results() {

    stage('Results') {
        dir("subproject/${submoduleName}") {
            junit 'build/test-results/TEST-*.xml'
            archive 'build/libs/*.jar'
            publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: 'build/reports/cobertura/', reportFiles: 'frame-summary.html', reportName: 'Cobertura Report'])
            publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: 'build/reports/findbugs/', reportFiles: 'main.html', reportName: 'Fidbugs Report'])
            publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: false, reportDir: 'build/reports/pmd/', reportFiles: 'main.html', reportName: 'PMD Report'])
            step([$class: 'CheckStylePublisher', pattern: 'build/reports/checkstyle/main.xml', unstableTotalAll: '200', usePreviousBuildAsReference: true])
        }
    }

}

return this;

當我運行上面的Jenkinsfile時,我收到以下錯誤:

Running on master in /var/lib/jenkins/workspace/jobA
[Pipeline] {
[Pipeline] load
[Pipeline] { (/var/lib/jenkins/workspace/jobA/subproject/JenkinsfileForJars.groovy)
[Pipeline] }
[Pipeline] // load
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.lang.NullPointerException: Cannot invoke method build() on null object

據我所知,我正在關注加載手動腳本的文檔中顯示的內容以及為加載的腳本提供示例 我不明白為什么我的腳本在load命令后為null。

如何讓我的Jenkinsfile加載JenkinsfileForJars.groovy?

問題與Blake Mitchell在上述評論中提到的SCM結賬有關。 由於您正在從子模塊加載groovy函數,因此如果您只想在主服務器上保留裸存儲庫,則需要首先檢出子模塊,最好是在構建代理/從服務器上。

def pipeline
node( 'myAgentLabel' ) {
    stage ( 'checkout SCM' ) {
        checkout([
            $class: 'GitSCM'
            ,branches: scm.branches
            ,extensions: scm.extensions 
                + [[ $class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: false]]
            ,doGenerateSubmoduleConfigurations: false
            ,userRemoteConfigs: scm.userRemoteConfigs
        ])
        pipeline = load( "${env.WORKSPACE}/path/to/submodule/myGroovyFunctions.grooovy" )
    }
    pipeline.build()
}

請注意,在結帳示例中,訪問scm。*屬性也需要由Jenkins中的管理員列入白名單(進程內腳本批准)

可能存在兩個可能的問題:

  • 為什么要將負載放在節點結構中。 此導入不需要計算資源,因此您不需要它。
  • 對構建的調用應放在節點結構中。 並且可能對結果的調用也應該在(相同的)節點結構內,以確保歸檔正確的結果(如果使用多個(從屬)節點)。

(這應該是你問題下方的評論,但我沒有足夠的積分在那里添加評論。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM