複雑な並列Jenkinsパイプラインを構築する方法は?


17

私は、Jenkinsの特注の統合をパイプラインに変換することに興味がありました。しかし、私はそれを行う方法を理解できないようです。

誰でも次のことができるJenkinsスクリプトで私を助けることができますか?

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
私は2番目の選択肢に投票します。必要に応じて、壊れにくくなり、拡張しやすくなります。
テンシバイ

2
おそらく密集していますが、より複雑なバージョンが何を追加するのかまだ理解していません。「9」の機能と依存関係を文書化できますか?あなたがそれを修正して追加したい場合のために、8はありません。:)
バーネット

1
@BertGoethals Pipelineを使用しても、さまざまなジョブを実行できます。ここで何かが欠けている可能性があります。
avi

1
数日前に似たようなことをしようとしていました。ネストされたparallelコマンドで動作させることはできましたが、BlueOceanではフローが正しく見えませんでした。
lawnmowerlatte

1
@BertGoethalsメインパイプラインから5、6、7を実行する別のパイプラインを開始できませんか?
テンシバイ

回答:



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は、これらの変数が空(ヌル/空の文字列)になると機能しません。ただし、コンマなしで単一の項目(単一のアプリ、またはノード)を渡すことは問題ありません。
ビニオスアフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.