2017-01-23 12 views
0

jenkins公式ドッカーハブから私のローカルのドッカーでJenkinsを使用しています(でも、私はbluemixインスタンス上にあるジェンキンを試してみました)。Jenkins api too slow

Imを書くプログラム(現時点ではテスト駆動型)は、javaからジョブをトリガし、次にジョブIDを取得するために、 jenkins apiを使用します。

Properties jenkinsProps = new Properties(); 
InputStream jenkinsPropsIs = Files.newInputStream(jenkinsPropsFilePath); 
jenkinsProps.load(jenkinsPropsIs); 

// for building url 
String jenkinsServerUrl = jenkinsProps.getProperty(JenkinsPropertiesKeys.KEY_JENKINS_SERVER_URL); 
String jobName = jenkinsProps.getProperty(JenkinsPropertiesKeys.KEY_JENKINS_JOB_NAME); 
String jobRemoteAccessToken = jenkinsProps.getProperty(JenkinsPropertiesKeys.KEY_JENKINS_JOB_ACCESS_TOKEN); 

// for headers 
String jenkinsUser = jenkinsProps.getProperty(JenkinsPropertiesKeys.KEY_JENKINS_USERNAME); 
String jenkinsUserApiToken = jenkinsProps.getProperty(JenkinsPropertiesKeys.KEY_JENKINS_API_TOKEN); 
String jenkinsCrumb = jenkinsProps.getProperty(JenkinsPropertiesKeys.KEY_JENKINS_CSRF_CRUMB); 

// build parameters 
Map<String, String> params = new LinkedHashMap<>(); 
params.put("param1", "test1"); 
params.put("param2", "test2"); 
params.put("param3", "test3"); 

// Jenkins cause - to identify which process had run this job 
String procID = UUID.randomUUID().toString(); 
params.put("cause", procID); 

String url = getJenkinsBuildWithParametersUrl(jenkinsServerUrl, jobName, jobRemoteAccessToken, params); 

WebRequest request = new WebRequest(); // own HttpConnection based client 
// setup Jenkins crumb to avoid CSRF 
request.setHeader(HEADER_NAME_JENKINS_CRUMB, jenkinsCrumb); 

// user authentification (Basic + base64 encoded user:apiToken) 
setupAuthenticationHeader(request, jenkinsUser, jenkinsUserApiToken); 

// execute POST request 
request = request.post(url); 

// asserts 
assertNotNull(request); 
assertEquals(201, request.getResponseCode()); 


/* GET JOB ID */ 
Thread.currentThread().sleep(8000); // !!! if less then 8sec, jenkins returns old job number 

request.reset(); 
setupAuthenticationHeader(request, jenkinsUser, jenkinsUserApiToken); 
url = getJenkinsLastBuildUrl(jenkinsServerUrl, jobName); 

// execute get request to /api/json 
request = request.get(url); 
assertTrue(request.isOK()); 

// get note & compare with proc id, to match job 
String jenkinsJobProcId = null; 
JsonObject jenkinsLastBuildJson = request.getResponseAsJson(); 
JsonArray jenkinsActions = jenkinsLastBuildJson.get("actions").getAsJsonArray(); 
for (JsonElement action : jenkinsActions) { 
    JsonObject actionJson = action.getAsJsonObject(); 
    if (actionJson.get("_class").getAsString().equals("hudson.model.CauseAction")) { 
     JsonArray causeActionJsonArray = actionJson.get("causes").getAsJsonArray(); 
     for (JsonElement cause : causeActionJsonArray) { 
      JsonObject causeJson = cause.getAsJsonObject(); 
      if (causeJson.get("_class").getAsString().equals("hudson.model.Cause$RemoteCause")) { 
       jenkinsJobProcId = causeJson.get("note").getAsString(); 
       break; 
      } 
     } 
     if (!jenkinsJobProcId.isEmpty()) { 
      break; 
     } 
    } 
} 
System.out.println("LastBuild prodId  : " + jenkinsJobProcId); 
assertEquals(procID, jenkinsJobProcId); 

// get jenkins build number 
int lastBuildNumber = jenkinsLastBuildJson.get("number").getAsInt(); 
System.out.println("LastBuild buildNumber : " + lastBuildNumber); 
assertTrue(lastBuildNumber > 0); 

私がトリガーしたジョブは、/ api/jsonのジョブapearに8秒かかるようになります。

あなたは問題が何かを知っていますか?

チューニングの方法は?

+1

詳細を記入してください。 1)どのコードを使用していますか? - スニペットを提供する。 2)あなたはすでに問題を絞り込もうとしましたか? - 私はAをしてBを手に入れました。3)あなたのハードウェア仕様は何ですか? - CPU、RAM、ディスク。 .... そんな感じ。 – SubOptimal

+0

私は標準的なジェンキンのapisを使用しています、java httpconnectionで呼び出します。私はMacBook Proのdockerでjenkinsを実行しています。説明するのに特別なものはありません。 –

+0

成功したジョブトリガーとAPIの可視性の間の時間をどのように測定しますか? Jenkinsのログに役立つものは何ですか? – SubOptimal

答えて

1

2回の実行の間にまだ遅延があるかどうかを確認してください。あなたはまだ仕事中quiet periodの設定を確認し、約8秒を待つ必要がある場合は

トリガー仕事

curl -X POST http://${JENKINS_HOTS}:${JENKINS_PORT}/job/${JOB_NAME}/build \ 
    --user ${USER}:${PASSWORD} \ 
    --data-urlencode json='{"parameter": [{"name":"delay", "value":"0sec"}]}' 

は、ジョブ情報

curl http://${JENKINS_HOTS}:${JENKINS_PORT}/job/${JOB_NAME}/api/json \ 
    --user ${USER}:${PASSWORD} 

を取得します。まだ有効になっていない場合は有効にして、期間を0 secondsに設定します。これにより、実行間の遅延がなくなります。

Jenkinsインスタンスの負荷に応じて、期間が0秒であっても、短期間待つ必要がある場合があります。