2017-02-10 6 views
0

Google은 사용자가 프로젝트와 관련된 작업 만보고 빌드를 트리거 할 수 있도록 Jenkins 상단에 대시 보드를 만들었습니다. UI는 reactJS를 사용하여 작성되며 백엔드는 JAVA REST WebServices입니다.Jenkins API 응답 조정

WebService는 Jenkins API를 호출하여 작업 정보를 가져오고 데이터를 JSON으로 변환하여 UI에 공급합니다. 현재 대시 보드에는 약 200 개의 일자리가 있습니다. Jenkins API가 세부 사항에 응답하는 데 약 2 분이 소요됩니다. API가 200 잡스의 세부 사항을 가져 오기 위해 200 번 호출 채용

Sample API Call - http://jenkins:8080/job/jobName/api/json?tree=displayName,builds[result],lastBuild[estimatedDuration,result,duration,number,timestamp,actions[causes[userName]]] 

1.564 (16 개) 집행 인 이상 2000 -

젠킨스는 리눅스 박스

OracleLinux 6 x Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz/39.25 GB 

젠킨스 버전에서 실행 각 직업.

API 응답을 빠르게하는 방법에 대한 조언.

나는 리눅스 박스에서 RAM을 늘리고 JVM OPTS를 조정하는 것을 고려했다. 또한 Jenkins를 최신 LTS로 업그레이드합니다.

+1

작업에 빌드가 많이 있습니까? Jenkins 팀이 게으른로드 로딩 작업을하고 있고 어떤 버전의 개선이 있는지 알지 못합니다. 예 : 작업을로드하자 마자 모든 빌드가로드됩니다. 최신 버전에서는 렌더링 페이지/쿼리를 표시하는 데 필요한 버전을로드합니다.또한 트리 쿼리에서'builds [result]'부분은 위험 할 수 있습니다. 이전 버전에서는 (게으른 로딩과 함께) 이렇게하면 작업이 모든 빌드를로드하게됩니다. 그 이유는 페이징이 수행되지 않았기 때문입니다. 이후 버전에서는 반환 할 빌드 범위를 지정해야합니다. 기본값은 20입니다. –

+0

우리는 작업 당 30 건의 빌드 기록을 보관했습니다. 모든 플러그인이 호환되지 않을 수도 있기 때문에 Jenkins 코어를 업그레이드 할까 걱정됩니다. 우리는 여러 플러그인을 사용하여 작업을 수행합니다. – Upen

+0

좋아요, 게으른 로딩이 아니에요. 30 빌드는 그리 많지 않습니다. 1000+ 빌드를 가진 직업에 대해서만 정말로 문제. –

답변

2

낮은 교수형 과일 :

  1. , 즉, 병렬에 차례로없는 한 요청을 실행합니다.
  2. 표준 jetty container 표준을 사용하는 경우 작업자 프로세스의 수를 --handlerCountMax 옵션 (기본값은 40)으로 변경하십시오.

결국 은 200 개의 개별 요청을 수행하지 말아야합니다.. 설정에 따라 모든 요청에 ​​대한 보안 검사만으로 상당한 오버 헤드가 발생할 수 있습니다.

  • 이가의 수를 감소 :

    따라서, 깨끗한 솔루션이 마스터에 단일 그루비 스크립트에서 필요로하는 모든 데이터를 수집하는 것 (당신은 또한 REST를 통해 그렇게 할 수 있습니다) 1

  • 요청 그것을 당신이 당신을 어떤 게으른 로딩 문제를 타격하지 않을 것 같다로서 가능성
+0

Java 사용자가 많기 때문에 200 회 이상 통화의 for 루프를 제거하고 CountdownLatch를 사용하여 한 번에 수행합니다. 계속 게시 할 것입니다. 감사. – Upen

+0

변경으로 2 분에서 몇 초까지 속도를 향상시킬 수있었습니다. – Upen

+1

의견에 감사드립니다. 괜찮은 속도 향상입니다.) –

1

위 존 S의 코멘트에 언급 된 문제를 우회, 더 최적화 할 수 있습니다 r 서버 (작업 당 60 개의 빌드 만 있기 때문에) 문제는 아마도 Alex O가 제안한 것처럼 오버 헤드와 관련이 있습니다. 또한 알렉스 오 (Alex O)는 단일 요청으로이 모든 작업을 제안했습니다. 이것은 다음과 같은 요청을 수행 할 수 있습니다

http://jenkins:8080/api/json?tree=jobs[displayName,builds[result],lastBuild[estimatedDuration,result,duration,number,timestamp,actions[causes[userName]]]] 

대신 작업 API에 의존 우리는 우리가 하나의 요청에 따라 모든 작업에 대한 데이터를 가져올 수있는 젠킨스의 API를 사용합니다.

+0

Nice :) 한 번의 요청으로 여러 작업에 대한 결과를 얻을 수 있다는 것을 알지 못했습니다. –