簡體   English   中英

從單個Jenkinsfile運行多個Docker容器

[英]Running multiple Docker containers from a single Jenkinsfile

所以我花了一整天的時間試圖弄清楚如何使用多個Docker圖像配置一個簡單的Jenkins管道,我一點都不高興。

我需要在幾個不同的docker容器上執行幾個階段(准備,構建,測試,文檔)(目前我只選擇了三個標准的Python容器)。 如果那些並行運行會很好,但我只找到了這個解決方案,它將所有階段合並為一個(因此在Blue Ocean UI中創建了一個不那么豐富的概述): Jenkins Pipeline跨多個Docker鏡像

所以我最終得到了下面的配置,這很丑陋(到處都是代碼重復),但或多或​​少在經典UI中創建了一個好看的概述:

經典UI階段

Blue Ocean UI中的信息量不大

藍海階段概述

來自junit的可接受的測試概述,它結合了每個階段的所有測試,但如果任何測試失敗,則顯示相應的“版本”:

JUnit的

然而,最令人煩惱的是,你無法看到哪一步失敗了。 如果Python 2.7失敗,其他所有內容也都標記為失敗,您甚至看不到哪個階段失敗。

我嘗試了很多不同的方法,我想知道應該怎么做。 這應該和Jenkins一樣常見,所以我想我對此有一些普遍的誤解(對我來說絕對是新的)管道/節點/標簽/階段/步驟/聲明/腳本/ groovy / blueocean東西......

應該可以為它們中的每一個定義一些docker容器列表(可能是可自定義的階段/步驟)並且並行運行它們並且在Blue Ocean和Classic UI中很好地顯示它,不應該嗎?

node {
    stage("Python 2.7.14") {
        checkout scm
        docker.image('python:2.7.14').inside {  // just a dummy for now
            stage("Prepare") { sh 'python --version' }
            stage("Build") { sh 'ls -al' }
        }
    }
    stage("Python 3.5.4") {
        checkout scm
        docker.image('python:3.5.4').inside {
            stage("Prepare") { sh 'python -m venv venv' }
            stage("Build") {
                sh """
                    . venv/bin/activate
                    make install-dev
                """
            }
            stage('Test') {
                sh """
                    . venv/bin/activate
                    make test
                """
            }
            stage('Docs') {
                sh """
                    . venv/bin/activate
                    make doc-dependencies
                    cd docs
                    make html
                """
            }
        }
    }
    stage("Python 3.6.4") {
        checkout scm
        docker.image('python:3.5.4').inside {
            stage("Prepare") { sh 'python -m venv venv' }
            stage("Build") {
                sh """
                    . venv/bin/activate
                    make install-dev
                """
            }
            stage('Test') {
                sh """
                    . venv/bin/activate
                    make test
                """
            }
            stage('Docs') {
                sh """
                    . venv/bin/activate
                    make doc-dependencies
                    cd docs
                    make html
                """
            }
        }
    }
}

更新:當步驟失敗時,這就是藍海UI中的樣子,在這種情況下,Python 3.5.4和3.6.4中的“測試”失敗但看起來一切都失敗了。 測試步驟失敗

Python 2.7.14和3.5.4階段也已折疊,無法單獨查看。 如果我點擊其中一個,所有步驟都以綠色顯示,盡管在這種情況下. venv/bin/activate make test . venv/bin/activate make test failed:

失敗的測試步驟以綠色顯示

所以這就是我最終的結果。 肯定有更好的解決方案,但我必須繼續前進。 我希望及時收集一些(更好的)答案,我不會將其標記為“解決方案”;)

首先,斯蒂芬國王的一些信用幻燈片(標題說“聲明”,但有一些關於腳本管道的好例子):( 聲明)詹金斯管道

以下是我對GitHub的要點,其中包含以下代碼段:

def docker_images = ["python:2.7.14", "python:3.5.4", "python:3.6.2"]

def get_stages(docker_image) {
    stages = {
        docker.image(docker_image).inside {
            stage("${docker_image}") {
                echo 'Running in ${docker_image}'
            }
            stage("Stage A") {
                switch (docker_image) {
                    case "python:2.7.14":
                        sh 'exit 123'  // for python 2.7.14 we force an error for fun
                        break
                    default:
                        sh 'sleep 10'  // for any other docker image, we sleep 10s
                }
                sh 'echo this is stage A'  // this is executed for all
            }
            stage("Stage B") {
                sh 'sleep 5'
                sh 'echo this is stage B'
            }
            stage("Stage C") {
                sh 'sleep 8'
                sh 'echo this is stage C'
            }

        }
    }
    return stages
}

node('master') {
    def stages = [:]

    for (int i = 0; i < docker_images.size(); i++) {
        def docker_image = docker_images[i]
        stages[docker_image] = get_stages(docker_image)
    }

    parallel stages
}

我試着讓它易於使用:

  • 您將Docker鏡像添加到頂部的列表中,然后在get_stages()函數中定義stages
  • 添加常見的階段和步驟
  • 如果任何Docker鏡像需要特殊處理(如我的例子中的python:2.7.14 ),你可以使用一個簡單的switch 這也可以通過特殊情況的雙重映射('images' - >'stage'='steps')和默認的后備雙映射來實現,但我會將其留作讀者練習。 (老實說,我無法弄清楚正確的,支持的Groovy-lang語法)

這就是經典和藍海UI中的一切都很好的樣子(眾所周知,Blue Ocean UI無法在並行運行中顯示多個階段,請參閱JENKINS-38442 ):

經典UI 經典UI  - 構建正常

藍海UI Blue Ocean UI  - 構建正常

如果python:2.7.14 Stage A失敗,那么這是輸出:

經典UI 經典用戶界面 - 失敗的階段一步

藍海UI 藍海UI  - 失敗的階段一步

暫無
暫無

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

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