修改发布实训:

写测试用例后,不删除job,
每次创建job之前先查看是否存在,如果存在则更新,不存在则创建
Merge branch 'develop' of https://git.trustie.net/Hjqreturn/training_project into develop

# Conflicts:
#	jenkins-exec/doc/allclasses-frame.html
#	jenkins-exec/doc/allclasses-noframe.html
#	jenkins-exec/doc/com/educoder/jenkins/controller/GameController.html
#	jenkins-exec/doc/com/educoder/jenkins/controller/package-frame.html
#	jenkins-exec/doc/com/educoder/jenkins/controller/package-summary.html
#	jenkins-exec/doc/constant-values.html
#	jenkins-exec/doc/help-doc.html
#	jenkins-exec/doc/index-files/index-1.html
#	jenkins-exec/doc/index-files/index-2.html
#	jenkins-exec/doc/index-files/index-3.html
#	jenkins-exec/doc/index-files/index-4.html
#	jenkins-exec/doc/index-files/index-5.html
#	jenkins-exec/doc/index.html
#	jenkins-exec/doc/stylesheet.css
#	jenkins-exec/src/main/java/com/educoder/jenkins/controller/GameController.java
This commit is contained in:
ladventure 2017-06-21 14:50:52 +08:00
commit d44c136e80
45 changed files with 2448 additions and 293 deletions

View File

@ -338,6 +338,7 @@ public class JenkinsHttpClient {
if (xml_data != null) {
request.setEntity(new StringEntity(xml_data, ContentType.create("text/xml", "utf-8")));
}
HttpResponse response = client.execute(request, localContext);
getJenkinsVersionFromHeader(response);
try {

View File

@ -1,5 +1,7 @@
package com.offbytwo.jenkins.client.validator;
import java.util.logging.Logger;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpResponseException;
@ -9,6 +11,7 @@ public class HttpResponseValidator {
public void validateResponse(HttpResponse response) throws HttpResponseException {
int status = response.getStatusLine().getStatusCode();
if (status < 200 || status >= 400) {
if(404 == status) System.out.println("response404");
Header[] headers = response.getHeaders("X-Error");
if (headers.length>0){
throw new HttpResponseException(status, headers[0].getValue());

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>所有类</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>所有类</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script type="text/javascript" src="script.js"></script>
</head>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>所有类</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>所有类</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script type="text/javascript" src="script.js"></script>
</head>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>GameController</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>GameController</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../script.js"></script>
</head>
@ -19,8 +26,13 @@
catch(err) {
}
//-->
<<<<<<< HEAD
var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
=======
var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10};
var tabs = {65535:["t0","所有方法"],2:["t2","实例方法"],8:["t4","具体方法"]};
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
@ -29,6 +41,69 @@ var activeTableTab = "activeTableTab";
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<<<<<<< HEAD
=======
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../../../../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li class="navBarCell1Rev"></li>
<li><a href="class-use/GameController.html">使用</a></li>
<li><a href="package-tree.html"></a></li>
<li><a href="../../../../index-files/index-1.html">索引</a></li>
<li><a href="../../../../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个类</li>
<li>下一个类</li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?com/educoder/jenkins/controller/GameController.html" target="_top">框架</a></li>
<li><a href="GameController.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">方法</a></li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">com.educoder.jenkins.controller</div>
@ -57,6 +132,7 @@ var activeTableTab = "activeTableTab";
@RequestMapping(value="/game")
public class <span class="typeNameLabel">GameController</span>
extends com.educoder.jenkins.controller.BaseController</pre>
<<<<<<< HEAD
<dl>
<dt><span class="simpleTagLabel">版本:</span></dt>
<dd>0.1</dd>
@ -64,6 +140,12 @@ extends com.educoder.jenkins.controller.BaseController</pre>
<dd>lqk</dd>
<dt><span class="seeLabel">另请参阅:</span></dt>
<dd><p>为每次构建创建一个线程,用以放入线程池实现对构建任务的管理</p></dd>
=======
<div class="block">生成脚本、发布实训、开启实训、写测试用例、删除job</div>
<dl>
<dt><span class="simpleTagLabel">作者:</span></dt>
<dd>李乾坤</dd>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</dl>
</li>
</ul>
@ -95,24 +177,44 @@ extends com.educoder.jenkins.controller.BaseController</pre>
</a>
<h3>方法概要</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
<<<<<<< HEAD
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
=======
<caption><span id="t0" class="activeTableTab"><span>所有方法</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">实例方法</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">具体方法</a></span><span class="tabEnd">&nbsp;</span></span></caption>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<tr>
<th class="colFirst" scope="col">限定符和类型</th>
<th class="colLast" scope="col">方法和说明</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>com.alibaba.fastjson.JSONObject</code></td>
<<<<<<< HEAD
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/educoder/jenkins/controller/GameController.html#deleteJob-java.lang.String-">deleteJob</a></span>(java.lang.String&nbsp;jobName)</code>&nbsp;</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>java.lang.String</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/educoder/jenkins/controller/GameController.html#generatePipelineScriptForChallenge-java.lang.String-">generatePipelineScriptForChallenge</a></span>(java.lang.String&nbsp;challengeInfo)</code>&nbsp;</td>
=======
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/educoder/jenkins/controller/GameController.html#deleteJob-java.lang.String-">deleteJob</a></span>(java.lang.String&nbsp;jobName)</code>
<div class="block">根据job名称删除指定job</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>java.lang.String</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/educoder/jenkins/controller/GameController.html#generatePipelineScriptForChallenge-java.lang.String-">generatePipelineScriptForChallenge</a></span>(java.lang.String&nbsp;challengeInfo)</code>
<div class="block">逐个生成各个关卡的pipeline。</div>
</td>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>java.lang.String</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/educoder/jenkins/controller/GameController.html#generatePipelineScriptForGame-java.lang.String-">generatePipelineScriptForGame</a></span>(java.lang.String&nbsp;gameInfo)</code>
<<<<<<< HEAD
<div class="block">trustie将各个关卡的pipeline连同运行环境以JSON格式传给中间层服务器
中间层服务器接收参数并将其和java.template.pipeline这一模板进行组成 生成整个Job的总脚本。</div>
=======
<div class="block">生成整个实训的pipeline<br></div>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</td>
</tr>
<tr id="i3" class="rowColor">
@ -123,11 +225,17 @@ extends com.educoder.jenkins.controller.BaseController</pre>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>com.alibaba.fastjson.JSONObject</code></td>
<<<<<<< HEAD
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/educoder/jenkins/controller/GameController.html#publishGame-java.lang.String-">publishGame</a></span>(java.lang.String&nbsp;gameInfo)</code>&nbsp;</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/educoder/jenkins/controller/GameController.html#test--">test</a></span>()</code>&nbsp;</td>
=======
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/educoder/jenkins/controller/GameController.html#publishGame-java.lang.String-">publishGame</a></span>(java.lang.String&nbsp;gameInfo)</code>
<div class="block">发布实训并将测试用例写入服务器的文件中.</div>
</td>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</tr>
</table>
<ul class="blockList">
@ -175,6 +283,7 @@ extends com.educoder.jenkins.controller.BaseController</pre>
<!-- -->
</a>
<h3>方法详细资料</h3>
<<<<<<< HEAD
<a name="test--">
<!-- -->
</a>
@ -186,10 +295,14 @@ public&nbsp;void&nbsp;test()</pre>
</li>
</ul>
<a name="publishGame-java.lang.String-">
=======
<a name="deleteJob-java.lang.String-">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<<<<<<< HEAD
<h4>publishGame</h4>
<pre>@RequestMapping(path="/publishGame")
public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;publishGame(@RequestParam
@ -204,6 +317,21 @@ public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;publishGame(@RequestParam
<dd><code>java.net.URISyntaxException</code></dd>
<dd><code>java.io.IOException</code></dd>
<dd><code>java.lang.Exception</code></dd>
=======
<h4>deleteJob</h4>
<pre>@RequestMapping(path="/deleteJob")
public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;deleteJob(@RequestParam
java.lang.String&nbsp;jobName)
throws java.io.IOException</pre>
<div class="block">根据job名称删除指定job</div>
<dl>
<dt><span class="paramLabel">参数:</span></dt>
<dd><code>jobName</code> - 需要删除的job名称</dd>
<dt><span class="returnLabel">返回:</span></dt>
<dd>-1 删除失败0 删除成功</dd>
<dt><span class="throwsLabel">抛出:</span></dt>
<dd><code>java.io.IOException</code></dd>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</dl>
</li>
</ul>
@ -213,12 +341,25 @@ public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;publishGame(@RequestParam
<ul class="blockList">
<li class="blockList">
<h4>generatePipelineScriptForChallenge</h4>
<<<<<<< HEAD
<pre>public&nbsp;java.lang.String&nbsp;generatePipelineScriptForChallenge(@RequestParam
java.lang.String&nbsp;challengeInfo)
throws java.lang.Exception</pre>
<dl>
<dt><span class="throwsLabel">抛出:</span></dt>
<dd><code>java.lang.Exception</code></dd>
=======
<pre>public&nbsp;java.lang.String&nbsp;generatePipelineScriptForChallenge(java.lang.String&nbsp;challengeInfo)
throws java.lang.Exception</pre>
<div class="block">逐个生成各个关卡的pipeline。</div>
<dl>
<dt><span class="paramLabel">参数:</span></dt>
<dd><code>challengeInfo</code> - 各个关卡的信息</dd>
<dt><span class="returnLabel">返回:</span></dt>
<dd>各个关卡的pipeline的组合</dd>
<dt><span class="throwsLabel">抛出:</span></dt>
<dd><code>java.lang.Exception</code> - <p>challengeInfo的格式请参考<code>publishGame</code>中的参数介绍</dd>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</dl>
</li>
</ul>
@ -228,6 +369,7 @@ public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;publishGame(@RequestParam
<ul class="blockList">
<li class="blockList">
<h4>generatePipelineScriptForGame</h4>
<<<<<<< HEAD
<pre>public&nbsp;java.lang.String&nbsp;generatePipelineScriptForGame(@RequestParam
java.lang.String&nbsp;gameInfo)</pre>
<div class="block">trustie将各个关卡的pipeline连同运行环境以JSON格式传给中间层服务器
@ -236,6 +378,19 @@ public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;publishGame(@RequestParam
<dt><span class="paramLabel">参数:</span></dt>
<dd><code>gameInfo</code> - </dd>
<dt><span class="returnLabel">返回:</span></dt>
=======
<pre>public&nbsp;java.lang.String&nbsp;generatePipelineScriptForGame(java.lang.String&nbsp;gameInfo)
throws com.educoder.jenkins.Exceptions.ExceptionOfEnvironmentNotExist,
java.lang.ClassCastException</pre>
<div class="block">生成整个实训的pipeline<br></div>
<dl>
<dt><span class="paramLabel">参数:</span></dt>
<dd><code>gameInfo</code> - 实训的各种配置信息</dd>
<dt><span class="returnLabel">返回:</span></dt>
<dt><span class="throwsLabel">抛出:</span></dt>
<dd><code>com.educoder.jenkins.Exceptions.ExceptionOfEnvironmentNotExist</code></dd>
<dd><code>java.lang.ClassCastException</code> - <p>gameInfo的具体格式请参见<code>publishGame</code></dd>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</dl>
</li>
</ul>
@ -259,11 +414,16 @@ public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;openGameInstance(@RequestParam
</dl>
</li>
</ul>
<<<<<<< HEAD
<a name="deleteJob-java.lang.String-">
=======
<a name="publishGame-java.lang.String-">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<<<<<<< HEAD
<h4>deleteJob</h4>
<pre>@RequestMapping(path="/deleteJob")
public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;deleteJob(@RequestParam
@ -272,6 +432,35 @@ public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;deleteJob(@RequestParam
<dl>
<dt><span class="throwsLabel">抛出:</span></dt>
<dd><code>java.io.IOException</code></dd>
=======
<h4>publishGame</h4>
<pre>@RequestMapping(path="/publishGame")
public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;publishGame(@RequestParam
java.lang.String&nbsp;gameInfo)
throws java.lang.Exception</pre>
<div class="block">发布实训并将测试用例写入服务器的文件中.<br>并监控写测试用例的结果等其出错时返回指定信息给trustie<br>
<p>gameInfo的格式如下
gameInfo:{"gameID":"123","operationEnvironment": "Python",
"challengeInfo":[{"challengeStage":"1","challengeType":1,"challengeProgramName":"hello.py","operationEnvironment":"Python","trainingID":"1"}],
"testCases":[{"challengeStage":"1","challengeTestCases":[{"caseId":"35","input":"1","output":"1","isPublic":"1"}]}]
}
challengeStage:当前关卡<br>
operationEnvironment:运行环境<br>
challengeProgramName:执行文件<br>
trainingID:对应每一实训的唯一ID<br>
testCases:包含测试集输入输出信息的JSON数组</div>
<dl>
<dt><span class="paramLabel">参数:</span></dt>
<dd><code>gameInfo:实训的各种配置信息</code> - </dd>
<dt><span class="returnLabel">返回:</span></dt>
<dd>写测试用例是否成功。code0 写入成功;-1 写入失败</dd>
<dt><span class="throwsLabel">抛出:</span></dt>
<dd><code>java.net.URISyntaxException</code></dd>
<dd><code>java.io.IOException</code></dd>
<dd><code>java.lang.Exception</code></dd>
<dt><span class="seeLabel">另请参阅:</span></dt>
<dd><a href="../../../../com/educoder/jenkins/controller/GameController.html#generateTestCasesForGame-java.lang.String-java.lang.String-"><code>generateTestCasesForGame(java.lang.String, java.lang.String)</code></a></dd>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</dl>
</li>
</ul>
@ -282,5 +471,68 @@ public&nbsp;com.alibaba.fastjson.JSONObject&nbsp;deleteJob(@RequestParam
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<<<<<<< HEAD
=======
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../../../../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li class="navBarCell1Rev"></li>
<li><a href="class-use/GameController.html">使用</a></li>
<li><a href="package-tree.html"></a></li>
<li><a href="../../../../index-files/index-1.html">索引</a></li>
<li><a href="../../../../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个类</li>
<li>下一个类</li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?com/educoder/jenkins/controller/GameController.html" target="_top">框架</a></li>
<li><a href="GameController.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">方法</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</body>
</html>

View File

@ -0,0 +1,121 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="zh">
<head>
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>类 com.educoder.jenkins.controller.GameController的使用</title>
<meta name="date" content="2017-06-20">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="\u7C7B com.educoder.jenkins.controller.GameController\u7684\u4F7F\u7528";
}
}
catch(err) {
}
//-->
</script>
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../../../../../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li><a href="../../../../../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类"></a></li>
<li class="navBarCell1Rev">使用</li>
<li><a href="../../../../../overview-tree.html"></a></li>
<li><a href="../../../../../index-files/index-1.html">索引</a></li>
<li><a href="../../../../../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?com/educoder/jenkins/controller/class-use/GameController.html" target="_top">框架</a></li>
<li><a href="GameController.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<h2 title="类的使用 com.educoder.jenkins.controller.GameController" class="title">类的使用<br>com.educoder.jenkins.controller.GameController</h2>
</div>
<div class="classUseContainer">没有com.educoder.jenkins.controller.GameController的用法</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../../../../../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li><a href="../../../../../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类"></a></li>
<li class="navBarCell1Rev">使用</li>
<li><a href="../../../../../overview-tree.html"></a></li>
<li><a href="../../../../../index-files/index-1.html">索引</a></li>
<li><a href="../../../../../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?com/educoder/jenkins/controller/class-use/GameController.html" target="_top">框架</a></li>
<li><a href="GameController.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>com.educoder.jenkins.controller</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>com.educoder.jenkins.controller</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../script.js"></script>
</head>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>com.educoder.jenkins.controller</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>com.educoder.jenkins.controller</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../script.js"></script>
</head>
@ -23,6 +30,54 @@
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<<<<<<< HEAD
=======
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../../../../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li><a href="package-use.html">使用</a></li>
<li><a href="package-tree.html"></a></li>
<li><a href="../../../../index-files/index-1.html">索引</a></li>
<li><a href="../../../../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个程序包</li>
<li>下一个程序包</li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?com/educoder/jenkins/controller/package-summary.html" target="_top">框架</a></li>
<li><a href="package-summary.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<div class="header">
<h1 title="程序包" class="title">程序包&nbsp;com.educoder.jenkins.controller</h1>
</div>
@ -38,12 +93,66 @@
<tbody>
<tr class="altColor">
<td class="colFirst"><a href="../../../../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类">GameController</a></td>
<<<<<<< HEAD
<td class="colLast">&nbsp;</td>
=======
<td class="colLast">
<div class="block">生成脚本、发布实训、开启实训、写测试用例、删除job</div>
</td>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</tr>
</tbody>
</table>
</li>
</ul>
</div>
<<<<<<< HEAD
=======
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../../../../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li><a href="package-use.html">使用</a></li>
<li><a href="package-tree.html"></a></li>
<li><a href="../../../../index-files/index-1.html">索引</a></li>
<li><a href="../../../../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个程序包</li>
<li>下一个程序包</li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?com/educoder/jenkins/controller/package-summary.html" target="_top">框架</a></li>
<li><a href="package-summary.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</body>
</html>

View File

@ -0,0 +1,134 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="zh">
<head>
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>com.educoder.jenkins.controller 类分层结构</title>
<meta name="date" content="2017-06-20">
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="com.educoder.jenkins.controller \u7C7B\u5206\u5C42\u7ED3\u6784";
}
}
catch(err) {
}
//-->
</script>
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../../../../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li class="navBarCell1Rev"></li>
<li><a href="../../../../index-files/index-1.html">索引</a></li>
<li><a href="../../../../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?com/educoder/jenkins/controller/package-tree.html" target="_top">框架</a></li>
<li><a href="package-tree.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<h1 class="title">程序包com.educoder.jenkins.controller的分层结构</h1>
</div>
<div class="contentContainer">
<h2 title="类分层结构">类分层结构</h2>
<ul>
<li type="circle">java.lang.Object
<ul>
<li type="circle">com.educoder.jenkins.controller.BaseController
<ul>
<li type="circle">com.educoder.jenkins.controller.<a href="../../../../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类"><span class="typeNameLink">GameController</span></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../../../../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li class="navBarCell1Rev"></li>
<li><a href="../../../../index-files/index-1.html">索引</a></li>
<li><a href="../../../../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?com/educoder/jenkins/controller/package-tree.html" target="_top">框架</a></li>
<li><a href="package-tree.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>

View File

@ -0,0 +1,141 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="zh">
<head>
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>程序包 com.educoder.jenkins.controller的使用</title>
<meta name="date" content="2017-06-20">
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="\u7A0B\u5E8F\u5305 com.educoder.jenkins.controller\u7684\u4F7F\u7528";
}
}
catch(err) {
}
//-->
</script>
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../../../../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li class="navBarCell1Rev">使用</li>
<li><a href="package-tree.html"></a></li>
<li><a href="../../../../index-files/index-1.html">索引</a></li>
<li><a href="../../../../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?com/educoder/jenkins/controller/package-use.html" target="_top">框架</a></li>
<li><a href="package-use.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<h1 title="程序包的使用 com.educoder.jenkins.controller" class="title">程序包的使用<br>com.educoder.jenkins.controller</h1>
</div>
<div class="contentContainer">
<ul class="blockList">
<li class="blockList"><a name="com.educoder.jenkins.controller">
<!-- -->
</a>
<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表类和解释">
<caption><span><a href="../../../../com/educoder/jenkins/controller/package-summary.html">com.educoder.jenkins.controller</a>使用的<a href="../../../../com/educoder/jenkins/controller/package-summary.html">com.educoder.jenkins.controller</a>中的类</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colOne" scope="col">类和说明</th>
</tr>
<tbody>
<tr class="altColor">
<td class="colOne"><a href="../../../../com/educoder/jenkins/controller/class-use/BaseController.html#com.educoder.jenkins.controller">BaseController</a>
<div class="block">Created by guange on 26/02/2017.</div>
</td>
</tr>
</tbody>
</table>
</li>
</ul>
</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../../../../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li class="navBarCell1Rev">使用</li>
<li><a href="package-tree.html"></a></li>
<li><a href="../../../../index-files/index-1.html">索引</a></li>
<li><a href="../../../../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?com/educoder/jenkins/controller/package-use.html" target="_top">框架</a></li>
<li><a href="package-use.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>常量字段值</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>常量字段值</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script type="text/javascript" src="script.js"></script>
</head>
@ -23,9 +30,105 @@
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<<<<<<< HEAD
=======
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="overview-tree.html"></a></li>
<li><a href="index-files/index-1.html">索引</a></li>
<li><a href="help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="index.html?constant-values.html" target="_top">框架</a></li>
<li><a href="constant-values.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<div class="header">
<h1 title="常量字段值" class="title">常量字段值</h1>
<h2 title="目录">目录</h2>
</div>
<<<<<<< HEAD
=======
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="overview-tree.html"></a></li>
<li><a href="index-files/index-1.html">索引</a></li>
<li><a href="help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="index.html?constant-values.html" target="_top">框架</a></li>
<li><a href="constant-values.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</body>
</html>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>API 帮助</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>API 帮助</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script type="text/javascript" src="script.js"></script>
</head>
@ -23,6 +30,54 @@
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<<<<<<< HEAD
=======
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="overview-tree.html"></a></li>
<li><a href="index-files/index-1.html">索引</a></li>
<li class="navBarCell1Rev">帮助</li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="index.html?help-doc.html" target="_top">框架</a></li>
<li><a href="help-doc.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<div class="header">
<h1 class="title">此 API 文档的组织方式</h1>
<div class="subTitle">此 API (应用程序编程接口) 文档包含对应于导航栏中的项目的页面, 如下所述。</div>
@ -87,8 +142,21 @@
</ul>
</li>
<li class="blockList">
<<<<<<< HEAD
<h2>已过时的 API</h2>
<p><a href="deprecated-list.html">已过时的 API</a> 页面列出了所有已过时的 API。一般由于进行了改进并且通常提供了替代的 API, 所以建议不要使用已过时的 API。在将来的实现过程中, 可能会删除已过时的 API。</p>
=======
<h2>使用</h2>
<p>每个已文档化的程序包, 类和接口都有各自的“使用”页面。此页面介绍了使用给定类或程序包的任何部分的程序包, 类, 方法, 构造器和字段。对于给定的类或接口 A, 其“使用”页面包含 A 的子类, 声明为 A 的字段, 返回 A 的方法, 以及带有类型为 A 的参数的方法和构造器。访问此页面的方法是: 首先转至程序包, 类或接口, 然后单击导航栏中的 "使用" 链接。</p>
</li>
<li class="blockList">
<h2>树 (类分层结构)</h2>
<p>对于所有程序包, 有一个<a href="overview-tree.html">类分层结构</a>页面, 以及每个程序包的分层结构。每个分层结构页面都包含类的列表和接口的列表。从<code>java.lang.Object</code>开始, 按继承结构对类进行排列。接口不从<code>java.lang.Object</code>继承。</p>
<ul>
<li>查看“概览”页面时, 单击 "树" 将显示所有程序包的分层结构。</li>
<li>查看特定程序包, 类或接口页面时, 单击 "树" 将仅显示该程序包的分层结构。</li>
</ul>
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</li>
<li class="blockList">
<h2>索引</h2>
@ -116,5 +184,53 @@
</li>
</ul>
<span class="emphasizedPhrase">此帮助文件适用于使用标准 doclet 生成的 API 文档。</span></div>
<<<<<<< HEAD
=======
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="overview-tree.html"></a></li>
<li><a href="index-files/index-1.html">索引</a></li>
<li class="navBarCell1Rev">帮助</li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="index.html?help-doc.html" target="_top">框架</a></li>
<li><a href="help-doc.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</body>
</html>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>C - 索引</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>C - 索引</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
<script type="text/javascript" src="../script.js"></script>
</head>
@ -23,7 +30,56 @@
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<<<<<<< HEAD
<div class="contentContainer"><a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a href="index-6.html">T</a>&nbsp;<a name="I:C">
=======
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="../overview-tree.html"></a></li>
<li class="navBarCell1Rev">索引</li>
<li><a href="../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个字母</li>
<li><a href="index-2.html">下一个字母</a></li>
</ul>
<ul class="navList">
<li><a href="../index.html?index-files/index-1.html" target="_top">框架</a></li>
<li><a href="index-1.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="contentContainer"><a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a name="I:C">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<!-- -->
</a>
<h2 class="title">C</h2>
@ -31,6 +87,55 @@
<dt><a href="../com/educoder/jenkins/controller/package-summary.html">com.educoder.jenkins.controller</a> - 程序包 com.educoder.jenkins.controller</dt>
<dd>&nbsp;</dd>
</dl>
<<<<<<< HEAD
<a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a href="index-6.html">T</a>&nbsp;</div>
=======
<a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="../overview-tree.html"></a></li>
<li class="navBarCell1Rev">索引</li>
<li><a href="../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个字母</li>
<li><a href="index-2.html">下一个字母</a></li>
</ul>
<ul class="navList">
<li><a href="../index.html?index-files/index-1.html" target="_top">框架</a></li>
<li><a href="index-1.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</body>
</html>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>D - 索引</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>D - 索引</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
<script type="text/javascript" src="../script.js"></script>
</head>
@ -23,14 +30,116 @@
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<<<<<<< HEAD
<div class="contentContainer"><a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a href="index-6.html">T</a>&nbsp;<a name="I:D">
=======
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="../overview-tree.html"></a></li>
<li class="navBarCell1Rev">索引</li>
<li><a href="../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="index-1.html">上一个字母</a></li>
<li><a href="index-3.html">下一个字母</a></li>
</ul>
<ul class="navList">
<li><a href="../index.html?index-files/index-2.html" target="_top">框架</a></li>
<li><a href="index-2.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="contentContainer"><a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a name="I:D">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<!-- -->
</a>
<h2 class="title">D</h2>
<dl>
<dt><span class="memberNameLink"><a href="../com/educoder/jenkins/controller/GameController.html#deleteJob-java.lang.String-">deleteJob(String)</a></span> - 类 中的方法com.educoder.jenkins.controller.<a href="../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类">GameController</a></dt>
<<<<<<< HEAD
<dd>&nbsp;</dd>
</dl>
<a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a href="index-6.html">T</a>&nbsp;</div>
=======
<dd>
<div class="block">根据job名称删除指定job</div>
</dd>
</dl>
<a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="../overview-tree.html"></a></li>
<li class="navBarCell1Rev">索引</li>
<li><a href="../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="index-1.html">上一个字母</a></li>
<li><a href="index-3.html">下一个字母</a></li>
</ul>
<ul class="navList">
<li><a href="../index.html?index-files/index-2.html" target="_top">框架</a></li>
<li><a href="index-2.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</body>
</html>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>G - 索引</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>G - 索引</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
<script type="text/javascript" src="../script.js"></script>
</head>
@ -23,12 +30,62 @@
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<<<<<<< HEAD
<div class="contentContainer"><a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a href="index-6.html">T</a>&nbsp;<a name="I:G">
=======
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="../overview-tree.html"></a></li>
<li class="navBarCell1Rev">索引</li>
<li><a href="../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="index-2.html">上一个字母</a></li>
<li><a href="index-4.html">下一个字母</a></li>
</ul>
<ul class="navList">
<li><a href="../index.html?index-files/index-3.html" target="_top">框架</a></li>
<li><a href="index-3.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="contentContainer"><a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a name="I:G">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<!-- -->
</a>
<h2 class="title">G</h2>
<dl>
<dt><a href="../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类"><span class="typeNameLink">GameController</span></a> - <a href="../com/educoder/jenkins/controller/package-summary.html">com.educoder.jenkins.controller</a>中的类</dt>
<<<<<<< HEAD
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="../com/educoder/jenkins/controller/GameController.html#GameController--">GameController()</a></span> - 类 的构造器com.educoder.jenkins.controller.<a href="../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类">GameController</a></dt>
<dd>&nbsp;</dd>
@ -41,5 +98,67 @@
</dd>
</dl>
<a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a href="index-6.html">T</a>&nbsp;</div>
=======
<dd>
<div class="block">生成脚本、发布实训、开启实训、写测试用例、删除job</div>
</dd>
<dt><span class="memberNameLink"><a href="../com/educoder/jenkins/controller/GameController.html#GameController--">GameController()</a></span> - 类 的构造器com.educoder.jenkins.controller.<a href="../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类">GameController</a></dt>
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="../com/educoder/jenkins/controller/GameController.html#generatePipelineScriptForChallenge-java.lang.String-">generatePipelineScriptForChallenge(String)</a></span> - 类 中的方法com.educoder.jenkins.controller.<a href="../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类">GameController</a></dt>
<dd>
<div class="block">逐个生成各个关卡的pipeline。</div>
</dd>
<dt><span class="memberNameLink"><a href="../com/educoder/jenkins/controller/GameController.html#generatePipelineScriptForGame-java.lang.String-">generatePipelineScriptForGame(String)</a></span> - 类 中的方法com.educoder.jenkins.controller.<a href="../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类">GameController</a></dt>
<dd>
<div class="block">生成整个实训的pipeline<br></div>
</dd>
</dl>
<a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="../overview-tree.html"></a></li>
<li class="navBarCell1Rev">索引</li>
<li><a href="../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="index-2.html">上一个字母</a></li>
<li><a href="index-4.html">下一个字母</a></li>
</ul>
<ul class="navList">
<li><a href="../index.html?index-files/index-3.html" target="_top">框架</a></li>
<li><a href="index-3.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</body>
</html>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>O - 索引</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>O - 索引</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
<script type="text/javascript" src="../script.js"></script>
</head>
@ -23,7 +30,56 @@
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<<<<<<< HEAD
<div class="contentContainer"><a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a href="index-6.html">T</a>&nbsp;<a name="I:O">
=======
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="../overview-tree.html"></a></li>
<li class="navBarCell1Rev">索引</li>
<li><a href="../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="index-3.html">上一个字母</a></li>
<li><a href="index-5.html">下一个字母</a></li>
</ul>
<ul class="navList">
<li><a href="../index.html?index-files/index-4.html" target="_top">框架</a></li>
<li><a href="index-4.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="contentContainer"><a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a name="I:O">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<!-- -->
</a>
<h2 class="title">O</h2>
@ -31,6 +87,55 @@
<dt><span class="memberNameLink"><a href="../com/educoder/jenkins/controller/GameController.html#openGameInstance-java.lang.String-java.lang.String-java.lang.String-">openGameInstance(String, String, String)</a></span> - 类 中的方法com.educoder.jenkins.controller.<a href="../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类">GameController</a></dt>
<dd>&nbsp;</dd>
</dl>
<<<<<<< HEAD
<a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a href="index-6.html">T</a>&nbsp;</div>
=======
<a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="../overview-tree.html"></a></li>
<li class="navBarCell1Rev">索引</li>
<li><a href="../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="index-3.html">上一个字母</a></li>
<li><a href="index-5.html">下一个字母</a></li>
</ul>
<ul class="navList">
<li><a href="../index.html?index-files/index-4.html" target="_top">框架</a></li>
<li><a href="index-4.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</body>
</html>

View File

@ -2,10 +2,17 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>P - 索引</title>
<meta name="date" content="2017-06-19">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>P - 索引</title>
<meta name="date" content="2017-06-20">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<link rel="stylesheet" type="text/css" href="../stylesheet.css" title="Style">
<script type="text/javascript" src="../script.js"></script>
</head>
@ -23,14 +30,116 @@
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<<<<<<< HEAD
<div class="contentContainer"><a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a href="index-6.html">T</a>&nbsp;<a name="I:P">
=======
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="../overview-tree.html"></a></li>
<li class="navBarCell1Rev">索引</li>
<li><a href="../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="index-4.html">上一个字母</a></li>
<li>下一个字母</li>
</ul>
<ul class="navList">
<li><a href="../index.html?index-files/index-5.html" target="_top">框架</a></li>
<li><a href="index-5.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="contentContainer"><a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a name="I:P">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<!-- -->
</a>
<h2 class="title">P</h2>
<dl>
<dt><span class="memberNameLink"><a href="../com/educoder/jenkins/controller/GameController.html#publishGame-java.lang.String-">publishGame(String)</a></span> - 类 中的方法com.educoder.jenkins.controller.<a href="../com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类">GameController</a></dt>
<<<<<<< HEAD
<dd>&nbsp;</dd>
</dl>
<a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;<a href="index-6.html">T</a>&nbsp;</div>
=======
<dd>
<div class="block">发布实训并将测试用例写入服务器的文件中.</div>
</dd>
</dl>
<a href="index-1.html">C</a>&nbsp;<a href="index-2.html">D</a>&nbsp;<a href="index-3.html">G</a>&nbsp;<a href="index-4.html">O</a>&nbsp;<a href="index-5.html">P</a>&nbsp;</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="../com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li><a href="../overview-tree.html"></a></li>
<li class="navBarCell1Rev">索引</li>
<li><a href="../help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="index-4.html">上一个字母</a></li>
<li>下一个字母</li>
</ul>
<ul class="navList">
<li><a href="../index.html?index-files/index-5.html" target="_top">框架</a></li>
<li><a href="index-5.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
</body>
</html>

View File

@ -2,8 +2,13 @@
<!-- NewPage -->
<html lang="zh">
<head>
<<<<<<< HEAD
<!-- Generated by javadoc (1.8.0_31) on Mon Jun 19 23:12:32 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
=======
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
<title>生成的文档 (无标题)</title>
<script type="text/javascript">
targetPage = "" + window.location.search;

View File

@ -0,0 +1,138 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="zh">
<head>
<!-- Generated by javadoc (1.8.0_101) on Tue Jun 20 15:47:35 CST 2017 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>类分层结构</title>
<meta name="date" content="2017-06-20">
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script type="text/javascript" src="script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="\u7C7B\u5206\u5C42\u7ED3\u6784";
}
}
catch(err) {
}
//-->
</script>
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li class="navBarCell1Rev"></li>
<li><a href="index-files/index-1.html">索引</a></li>
<li><a href="help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="index.html?overview-tree.html" target="_top">框架</a></li>
<li><a href="overview-tree.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<h1 class="title">所有程序包的分层结构</h1>
<span class="packageHierarchyLabel">程序包分层结构:</span>
<ul class="horizontal">
<li><a href="com/educoder/jenkins/controller/package-tree.html">com.educoder.jenkins.controller</a></li>
</ul>
</div>
<div class="contentContainer">
<h2 title="类分层结构">类分层结构</h2>
<ul>
<li type="circle">java.lang.Object
<ul>
<li type="circle">com.educoder.jenkins.controller.BaseController
<ul>
<li type="circle">com.educoder.jenkins.controller.<a href="com/educoder/jenkins/controller/GameController.html" title="com.educoder.jenkins.controller中的类"><span class="typeNameLink">GameController</span></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="跳过导航链接">跳过导航链接</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="导航">
<li><a href="com/educoder/jenkins/controller/package-summary.html">程序包</a></li>
<li></li>
<li>使用</li>
<li class="navBarCell1Rev"></li>
<li><a href="index-files/index-1.html">索引</a></li>
<li><a href="help-doc.html">帮助</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>上一个</li>
<li>下一个</li>
</ul>
<ul class="navList">
<li><a href="index.html?overview-tree.html" target="_top">框架</a></li>
<li><a href="overview-tree.html" target="_top">无框架</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="allclasses-noframe.html">所有类</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>

View File

@ -463,7 +463,10 @@ Table styles
.useSummary td, .constantsSummary td, .deprecatedSummary td {
text-align:left;
padding:0px 0px 12px 10px;
<<<<<<< HEAD
width:100%;
=======
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
}
th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th,
td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{
@ -488,6 +491,10 @@ td.colOne, th.colOne {
font-size:13px;
}
.overviewSummary td.colFirst, .overviewSummary th.colFirst,
<<<<<<< HEAD
=======
.useSummary td.colFirst, .useSummary th.colFirst,
>>>>>>> 12fb6f47c902505f46da98021b603f449b739e4f
.overviewSummary td.colOne, .overviewSummary th.colOne,
.memberSummary td.colFirst, .memberSummary th.colFirst,
.memberSummary td.colOne, .memberSummary th.colOne,

View File

@ -69,7 +69,7 @@ public class JenkinsApi {
return jenkins.createJob(jobName, xml);
} catch (IOException e) {
// TODO: handle exception
throw new ExceptionOfJobNoExist("job 已经存在",e.getCause());
throw new ExceptionOfJobNoExist("job 创建不成功",e.getCause());
}
}
@ -77,8 +77,9 @@ public class JenkinsApi {
public void updateJob(String jobName, String pipeLine, Map<String, String> params) throws IOException {
//首先得对pipeline转义
Job job=jenkins.getJobs().get(jobName);
if(job == null) return;
String xml = makeJobXml(pipeLine, params);
jenkins.updateJob(jobName, xml);
jenkins.updateJob(jobName, xml,false);
}
/*
@ -97,14 +98,14 @@ public class JenkinsApi {
return 0;
}catch (Exception e)
{
logger.error("delete job failed while job exists");
logger.error("delete job :" + jobName + " failed while job exists");
return -1;
}
}
else
{
logger.info("job does not exists");
logger.info("job :" + jobName + " does not exists");
return 1;
}

View File

@ -27,8 +27,8 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.io.IOException;
import java.net.URISyntaxException;
import com.educoder.jenkins.Exceptions.ExceptionOfEnvironmentNotExist;
import com.educoder.jenkins.model.*;
/**
* @author lqk
* @version 0.1
@ -54,155 +54,156 @@ public class GameController extends BaseController {
private final static Logger logger = LoggerFactory.getLogger(GameController.class);
@RequestMapping(path = "/test")
public void test() {
logger.debug(pipeLineConfig.getEnvironment().get(0));
}
/**
* @param gameInfo:实训信息 <p>发布实训存储测试用例到服务器 </p>
* @return 返回一个存储是否成功code和msg
*
* 发布实训并将测试用例写入服务器的文件中.<br>并监控写测试用例的结果等其出错时返回指定信息给trustie<br>
*@param gameInfo:实训的各种配置信息
* <p>gameInfo的格式如下
* gameInfo:{"gameID":"123","operationEnvironment": "Python",
* "challengeInfo":[{"challengeStage":"1","challengeType":1,"challengeProgramName":"hello.py","operationEnvironment":"Python","trainingID":"1"}],
* "testCases":[{"challengeStage":"1","challengeTestCases":[{"caseId":"35","input":"1","output":"1","isPublic":"1"}]}]
* }
* challengeStage:当前关卡<br>
* operationEnvironment:运行环境<br>
* challengeProgramName:执行文件<br>
* trainingID:对应每一实训的唯一ID<br>
* testCases:包含测试集输入输出信息的JSON数组
* @return 写测试用例是否成功code0 写入成功;-1 写入失败
* @throws URISyntaxException
* @throws IOException
*
* @see #generateTestCasesForGame
*/
@RequestMapping(path = "/publishGame")
@ApiOperation(value = "发布实训", httpMethod = "POST", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public JSONObject publishGame(
@ApiParam(name = "gameInfo", required = true, value = "游戏信息") @RequestParam String gameInfo)
public JSONObject publishGame(@ApiParam(name = "gameInfo", required = true, value = "游戏信息") @RequestParam String gameInfo)
throws Exception {
logger.debug(gameInfo);
logger.debug("/game/publishGame/" + gameInfo);
JSONObject response = new JSONObject();
/**
* 不需要生成脚本脚本不存储在trusite每次需要的时候重新生成
*/
// 将前端以JSON传送过来的各个关卡的信息以及其他设置和java.template.pipeline拼装成整个游戏的脚本
// response = generatePipelineScriptForGame(gameInfo);
// 将字符串转换为JSON对象
// 将字符串解码后转换为JSON对象
gameInfo=Base64Helper.replaceDecode(gameInfo);
JSONObject info = JSONObject.parseObject(gameInfo);
// 将测试用例写入工作目录下的文件中
Key_Value result = generateTestCasesForGame(info.getString("trainingID"),
JSONArray.toJSONString(info.getJSONArray("testCases")));
response.put("code", result.getCode());
response.put("msg", result.getMsg());
logger.debug(response.toJSONString());
logger.debug("/game/publishGame/: response:" + response.toJSONString());
return response;
}
/**
* 逐个生成各个关卡的pipeline
* @param challengeInfo 各个关卡的信息
* @return 各个关卡的pipeline的组合
* @throws Exception
* <p>challengeInfo的格式请参考{@link publishGame}中的参数介绍
*/
public String generatePipelineScriptForChallenge(String challengeInfo) throws Exception {
logger.debug("challengeInfo:" + challengeInfo);
JSONArray challenge = JSONObject.parseArray(challengeInfo);
String channgePipeline = "";
Map<String, String> params = new HashMap<String, String>();
//循环生成各个关卡的pipeline
for(int i = 0; i < challenge.size(); i++)
{
String pipeline="";
JSONObject stageInfo = challenge.getJSONObject(i);
//第几关
String challengeStage = stageInfo.getString("challengeStage");
// challengeType:评测方式输入输出
String challengeType = stageInfo.getString("challengeType");
// 文件路径前台默认打开供用户编辑的的文件后续要把名称区别名称
String challengeProgramName = stageInfo.getString("challengeProgramName");
//运行环境
String operationEnvironment = stageInfo.getString("operationEnvironment");
// 前端生成的实训Id
String trainingID = stageInfo.getString("trainingID");
/*
* 利用spring的反射机理对应pipelineconfig类配置了一个链表配置文件中对应某一实
* 训的各种配置是一一对应的,因此需要根据运行环境去判断其对应的配置
*/
int index = pipeLineConfig.getEnvironment().indexOf(operationEnvironment);
if (index == -1) {
throw new ExceptionOfEnvironmentNotExist("环境不存在");
}
params.put("challengeType", challengeType);
params.put("challengeStage", challengeStage);
params.put("challengeProgramName", challengeProgramName);
params.put("operationEnvironment", operationEnvironment);
params.put("trainingID", trainingID);
params.put("complieCommand", pipeLineConfig.getComplieCommand().get(index));
params.put("executeCommand", pipeLineConfig.getExecuteCommand().get(index));
params.put("challengeTemplateFileName", pipeLineConfig.getChallengeTemplateFileName().get(index));
params.put("replaceExecuteCommand", pipeLineConfig.getReplaceExecuteCommand().get(index));
GeneratePipeline generatePipeline = (GeneratePipeline) Class.forName(pipeLineConfig.getClassName().get(index)).newInstance();
public String generatePipelineScriptForChallenge(
@ApiParam(name = "challengeInfo", required = true, value = "关卡信息") @RequestParam String challengeInfo)
throws Exception {
logger.debug(challengeInfo);
pipeline = generatePipeline.generateChallengePipeline(params);
channgePipeline = channgePipeline + System.getProperty("line.separator") + pipeline;
//
// Map<String, String> params = new HashMap<String, String>();
//
//
// // 提取trustie传递来的信息
// // 解析JSON字符串
//
// // challengeStage第几关
// String challengeStage = challengeInfo.get("challengeStage");
// // challengeType:评测方式输入输出
// String challengeType = challengeInfo.get("challengeType");
// // 文件路径前台默认打开供用户编辑的的文件后续要把名称区别名称
// String challengeProgramName = challengeInfo.get("challengeProgramName");
// String operationEnvironment = challengeInfo.get("operationEnvironment");
// // 前端生成的实训Id
// String trainingID = challengeInfo.get("trainingID");
//
// String pipeline = "";
// int index = pipeLineConfig.getEnvironment().indexOf(operationEnvironment);
// if (index == -1) {
// throw new ExceptionOfEnvironmentNotExist("环境不存在");
// }
//
// params.put("challengeType", challengeType);
// params.put("challengeStage", challengeStage);
// params.put("challengeProgramName", challengeProgramName);
// params.put("operationEnvironment", operationEnvironment);
// params.put("trainingID", trainingID);
// params.put("complieCommand", pipeLineConfig.getComplieCommand().get(index));
// params.put("executeCommand", pipeLineConfig.getExecuteCommand().get(index));
// params.put("challengeTemplateFileName", pipeLineConfig.getChallengeTemplateFileName().get(index));
// params.put("replaceExecuteCommand", pipeLineConfig.getReplaceExecuteCommand().get(index));
//
// GeneratePipeline generatePipeline = (GeneratePipeline) Class.forName(pipeLineConfig.getClassName().get(index))
// .newInstance();
//
// pipeline = generatePipeline.generateChallengePipeline(params);
//
//
// response.put("code", 0);
// response.put("msg", Base64Helper.encode(pipeline));
// logger.debug(pipeline);
return "";
}
return channgePipeline;
}
/**
* trustie将各个关卡的pipeline连同运行环境以JSON格式传给中间层服务器
* 中间层服务器接收参数并将其和java.template.pipeline这一模板进行组成 生成整个Job的总脚本 gameInfo
*
* @param gameInfo
* 生成整个实训的pipeline<br>
* @param gameInfo 实训的各种配置信息
* @return
* @throws ExceptionOfEnvironmentNotExist
* @throws ClassCastException
* <p>gameInfo的具体格式请参见{@link publishGame}
*/
public String generatePipelineScriptForGame(@ApiParam(name = "gameInfo", required = true, value = "游戏信息脚本用base64编码") @RequestParam String gameInfo)
{
//
// logger.debug(gameInfo);
//
// JSONObject response = new JSONObject();
//
// // 提取trustie传递来的信息
// JSONObject info = JSONObject.parseObject(gameInfo);
//
// // operationEnvironment 代表运行环境
// String operationEnvironment = info.getString("operationEnvironment");
//
// JSONArray challengePipelines = info.getJSONArray("challengePipelines");
//
// int index = pipeLineConfig.getEnvironment().indexOf(operationEnvironment);
// if (index == -1) {
// throw new ExceptionOfEnvironmentNotExist("环境不存在");
// }
//
// StringBuffer challengePipeline = new StringBuffer();
// for (int i = 0; i < challengePipelines.size(); i++) {
// challengePipeline
// .append(Base64Helper.decode((challengePipelines.getJSONObject(i)).getString("challengePipeline")));
// challengePipeline.append("\n\t\t");
// }
//
// Map<String, String> params = new HashMap<String, String>();
//
// params.put("operationEnvironment", operationEnvironment);
// params.put("challengePipeline", new String(challengePipeline));
// params.put("pipelineTemplateFileName", pipeLineConfig.getPipelineTemplateFileName().get(index));
// params.put("podTemplate", pipeLineConfig.getPodTemplate().get(index));
// params.put("mainContainer", pipeLineConfig.getMainContainer().get(index));
// // 根据运行环境分别得到对应的编译和执行命令
// GeneratePipeline generatePipeline = (GeneratePipeline) Class.forName(pipeLineConfig.getClassName().get(index))
// .newInstance();
//
// String pipeline = generatePipeline.generateFullPipeline(params);
//
// response.put("code", 0);
// response.put("msg", Base64Helper.encode(pipeline));
//
// logger.debug(response.toJSONString());
return "";
public String generatePipelineScriptForGame(String gameInfo) throws ExceptionOfEnvironmentNotExist,ClassCastException
{
logger.debug("");
JSONObject game = JSONObject.parseObject(gameInfo);
String operationEnvironment = game.getString("operationEnvironment");
JSONArray challengeInfo = game.getJSONArray("challengeInfo");
int index = pipeLineConfig.getEnvironment().indexOf(operationEnvironment);
logger.debug("获取到运行环境、关卡信息");
if (index == -1) {
throw new ExceptionOfEnvironmentNotExist("环境不存在");
}
Map<String, String> params = new HashMap<String, String>();
String challengePipeline = "";
try {
logger.debug("即将生成关卡pipeline");
challengePipeline = generatePipelineScriptForChallenge(JSONArray.toJSONString(challengeInfo));
logger.debug("已经生成关卡的pipeline");
}catch(Exception e)
{
logger.debug("生成每个关卡的pipeline时报错");
}
params.put("operationEnvironment", operationEnvironment);
params.put("challengePipeline", new String(challengePipeline));
params.put("pipelineTemplateFileName", pipeLineConfig.getPipelineTemplateFileName().get(index));
params.put("podTemplate",pipeLineConfig.getPodTemplate().get(index));
params.put("mainContainer",pipeLineConfig.getMainContainer().get(index));
String pipeline = "";
try {
GeneratePipeline generatePipeline = (GeneratePipeline) Class.forName(pipeLineConfig.getClassName().get(index)).newInstance();
pipeline = generatePipeline.generateFullPipeline(params);
}catch(ClassNotFoundException e)
{
logger.debug("找不到生成pipeline所需要的类");
}catch(Exception ex)
{
logger.debug("生成总体脚本时出错");
}
return pipeline;
}
// gamePipelineScript为前端为传回来的pipeline(前端保存每一个关卡的pipeline及总的pipeline)
@ -213,9 +214,8 @@ public class GameController extends BaseController {
@ApiParam(name = "gameInfo", required = true, value = "游戏信息") @RequestParam String gameInfo,
@ApiParam(name = "instanceGitURL", required = true, value = "job的gitUrl") @RequestParam String instanceGitURL) throws Exception
{
logger.debug(jobNameForInstance + "\t" + gameInfo + "\t" + instanceGitURL);
// 替换PODLABEL为唯一值
logger.debug("jobName:\t" + jobNameForInstance + "\t" + "gameInfo:" + gameInfo + "\t" + "instanceGitURl: " + instanceGitURL);
String gamePipelineScript=generatePipelineScriptForGame(gameInfo);
@ -230,6 +230,8 @@ public class GameController extends BaseController {
/**
* 创建Job写测试用例到worksspace的指定目录下
* 在写入新的测试用例之前需要先把之前写入的测试文件给删除这是为了防止
* 旧的测试用例对新的测试用例产生影响
*
* @param trainingID
* 实训ID
@ -260,40 +262,51 @@ public class GameController extends BaseController {
/**
* 解析参数,创建job
*/
JSONArray cases = JSONObject.parseArray(testCases);
StringBuffer pipeline = new StringBuffer("");
pipeline.append("node(){\n" + "sh script:'rm -rf ../testCases/" + trainingID + "/*'" + "\r\n");
JSONArray cases = JSONObject.parseArray(testCases);
for (int i = 0; i < cases.size(); i++) {
// 获取每个关卡的信息
JSONObject challenge = cases.getJSONObject(i);
String challengeStage = challenge.getString("challengeStage");
JSONArray challengeTestCases = challenge.getJSONArray("challengeTestCases");
// 获取所有的测试用例
for (int j = 1; j <= challengeTestCases.size(); j++) {
JSONObject testCase = challengeTestCases.getJSONObject(j);
for (int j = 1; j <= challengeTestCases.size(); j++) {
JSONObject testCase = challengeTestCases.getJSONObject(j-1);
String input = testCase.getString("input");
String output = testCase.getString("output");
String isPublic = testCase.getString("isPublic");
// 需要注意转义字符pipeline中类似java有些字符需要转义"和'
/*
* 需要注意转义字符pipeline中类似java有些字符需要转义"和'
* 而且在写测试集到文件之前需要先删除之前存在的
*/
String challengePipeline = "writeFile file: '../testCases/" + trainingID + "/" + challengeStage + "/"
+ j + ".in, text: "
+ input.toString().replace("\r\n", "\n").replace("\"", "\\\"").replace("\'", "\\\'") + "\n"
+ j + ".in', text: '"
+ input.toString().replace("\r\n", "\\n").replace("\"", "\\\"").replace("\'", "\\\'") +"'" + "\n"
+ "writeFile file: '../testCases/" + trainingID + "/" + challengeStage + "/" + j
+ ".out', text: '"
+ output.toString().replace("\r\n", "\\n").replace("\"", "\\\"").replace("\'", "\\\'")+ "'" + "\n"
+ "writeFile file: '../testCases/" + trainingID + "/" + challengeStage + "/" + j
+ ".out, text: "
+ output.toString().replace("\r\n", "\n").replace("\"", "\\\"").replace("\'", "\\\'") + "\n"
+ "writeFile file: '../testCases/" + trainingID + "/" + challengeStage + "/" + j
+ ".isPublic, text: "
+ isPublic.toString().replace("\r\n", "\n").replace("\"", "\\\"").replace("\'", "\\\'") + "\n";
+ ".isPublic', text: '"
+ isPublic.toString().replace("\r\n", "\\n").replace("\"", "\\\"").replace("\'", "\\\'") +"'"+ "\n";
pipeline.append(challengePipeline);
}
}
jenkinsApi.createJob(jobName, pipeline.toString(), params);
pipeline.append("}");
// logger.debug("pipeline:" + pipeline.toString());
JobWithDetails job = server.getJob(jobName);
if(job!=null)
{
jenkinsApi.updateJob(jobName, pipeline.toString(), params);
}else {
jenkinsApi.createJob(jobName, pipeline.toString(), params);
}
job = server.getJob(jobName);
job.build(params);
/**
@ -302,7 +315,7 @@ public class GameController extends BaseController {
BuildWithDetails buildWithDetails = null;
for (int i = 0; i < 3; i++) {
try {
Thread.sleep(500);
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@ -339,16 +352,17 @@ public class GameController extends BaseController {
result = new Key_Value(-1, buildWithDetails.getConsoleOutputText());
}
// todo:构建完成之后删除job
server.deleteJob(jobName);
// todo:构建完成之后删除job,每次开始时候判断是否存在存在则更新不存在创建所以不需要删除
// server.deleteJob(jobName);
return result;
}
/*
* @param jobName:要删除的job
* @return 0 删除成功
* -1 删除失败
* */
/**
* 根据job名称删除指定job
* @param jobName 需要删除的job名称
* @return -1 删除失败0 删除成功
* @throws IOException
*/
@ApiOperation(value = "删除Job", httpMethod = "POST", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
@RequestMapping(path = "/deleteJob")
public JSONObject deleteJob(
@ -368,12 +382,10 @@ public class GameController extends BaseController {
* */
if (-1 == result) {
response.put("code", -1);
return response;
}
if (1 == result || 0 == result) {
response.put("code", 0);
return response;
}
logger.debug(response.toJSONString());
return response;

View File

@ -29,9 +29,10 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.*;
import java.util.Iterator;
/**
* Created by guange on 18/02/2017.
* 创建job更新job获取等待时间构建job
* @author 李乾坤
*
*/
@Api(value = "Jenkins控制器", hidden = true)
@RestController
@ -41,7 +42,8 @@ public class JenkinsController extends BaseController {
JenkinsApi jenkinsApi;
@Autowired
AppConfig appConfig;
@Autowired
GameController gameController;
BuildThread buildThreadNew;
private final static Map<String, String> jobMap = new HashMap<String, String>() {
{
@ -56,7 +58,10 @@ public class JenkinsController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(JenkinsController.class);
/**
* 0:job存在并成功删除 -1;job存在未成功删除 1;job 不存在却尝试去删除 2其他未知原因导致删除失败
* 删除指定job
* @param jobNameToDelete 需要删除的job
* @return 0:job存在并成功删除 -1;job存在未成功删除 1;job 不存在却尝试去删除 2其他未知原因导致删除失败
* @throws Exception
*/
@ApiOperation(value = "删除一个job", httpMethod = "POST", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
@ApiResponse(code = 200, message = "success", response = JSONObject.class)
@ -81,6 +86,14 @@ public class JenkinsController extends BaseController {
return response;
}
/**
* 创建一个job
* @param jobNameForInstance job的名称
* @param gamePipelineScript job的pipeline
* @return {code,msg} 创建成功{0,"create job success."}
* 创建失败exception,返回给前端
* @throws IOException
*/
@ApiOperation(value = "创建一个job", httpMethod = "POST", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
@ApiResponse(code = 200, message = "success", response = JSONObject.class)
@RequestMapping(path = "/createJobForInstance", method = RequestMethod.POST)
@ -90,8 +103,6 @@ public class JenkinsController extends BaseController {
throws IOException {
JSONObject response = new JSONObject();
/* long threadCount = ((ThreadPoolExecutor)pool).getTaskCount();
BlockingQueue bq = ((ThreadPoolExecutor)pool).getQueue();*/
Map<String, String> jobParamsMap = jobMap;
gamePipelineScript = Base64Helper.decode(gamePipelineScript);
@ -109,7 +120,20 @@ public class JenkinsController extends BaseController {
logger.debug(response.toJSONString());
return response;
}
/**
* 构建job
* @param jobNameForInstance job的名称
* @param instanceGitURL base64编码的git地址
* @param buildID 此次构建的id
* @param instanceChallenge 当前关卡
* @param resubmit 是否是评测完成后再次构建
* @param gameInfo 关卡信息用于需要更新pipeline的job.其详细可以参考{@link com.educoder.jenkins.controller.publishGame}
* @param modifyStatus 用以标记当前job是否需要更新1:需要更新job的pipeline;0:不需要更新job的pipeline
* @return {code,msg} 创建成功{"0","run job success."}
* 创建失败exception,前端直接捕获
* @throws IOException
*/
@ApiOperation(value = "构建一个job", httpMethod = "POST", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
@RequestMapping(path = "/buildJobForInstance", method = RequestMethod.POST)
public JSONObject buildJobForInstance(
@ -128,11 +152,14 @@ public class JenkinsController extends BaseController {
pool = new ThreadPoolExecutor(Integer.parseInt(appConfig.getPoolSize()),
Integer.parseInt(appConfig.getPoolSize()), 60L, TimeUnit.SECONDS, buildBlockingQueue);
}
String newPipeline = new GameController().generatePipelineScriptForGame(gameInfo);
updateJobForInstance(jobNameForInstance, newPipeline);
if("1".equals(modifyStatus)){
String newPipeline = gameController.generatePipelineScriptForGame(gameInfo);
newPipeline = newPipeline.replace("PODLABEL", jobNameForInstance);
updateJobForInstance(jobNameForInstance, newPipeline);
}
instanceGitURL = Base64Helper.decode(instanceGitURL);
// 为新来的job生成一个线程
// 为新来的job生成一个线程将线程放入线程池去执行
buildThreadNew = (BuildThread) BeanFactory.getObejct("BuildThread");
Map<String, String> buildParams = new HashMap<String, String>();
buildParams.put("buildID", buildID);
@ -151,12 +178,14 @@ public class JenkinsController extends BaseController {
return response;
}
@ApiOperation(value = "更新一个job", httpMethod = "POST", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
@ApiResponse(code = 200, message = "success", response = JSONObject.class)
@RequestMapping(path = "/updateJobForInstance", method = RequestMethod.POST)
public JSONObject updateJobForInstance(
@ApiParam(name = "jobNameForInstance", required = true, value = "job的名字") @RequestParam String jobNameForInstance,
@ApiParam(name = "gamePipelineScript", required = true, value = "pipeLine脚本用base64编码") @RequestParam String gamePipelineScript)
/**
* 根据job名称pipeline及参数信息去更新一个job
* @param jobNameForInstance job的名称
* @param gamePipelineScript job的pipeline
* @return {code,msg} 更新成功:{"0","update job success"};更新失败:抛出异常前端捕获
* @throws IOException
*/
public JSONObject updateJobForInstance(String jobNameForInstance,String gamePipelineScript)
throws IOException {
logger.debug("/api/updateJobForInstance: jobNameForInstance:" + jobNameForInstance + ", gamePipelineScript:"
+ gamePipelineScript);
@ -164,7 +193,6 @@ public class JenkinsController extends BaseController {
Map<String, String> jobParamsMap = jobMap;
gamePipelineScript = Base64Helper.decode(gamePipelineScript);
jenkinsApi.updateJob(jobNameForInstance, gamePipelineScript, jobParamsMap);
response.put("code", 0);
@ -174,6 +202,12 @@ public class JenkinsController extends BaseController {
return response;
}
/**
* 当前是将所有的构建请求放到一个线程池中当构建请求数量大于线程池大小时接下来的构建请求就会被放入等待队列中<br>
* 此函数用于更具构建的id来获取某次构建请求前面还有多少job在等待构建
* @param buildID 构建的id
* @return {code,msg} 成功获取:{"0",index};获取失败:{"0","-1"}
*/
@ApiOperation(value = "获取等待时间", httpMethod = "POST", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
@ApiResponse(code = 200, message = "success", response = JSONObject.class)
@RequestMapping(path = "/getWaitingTime", method = RequestMethod.POST)

View File

@ -17,9 +17,9 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by guange on 18/02/2017.
* 接收jenkins传送的信息并进行处理最后将处理结果传回trustie
*@author lqk
*/
@Api(value = "pipeline控制器用于pipeline脚本调用", hidden = true)
@RestController
@ -30,7 +30,9 @@ public class PipeLineController extends BaseController {
@Autowired
TrustieApi trustieApi;
/**
* 接收jenkins传送来的job构建结果处理后返回此次评测的结果如是否通过某一关卡是否通过及其报错信息等
*/
@ApiOperation(value = "处理结果并将结果回传到BDWeb", httpMethod = "POST", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
@RequestMapping(path = "/postTrainingGameInstanceResultToBDWeb")
public JSONObject postTrainingGameInstanceResultToBDWeb(String buildID, String compileResult, String out, String in,

View File

@ -139,10 +139,10 @@ public class BuildThread implements Runnable{
logger.debug("job:" + this.jobName + "不存在,线程退出");
try {
//job不存在时错误码为9
postErrToTrustie("jobNoExist", 1, buildID,resubmit,jobName);
postErrToTrustie("jobNoExist", -1, buildID,resubmit,jobName);
return;
} catch (Exception e) {
logger.error("jobName不存在" + this.jobName + "向前端发送错误信息失败");
logger.error("job:" + this.jobName + "不存在,且向前端发送错误信息失败");
return;
}
}
@ -155,6 +155,13 @@ public class BuildThread implements Runnable{
buildJob();
} catch (IOException e) {
logger.error("job:" + jobName + "请求构建失败");
try {
postErrToTrustie("发送构建请求失败", -1, this.buildID, this.jobName, this.resubmit);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
logger.error(this.jobName + "发送构建请求失败且向前端发送错误信息时也报错");
}
return;
}
@ -234,6 +241,7 @@ public class BuildThread implements Runnable{
postErrToTrustie("获取job状态时出错", -1, this.buildID, this.jobName, this.resubmit);
}catch (Exception statusEx){
logger.debug("传输错误信息至前端时出错");
break;
}
break;
}
@ -253,6 +261,7 @@ public class BuildThread implements Runnable{
}catch(Exception e1)
{
e1.printStackTrace();
break;
}
break;
}

View File

@ -25,7 +25,7 @@ public class JobUtils {
return Pattern.compile(regex,Pattern.CASE_INSENSITIVE).matcher(src).find();
}
public static void writeErr(String file, String conent)
public void writeErr(String file, String conent)
{
BufferedWriter out = null;
try

View File

@ -35,4 +35,11 @@ public class Base64Helper {
byte[] decode = Base64.decodeBase64(code);
return new String(decode, StandardCharsets.UTF_8);
}
public static String replaceDecode(String code) throws UnsupportedEncodingException {
byte[] decode = Base64.decodeBase64(code.replace(" ", "+"));
return new String(decode, StandardCharsets.UTF_8);
}
}

View File

@ -27,7 +27,9 @@ import com.educoder.jenkins.service.BuildThread;
public class BeanFactory {
static ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
public static Object getObejct(String className){
BuildThread buildThreadNew = (BuildThread)ctx.getBean(className);
return buildThreadNew;
Object object = ctx.getBean(className);
return object;
}
}

View File

@ -87,9 +87,9 @@
<property name="pipelineTemplateFileName">
<list>
<value>fullTemplateJava.pipeline</value>
<value>fullTemplateJava.pipeline</value>
<value>fullTemplatePython.pipeline</value>
<value>fullTemplateJDBC.pipeline</value>
<value>fullTemplateJava.pipeline</value>
<value>fullTemplateGCC.pipeline</value>
</list>
</property>

View File

@ -1,74 +1,7 @@
if (currentChallenge == CHALLENGESTAGE) {
//生成编译文件路径c++编译多文件可以使用g++ /*.cpp这种形式把所有的cpp全部编译
compileFile = new StringBuilder('CHALLENGEPROGRAMNAME');
lastPositon = compileFile.lastIndexOf('/');
compileFile = compileFile.substring(0,lastPositon+1) + '*.cpp';
compileResult = ''
try
{
// 编译程序
sh script: 'COMPILECOMMAND ' + compileFile + ' -o executeFile.out > compile_result_CHALLENGESTAGE.out 2>&1'
} catch(err)
{
//resubmit是以字符串的形式传进来的
//重复构建时需要删除之前构建的成功的class并catch掉class文件不存在的异常
catchError{
sh 'rm executeFile.out'
}
}
//获取编译结果
compileResult = readFile ('compile_result_CHALLENGESTAGE.out')
// 如果编译通过
if (compileResult.trim() == '') {
compileResult = 'compile successfully'
}
StringBuilder input = new StringBuilder('[')
StringBuilder output = new StringBuilder('[')
StringBuilder expectedOut = new StringBuilder('[')
StringBuilder isPublic = new StringBuilder('[')
//得到文件夹下的文件总数
def fileNumsStr = sh script: 'cd ../testCases/TRAININGID/CHALLENGESTAGE && ls -l |grep "^-"|wc -l', returnStdout: true
def fileNums = Integer.parseInt(fileNumsStr.trim())
for (int i = 1; i <= fileNums/3; i++) {
// 读取输入和预期输出
//由于文件的名字的命名是有规律的,所以可以直接以序号来拼接成文件名
def inI = readFile '../testCases/TRAININGID/CHALLENGESTAGE/' + i + '.in'
def expectedOutI = readFile '../testCases/TRAININGID/CHALLENGESTAGE/' + i + '.out'
def isPublicI = readFile '../testCases/TRAININGID/CHALLENGESTAGE/' + i + '.isPublic'
//取出文件执行得到结果,然后和预期输出比较就可以判断正误
// 从in.txt读入程序运行输出重定向到out.txt
catchError
{
sh script: 'EXECUTECOMMANDexecuteFile.out < ../testCases/TRAININGID/CHALLENGESTAGE/' + i + '.in > actual_result_CHALLENGESTAGE_' + i + '.out 2>&1 '
}
def outI = readFile 'actual_result_CHALLENGESTAGE_' + i + '.out'
// 拼接成json格式
input.append("\"" + base64Encode(inI) + "\",");
output.append("\"" + base64Encode(outI) + "\",");
expectedOut.append("\"" + base64Encode(expectedOutI) + "\",");
isPublic.append("\"" + isPublicI + "\",");
}
input = input.deleteCharAt(input.length() - 1);
input = input.append("]");
output = output.deleteCharAt(output.length() - 1);
output = output.append("]");
expectedOut = expectedOut.deleteCharAt(expectedOut.length() - 1);
expectedOut = expectedOut.append("]");
isPublic = isPublic.deleteCharAt(isPublic.length() - 1);
isPublic = isPublic.append("]");
// 由中间层判断结果之后发送给BDWeb
postGameInstanceResultToBDWeb(compileResult: base64Encode(compileResult), out: output, in:input, expectedOut:expectedOut , isPublic:isPublic)
}
String compileCommand = COMPILECOMMAND
String challengeProgramName = CHALLENGEPROGRAMNAME
String executeCommand = EXECUTECOMMAND
String sourceClassName = SOURCECLASSNAME
buildJob(compileCommand:compileCommand,challengeProgramName:challengeProgramName, executeCommand:executeCommand, sourceClassName:sourceClassName)
}

View File

@ -4,4 +4,4 @@ if (currentChallenge == CHALLENGESTAGE) {
String executeCommand = EXECUTECOMMAND
String sourceClassName = SOURCECLASSNAME
buildJob(compileCommand:compileCommand,challengeProgramName:challengeProgramName, executeCommand:executeCommand, sourceClassName:sourceClassName)
}
}

View File

@ -4,4 +4,4 @@ if (currentChallenge == CHALLENGESTAGE) {
String executeCommand = EXECUTECOMMAND
String sourceClassName = SOURCECLASSNAME
buildJob(compileCommand:compileCommand,challengeProgramName:challengeProgramName, executeCommand:executeCommand, sourceClassName:sourceClassName)
}
}

View File

@ -1,16 +1,16 @@
#Online
trustieUrl=http://10.9.153.195:8888/myshixuns/training_task_status
jenkinsUrl=http://10.9.184.140:8888
#trustieUrl=http://10.9.153.195:8888/myshixuns/training_task_status
#jenkinsUrl=http://10.9.184.140:8888
poolSize=6
jenkisUserName=root
jenkisPassWord=root
jenkisPassWord=jenkins@root123
jenkinsConfigXmlPath=/var/lib/jenkins/config.xml
#following setting are used in local test
#jenkinsUrl=http://106.75.96.108:8888
#trustieUrl=http://testbdweb.trustie.net/myshixuns/training_task_status
jenkinsUrl=http://106.75.96.108:8888
trustieUrl=http://testbdweb.trustie.net/myshixuns/training_task_status
#poolSize=1
#jenkisUserName=root
#jenkisPassWord=root

View File

@ -4,7 +4,7 @@ trustieUrl=http://10.9.67.91:8890/myshixuns/training_task_status
jenkinsUrl=http://10.9.81.28:8888
jenkisUserName=root
jenkisPassWord=root
jenkisPassWord=jenkins@root123
poolSize=6
jenkinsConfigXmlPath=/var/lib/jenkins/config.xml

View File

@ -54,8 +54,6 @@ def base64Encode(arg) {
}
def bildJob(def arg)
{
if (currentChallenge == CHALLENGESTAGE) {
compileResult = ''
try
{

View File

@ -0,0 +1,129 @@
{
node('PODLABEL') {
container('MAINCONTAINER') {
def currentChallenge = Integer.parseInt(instanceChallenge)
// 解决stage 0 401没有权限的问题
if (currentChallenge == 0) {
boolean flag = false;
for(int i=0;i<5;i++){
catchError {
println(i + "times")
Thread.sleep(100)
git url: instanceGitURL
flag = true;
}
if(flag == true) {
currentBuild.result = 'SUCCESS';
break;
}
}
}
git url: instanceGitURL
CHALLENGEPIPELINES
}
}
}
// 传送运行结果到BDWeb
def postGameInstanceResultToBDWeb(def arg){
def s = 'compileResult=' + arg.compileResult + '&out=' + arg.out +
'&in=' + arg.in + '&expectedOut=' + arg.expectedOut + '&isPublic=' + arg.isPublic
def response = httpRequest acceptType: 'APPLICATION_JSON_UTF8', consoleLogResponseBody: true, contentType: 'APPLICATION_FORM',
//httpMode: 'POST', requestBody: s, url: "http://123.59.135.74:9201/jenkins-exec/pipeline/postTrainingGameInstanceResultToBDWeb?buildID=${buildID}&reSubmit=${resubmit}"
httpMode: 'POST', requestBody: s, url: BRIDGE_URL+"/jenkins-exec/pipeline/postTrainingGameInstanceResultToBDWeb?buildID=${buildID}&reSubmit=${resubmit}"
if (response.status==299){
error response.content
}
}
// 传送错误结果到BDWeb
def postErrorToBDWeb(def arg){
def s = 'errType=' + arg.errType + '&value=' + arg.value
def response = httpRequest acceptType: 'APPLICATION_JSON_UTF8', consoleLogResponseBody: true, contentType: 'APPLICATION_FORM',
httpMode: 'POST', requestBody: s, url: "http://123.59.135.74:9201/jenkins-exec/pipeline/postErrToBDWeb?buildID=${buildID}"
if (response.status==299){
error response.content
}
}
def base64Encode(arg) {
return arg.bytes.encodeBase64().toString()
}
def buildJob(def arg){
//生成编译文件路径c++编译多文件可以使用g++ /*.cpp这种形式把所有的cpp全部编译
compileFile = new StringBuilder(arg.challengeProgramName);
lastPositon = compileFile.lastIndexOf('/');
compileFile = compileFile.substring(0,lastPositon+1) + '*.cpp';
compileResult = ''
try
{
// 编译程序
sh script: arg.compileCommand + ' ' + compileFile + ' -o executeFile.out > compile_result_' + arg.challengeStage + '.out 2>&1'
} catch(err)
{
//resubmit是以字符串的形式传进来的
//重复构建时需要删除之前构建的成功的class并catch掉class文件不存在的异常
catchError{
sh 'rm executeFile.out'
}
}
//获取编译结果
compileResult = readFile ('compile_result_' + arg.challengeStage + '.out')
// 如果编译通过
if (compileResult.trim() == '') {
compileResult = 'compile successfully'
}
StringBuilder input = new StringBuilder('[')
StringBuilder output = new StringBuilder('[')
StringBuilder expectedOut = new StringBuilder('[')
StringBuilder isPublic = new StringBuilder('[')
//得到文件夹下的文件总数
def fileNumsStr = sh script: 'cd ../testCases/' + arg.trainindID + '/' + arg.challengeStage + ' && ls -l |grep "^-"|wc -l', returnStdout: true
def fileNums = Integer.parseInt(fileNumsStr.trim())
for (int i = 1; i <= fileNums/3; i++) {
// 读取输入和预期输出
//由于文件的名字的命名是有规律的,所以可以直接以序号来拼接成文件名
def inI = readFile '../testCases/' + arg.trainindID + '/' + arg.challengeStage + '/' + i + '.in'
def expectedOutI = readFile '../testCases/' + arg.trainindID + '/' + arg.challengeStage + '/' + i + '.out'
def isPublicI = readFile '../testCases/' + arg.trainindID + '/' + arg.challengeStage + '/' + i + '.isPublic'
//取出文件执行得到结果,然后和预期输出比较就可以判断正误
// 从in.txt读入程序运行输出重定向到out.txt
catchError
{
sh script: arg.executeCommand + 'executeFile.out < ../testCases/' + arg.trainindID + '/' + arg.challengeStage + '/' + i + '.in > actual_result_' + arg.challengeStage + '_' + i + '.out 2>&1 '
}
def outI = readFile 'actual_result_' + arg.challengeStage + '_' + i + '.out'
// 拼接成json格式
input.append("\"" + base64Encode(inI) + "\",");
output.append("\"" + base64Encode(outI) + "\",");
expectedOut.append("\"" + base64Encode(expectedOutI) + "\",");
isPublic.append("\"" + isPublicI + "\",");
}
input = input.deleteCharAt(input.length() - 1);
input = input.append("]");
output = output.deleteCharAt(output.length() - 1);
output = output.append("]");
expectedOut = expectedOut.deleteCharAt(expectedOut.length() - 1);
expectedOut = expectedOut.append("]");
isPublic = isPublic.deleteCharAt(isPublic.length() - 1);
isPublic = isPublic.append("]");
// 由中间层判断结果之后发送给BDWeb
postGameInstanceResultToBDWeb(compileResult: base64Encode(compileResult), out: output, in:input, expectedOut:expectedOut , isPublic:isPublic)
}
}

View File

@ -9,14 +9,14 @@ log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n%l
log4j.logger.org.springframework=ERROR
log4j.appender.logDailyFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.logDailyFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logDailyFile.layout.ConversionPattern = %n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n
log4j.appender.logDailyFile.layout.ConversionPattern = %n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n%l
log4j.appender.logDailyFile.Threshold = DEBUG
log4j.appender.logDailyFile.ImmediateFlush = TRUE
log4j.appender.logDailyFile.Append = TRUE
@ -26,7 +26,7 @@ log4j.appender.logDailyFile.Encoding = UTF-8
log4j.appender.logDailyFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.logDailyFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logDailyFile.layout.ConversionPattern = %n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n
log4j.appender.logDailyFile.layout.ConversionPattern = %n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n%l
log4j.appender.logDailyFile.Threshold = ERROR
log4j.appender.logDailyFile.ImmediateFlush = TRUE
log4j.appender.logDailyFile.Append = TRUE

View File

@ -3,8 +3,5 @@ remoteWorkspace=/home/jenkins/workspace
java_podTemplate=podTemplate(label: 'PODLABEL', containers: [containerTemplate(name: 'openjdk', image: 'openjdk:latest', ttyEnabled: true, command: 'cat')],volumes:[hostPathVolume(hostPath: '${workspace}', mountPath: '${remoteWorkspace}')])
python_podTemplate=podTemplate(label: 'PODLABEL', containers: [containerTemplate(name: 'python', image: 'python:latest', ttyEnabled: true, command: 'cat')],volumes:[hostPathVolume(hostPath: '${workspace}', mountPath: '${remoteWorkspace}')])
jdbc_podTemplate=podTemplate(label: 'PODLABEL', containers: [containerTemplate(name: 'openjdk', image: 'openjdk:latest', ttyEnabled: true, command: 'cat'), containerTemplate(name: 'mysql', image: 'mysql57:latest', ttyEnabled: true, command: '/start.sh')],volumes:[hostPathVolume(hostPath: '${workspace}', mountPath: '${remoteWorkspace}')])
<<<<<<< HEAD
gcc_podTemplate=
=======
gcc_podTemplate=podTemplate(label: 'PODLABEL', containers: [containerTemplate(name: 'python', image: 'python:latest', ttyEnabled: true, command: 'cat')],volumes:[hostPathVolume(hostPath: '${workspace}', mountPath: '${remoteWorkspace}')])
>>>>>>> fbc06d7a3fa687a33dcafcce959c9e6e1060a22e

View File

@ -28,12 +28,12 @@ public class JenkinsApiTest extends SpringTestBase {
JenkinsApi jenkinsApi;
@Test
// @Test
public void testConfig(){
Assert.assertTrue(appConfig!=null);
}
@Test
// @Test
public void createJob() throws Exception {
JenkinsServer server = new JenkinsServer(new URI(appConfig.getJenkinsUrl()), appConfig.getJenkisUserName(), appConfig.getJenkisPassWord());
if (server.getJob("test") != null) {
@ -52,7 +52,7 @@ public class JenkinsApiTest extends SpringTestBase {
System.out.println(reString);
}
@Test
// @Test
public void testUpdateJob() throws IOException {
String pipeLine = "node () {}";
@ -64,14 +64,14 @@ public class JenkinsApiTest extends SpringTestBase {
jenkinsApi.updateJob("test", pipeLine, params);
}
@Test
// @Test
public void buildJob() throws Exception {
jenkinsApi.buildJob("for_build_job", "1", "2", "https://bdgit.trustie.net/forge01/linkedlistdemo.git", "{}");
}
@Test
// @Test
public void getJobXml() throws Exception {
String test = jenkinsApi.getJobXml("for_build_job");
System.out.println(test);
@ -79,12 +79,12 @@ public class JenkinsApiTest extends SpringTestBase {
@Test
// @Test
public void reload() throws IOException {
jenkinsApi.reloadConfig();
}
@Test
// @Test
public void addKubTemplate() throws Exception {
Map map = new HashMap();
map.put("instanceCap", 1);
@ -92,7 +92,7 @@ public class JenkinsApiTest extends SpringTestBase {
jenkinsApi.addKubTemplate("hello", map);
}
@Test
// @Test
public void rmKubTemplate() throws Exception {
jenkinsApi.rmKubTemplate("hello");
}

View File

@ -1,3 +1,4 @@
/*
package cn.wangwei.app.jenkins;
import cn.guange.app.jenkins.SpringTestBase;
@ -11,9 +12,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import java.io.UnsupportedEncodingException;
import java.net.URI;
*/
/**
* Created by weishao on 2017/4/12.
*/
*//*
public class GameControllerTest extends SpringTestBase {
@Autowired
GameController gameController;
@ -132,3 +135,4 @@ public class GameControllerTest extends SpringTestBase {
}
}
*/

View File

@ -0,0 +1,49 @@
/**
* 文件名 : GameControllerTest.java
* 版权 : <版权/公司名>
* 描述 : <描述>
* @author liliy
* 版本 : <版本>
* 修改时间 2017年6月21日
* 修改内容 <修改内容>
*/
package com.educoder.jenkins.controller;
import static org.junit.Assert.assertEquals;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.fastjson.JSONObject;
import com.educoder.jenkins.utils.BeanFactory;
import com.educoder.jenkins.utils.ReadArguments;
/**
* <一句话功能简述>
* <功能详细描述>
* @author liliy
* @version [版本号2017年6月21日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class GameControllerTest {
static GameController gameController;
@BeforeClass
public static void setUpBeforeClass() {
gameController=(GameController)BeanFactory.getObejct("GameController");
}
@Test
public void publishGameTest() throws Exception{
String gameInfo=ReadArguments.gameInfo;
JSONObject response=gameController.publishGame(gameInfo);
String code=response.get("code").toString();
String msg=response.get("msg").toString();
assertEquals(code,"0");
}
}

View File

@ -0,0 +1,25 @@
/**
* 文件名 : ReadArguments.java
* 版权 : <版权/公司名>
* 描述 : <描述>
* @author liliy
* 版本 : <版本>
* 修改时间 2017年6月21日
* 修改内容 <修改内容>
*/
package com.educoder.jenkins.utils;
/**
* <一句话功能简述>
* <功能详细描述>
* @author liliy
* @version [版本号2017年6月21日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class ReadArguments {
public static final String gameInfo="eyJ0cmFpbmluZ0lEIjoiMjIiLCJvcGVyYXRpb25FbnZpcm9ubWVudCI6Ikph dmEiLCJjaGFsbGVuZ2VJbmZvIjpbeyJjaGFsbGVuZ2VTdGFnZSI6IjEiLCJj aGFsbGVuZ2VUeXBlIjoiMSIsImNoYWxsZW5nZVByb2dyYW1OYW1lIjoic3Jj L3N0ZXAxL0xpc3ROb2RlVGVzdC5qYXZhIiwib3BlcmF0aW9uRW52aXJvbm1l bnQiOiJKYXZhIiwidHJhaW5pbmdJRCI6IjIyIn0seyJjaGFsbGVuZ2VTdGFn ZSI6IjIiLCJjaGFsbGVuZ2VUeXBlIjoiMSIsImNoYWxsZW5nZVByb2dyYW1O YW1lIjoidGVzdDAyLmphdmEiLCJvcGVyYXRpb25FbnZpcm9ubWVudCI6Ikph dmEiLCJ0cmFpbmluZ0lEIjoiMjIifV0sInRlc3RDYXNlcyI6W3siY2hhbGxl bmdlU3RhZ2UiOiIxIiwiY2hhbGxlbmdlVGVzdENhc2VzIjpbeyJjYXNlSWQi OiIzNSIsImlucHV0IjoiMSIsIm91dHB1dCI6IjEiLCJpc1B1YmxpYyI6IjEi fV19LHsiY2hhbGxlbmdlU3RhZ2UiOiIyIiwiY2hhbGxlbmdlVGVzdENhc2Vz IjpbeyJjYXNlSWQiOiIzNiIsImlucHV0IjoiMjIiLCJvdXRwdXQiOiIzMyIs ImlzUHVibGljIjoiMSJ9LHsiY2FzZUlkIjoiMzciLCJpbnB1dCI6IjExIiwi b3V0cHV0IjoiMjIyMiIsImlzUHVibGljIjoiMSJ9XX1dfQ==";
}

View File

@ -77,18 +77,28 @@ public class TestLQK {
JenkinsServer jenkins = null;
private static final Logger logger = LoggerFactory.getLogger(TestLQK.class);
public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
String testString = "sh script:'rm -f ../testCases/" + "1" + "/*'" + "\n";
System.out.println("testString:" + testString);
// try {http://106.75.78.183:8888 //http://106.75.96.108:8888
InputStream resourceAsStream = TestLQK.class
.getResourceAsStream("/"+"Pipeline.txt");
String Content = IOUtils.toString(resourceAsStream, Charset.forName("UTF-8"));
JenkinsServer jenkins = new JenkinsServer(new URI("http://106.75.96.108:8888/"), "root", "root");
TestLQK testLQK = new TestLQK();
Map<String, String> params = new HashMap<>();
params.put("id", "1");
String jobXML = testLQK.makeJobXml(Content, params);
System.out.println("jobXML:" + jobXML);
jenkins.updateJob("myshixun_220", jobXML);
// InputStream resourceAsStream = TestLQK.class
// .getResourceAsStream("/"+"pipeline.txt");
// String Content = IOUtils.toString(resourceAsStream, Charset.forName("UTF-8"));
// JenkinsServer jenkins = new JenkinsServer(new URI("http://106.75.96.108:8888/"), "root", "root");
// TestLQK testLQK = new TestLQK();
// Map<String, String> params = new HashMap<>();
// params.put("id", "1");
//// Map<String, String> params = new HashMap<String, String>() {
//// {
//// put("instanceGitURL", "1");
//// put("instanceChallenge", "1");
//// put("buildID", "1");
//// put("resubmit", "1");
//// }
//// };
//
// String jobXML = testLQK.makeJobXml(Content, params);
//// System.out.println("jobXML:" + jobXML);
// jenkins.updateJob("myshixun_220", jobXML);
//testLQK.updateJob("myshixun_220", "test update pipeline", params);
// Map<String, Job> jobs = jenkins.getJobs();
// JobWithDetails job = jobs.get("myshixun_690").details();

View File

@ -1,4 +1,4 @@
podTemplate(label: 'myshixun_692', containers: [containerTemplate(name: 'python', image: 'python:latest', ttyEnabled: true, command: 'cat')],volumes:[hostPathVolume(hostPath: '/data/workspace', mountPath: '/home/jenkins/workspace')]){
podTemplate(label: '666999', containers: [containerTemplate(name: 'python', image: 'python:latest', ttyEnabled: true, command: 'cat')],volumes:[hostPathVolume(hostPath: '/data/workspace', mountPath: '/home/jenkins/workspace')]){
node('myshixun_692') {
container('python') {
def currentChallenge = Integer.parseInt(instanceChallenge)

245
logs/error.log.2017-06-14 Normal file
View File

@ -0,0 +1,245 @@
2017-06-14 15:42:00
[ERROR]-[Thread: localhost-startStop-1]-[org.springframework.web.context.ContextLoader.initWebApplicationContext()]: Context initialization failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'trustieApi': Unsatisfied dependency expressed through field 'appConfig'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'jenkisUserName' in string value "${jenkisUserName}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'jenkisUserName' in string value "${jenkisUserName}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:372)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 24 more
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'jenkisUserName' in string value "${jenkisUserName}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236)
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210)
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:831)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1086)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
... 35 more
2017-06-14 15:42:30
[ERROR]-[Thread: localhost-startStop-1]-[org.springframework.web.context.ContextLoader.initWebApplicationContext()]: Context initialization failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'trustieApi': Unsatisfied dependency expressed through field 'appConfig'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'jenkinsConfigXmlPath' in string value "${jenkinsConfigXmlPath}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'jenkinsConfigXmlPath' in string value "${jenkinsConfigXmlPath}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:372)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 24 more
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'jenkinsConfigXmlPath' in string value "${jenkinsConfigXmlPath}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236)
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210)
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:831)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1086)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
... 35 more
2017-06-14 15:45:19
[ERROR]-[Thread: pool-1-thread-1]-[com.educoder.jenkins.service.BuildThread.handleJobFailure()]: jobName: myshixun_220 buildID: 1 biuldNum: 17 开始时间2017-06-14 15:44:20
运行时间0 运行参数:{instanceChallenge=1, buildID=1, resubmit=1, instanceGitURL=}errInfo: stillwaiting 9
Started by user root
[Pipeline] node
Running on master in /var/lib/jenkins/workspace/myshixun_220
[Pipeline] {
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep
Sleeping for 1 sec
[Pipeline] sleep