2017-12-07 6 views
0

현재 Jenkinsfile에 병렬로 실행되는 여러 빌드가 있습니다. 그러나 마스터 서버는 다소 과장되어 있습니다. 그래서 내 생각은 그것의 빌드를 구성된 값으로 제한하는 것입니다. concurrentbuild.젠킨스의 특정 번호로 병렬 빌드를 제한하십시오.

https://issues.jenkins-ci.org/browse/JENKINS-44085은 저에게 영감을주었습니다. 그러나 저는 계획에 조금 갇혀 있습니다.

def stepsForParallel = [:] 
stage('read modules') { 
    readMavenPom().modules.findAll { module -> 
    module.endsWith('-service') 
    }.each { service -> 
    stepsForParallel[service] = transformIntoStep(service) // this returns { build module } to avoid immediate execution 
    } 
} 
stage('modules') { 
    parallel stepsForParallel 
} 

빌드 기능이 너무 병렬을 사용하지 : 지금과 같이 병렬로 실행되는지도에 모여 서비스 목록을 가지고있다. 그래서 저는 많은 병렬 작업을합니다.

제 아이디어는 병렬로 수행해야하는 모든 단계를 모으는 LinkedBlockingDeque (stepDeque)을 작성하는 것이 었습니다. 그런 다음 두 번째 모델 (workingDeque)을 구성하여 concurrentbuilds 크기로 만듭니다.

그러나 내 문제가 발생합니다. 내가 아는 한지도에서 평행하게 만 실행할 수 있습니다. 따라서 workingDeque의 작업 중 하나가 완료되면 나는 자유 스레드를 갖게됩니다.

내 질문은 : stepDeque에서 작업을 폴링하고 workingDeque에 추가 할 때 방금 추가 한 단계를 실행하는 방법이 있습니까? 아니면 이것을 달성하는 더 간단한 방법이 있습니까?

답변

0

나는 그 부양 가족을 알고있는 Step 클래스를 작성했습니다. 처음에 나는 모든 단계를 수집하고 LinkedBlockQueue에 넣어 나는

def worker = [:] 
maxConcurrentSteps.times { 
    worker["worker${it}"] = { 
    Step work = getWork() // uses take() to get new work 
    while (work != null) { 
     work.run() 
     work = getWork() 
    } 
    } 
} 
를 사용 N 근로자를 만들