2017-01-23 47 views
0

我在詹金斯官方码头中心使用Jenkins在我的本地码头工人(但我甚至尝试过jenkins,我们在bluemix实例上)。Jenkins api太慢

我正在写程序(当前测试驱动)从java触发作业,然后使用 jenkins api获取作业ID。

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); 

一旦我触发工作,它需要8秒,以工作apear在/ api/json中。

你知道可能是什么问题吗?

如何调整它?

+1

你应该提供一些更多的细节。 1)你使用什么代码? - 提供一个片段。 2)你已经试图缩小问题的范围了? - 我做了A并得到了B。3)你的硬件规格是什么? - CPU,RAM,磁盘。 ....类似的东西。 – SubOptimal

+0

我使用标准jenkins apis,用java httpconnection调用。我在我的macbook pro上运行docker上的jenkins。没有什么特别的描述。 –

+0

你如何衡量成功的作业触发和api中的可视性之间的时间?任何有用的Jenkins日志? – SubOptimal

回答

1

请检查两次执行之间是否还需要延迟。

触发任务

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} 

如果您仍需要等待大约8秒,检查quiet period的环境中工作。如果尚未启用,请启用它并将周期设置为0 seconds。这应该消除执行之间的延迟。

取决于Jenkins实例的工作负载,即使在零秒的时间段内,您可能也需要等待一段时间。