วิธีการสร้างท่อส่งเจนกินส์ขนานที่ซับซ้อนได้อย่างไร


17

ฉันมีความสนใจในการแปลงเจนเนอร์ส bespoke ของเราเป็นท่อ อย่างไรก็ตามฉันไม่สามารถหาวิธีที่จะทำได้

ใครสามารถช่วยฉันด้วยสคริปต์เจนกินส์ที่สามารถทำต่อไปนี้?

1---2---3-----------9---10
    |           |
    |---4-------|
    |           |
    |---5---6---|
        |       |
        |---7---|

1: Start pipeline
10: End pipeline
5: Build some files
   * needed by 6, 7,
   * needed as artifacts at the end
2, 3, 4, 6, 7: Have jUnit result files, should be available at end of
   test (somewhere), even if one failed

เป็นไปได้ไหม หรือฉันควรเข้าร่วมหลังจาก 3, 4, 5? แบบนี้:

1---2---3-------6-------9---10
    |       |   |   |
    |---4---|   7---|
    |       |
    |---5---|

1
ฉันลงคะแนนให้ตัวเลือกที่สองฟังดูมีโอกาสน้อยที่จะหยุดพักและขยายต่อได้ง่ายขึ้นหากมีความจำเป็นเกิดขึ้น
Tensibai

2
อาจจะหนาแน่น แต่ฉันยังไม่เข้าใจว่ารุ่นที่ซับซ้อนเพิ่มเข้ามายังไง คุณสามารถบันทึกว่า "9" ทำอะไรได้บ้างและมันขึ้นอยู่กับอะไร? ไม่มี 8 ในกรณีที่คุณต้องการแก้ไขและเพิ่ม :)
burnettk

1
@BertGoethals คุณสามารถใช้ Pipeline และยังมีงานที่แตกต่าง เป็นไปได้ที่ฉันขาดอะไรบางอย่างที่นี่
avi

1
ฉันพยายามทำสิ่งที่คล้ายกันไม่กี่วันที่ผ่านมา ฉันสามารถทำให้มันทำงานกับparallelคำสั่งที่ซ้อนกันได้แต่โฟลว์ไม่ได้ดูใน BlueOcean
lawnmowerlatte

1
@BertGoethals คุณไม่สามารถเริ่มต้นไปป์ไลน์อื่นที่ทำ 5 แล้ว 6 และ 7 จากไปป์ไลน์หลักของคุณได้ไหม?
Tensibai

คำตอบ:


9

จากความคิดเห็นต่อคำถามของฉันและการทดสอบขั้นพื้นฐานบางอย่างต่อไปนี้ดูเหมือนจะใช้ได้:


4

ฉันมีสถานการณ์ที่คล้ายกันซึ่งฉันต้องการซ้อนเธรดงานแบบขนานอื่นภายในเธรดแบบขนานอื่น รหัสนี้เหมาะกับฉัน:

def performDeploymentStages(String node, String app) {
    stage("build") {
        echo "Building the app [${app}] on node [${node}]"
    }
    stage("deploy") {
        echo "Deploying the app ${app}] on node [${node}]"
    }
    stage("test") {
        echo "Testing the app [${app}] on node [${node}]"
    }
}

pipeline {
    agent {
        label 'master'
    }
    parameters {
        string(name: 'NODES', defaultValue: '1,2,3', description: 'Nodes to build, deploy and test')
        choice(name: 'ENV', choices: 'qa', description: 'Environment')
        string(name: 'APPS', defaultValue: 'app01,app02', description: 'App names')
    }

    stages {
        stage('parallel stage') {
            steps {
                script {
                    def nodes = [:]
                    for (node in params.NODES.tokenize(',')) {
                        def apps = [:]
                        for (app in params.APPS.tokenize(',')) {
                            performDeploymentStages(node, app)
                        }
                        parallel apps
                    }
                    parallel nodes
                }
            }
        }
    }
}

เพื่อให้ได้ประโยชน์อย่างเต็มที่จากการรันแบบขนาน


ส่วนย่อยนี้ทำงานโดยไม่กำหนดค่าให้กับnodesและappsตัวแปรหรือไม่
jellenberger

@jellenberger จะไม่ทำงานหาก vars เหล่านี้จะว่างเปล่า (สตริงว่าง / ว่าง) แต่ก็ไม่สามารถผ่านรายการเดียว (แอปเดียวหรือโหนด) โดยไม่มีเครื่องหมายจุลภาค
biniosuaf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.