복잡한 병렬 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
나는 두 번째 옵션에 투표했는데, 필요할 때 깨질 가능성이 적고 확장하기 쉽습니다.
Tensibai

2
아마도 조밀 할 수는 있지만 더 복잡한 버전이 아직 무엇을 추가하는지 이해하지 못했습니다. "9"의 기능과 그 기능이 무엇인지 문서화 할 수 있습니까? 8을 수정하고 추가하려는 경우가 없습니다. :)
burnettk

1
@BertGoethals Pipeline을 사용하면서 여전히 다른 작업을 수행 할 수 있습니다. 여기에 뭔가 빠졌을 수 있습니다.
avi

1
며칠 전에 비슷한 일을하려고했습니다. 중첩 된 parallel명령 으로 작동시킬 수 는 있었지만 BlueOcean에서는 흐름이 올바르게 보이지 않았습니다.
lawnmowerlatte

1
@BertGoethals 메인 파이프 라인에서 5 번, 6 번 및 7 번을 수행하는 다른 파이프 라인을 시작할 수 없습니까?
Tensibai

답변:



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
                }
            }
        }
    }
}

병렬 실행의 이점을 충분히 활용하려면 충분한 실행 프로그램을 할당해야합니다.


이 스 니펫은 nodesapps변수에 값을 할당하지 않고 작동합니까 ?
jellenberger

@jellenberger이 변수가 비어 있으면 (널 / 빈 문자열) 작동하지 않습니다. 그러나 쉼표없이 단일 항목 (단일 앱 또는 노드)을 전달하는 것이 좋습니다.
biniosuaf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.