SeecoderBuildClient.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package cn.seecoder.build.client;
  2. import cn.seecoder.build.model.vo.BuildDetailsVO;
  3. import cn.seecoder.build.model.vo.PipelineVO;
  4. import com.fasterxml.jackson.core.JsonProcessingException;
  5. import com.fasterxml.jackson.databind.JsonNode;
  6. import com.fasterxml.jackson.databind.ObjectMapper;
  7. import okhttp3.*;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import java.io.IOException;
  11. import java.io.InputStream;
  12. import java.util.Arrays;
  13. import java.util.HashMap;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.concurrent.TimeUnit;
  17. import static cn.seecoder.build.client.SeecoderBuildException.BIZ_ERROR_CODE;
  18. public class SeecoderBuildClient implements SeecoderBuildApi {
  19. private final Logger logger = LoggerFactory.getLogger(getClass());
  20. private OkHttpClient client;
  21. private String token;
  22. private String host;
  23. public SeecoderBuildClient(String host, String token) {
  24. this.token = token;
  25. this.host = host;
  26. client = new OkHttpClient.Builder()
  27. .connectTimeout(60, TimeUnit.SECONDS)
  28. .writeTimeout(60,TimeUnit.SECONDS)
  29. .retryOnConnectionFailure(true)
  30. .build();
  31. }
  32. private <T> T processResponse(ObjectMapper objectMapper, Response response, Class<T> clazz) {
  33. try {
  34. validateResponseStatus(response);
  35. String body = response.body().string();
  36. JsonNode node = objectMapper.readTree(body);
  37. Integer code = Integer.parseInt(node.get("code").asText());
  38. String msg = node.get("msg").asText();
  39. if (code != 0) {
  40. throw new SeecoderBuildException(BIZ_ERROR_CODE, msg);
  41. }
  42. if (clazz == null) {
  43. return null;
  44. }
  45. return objectMapper.treeToValue(node.get("result"), clazz);
  46. } catch (IOException e) {
  47. logger.error("IOException", e);
  48. throw SeecoderBuildException.IO_ERROR;
  49. }
  50. }
  51. private void validateResponseStatus(Response response) {
  52. if (response.code() == 403) {
  53. throw SeecoderBuildException.UNAHTORIZATION_ERROR;
  54. } else if (response.code() == 500) {
  55. throw SeecoderBuildException.INTERNAL_SERVER_ERROR;
  56. } else if (response.code() != 200) {
  57. throw SeecoderBuildException.UNKNOWN_ERROR;
  58. }
  59. }
  60. @Override
  61. public PipelineVO createOrUpdatePipeline(PipelineVO vo, boolean create) throws SeecoderBuildException {
  62. try {
  63. ObjectMapper objectMapper = new ObjectMapper();
  64. Request.Builder builder = new Request.Builder()
  65. .addHeader("Authorization", token);
  66. if (create) {
  67. builder = builder
  68. .url(host + "/api/pipeline")
  69. .post(RequestBody.create(objectMapper.writeValueAsString(vo), MediaType.parse("application/json; charset=utf-8")));
  70. } else {
  71. builder = builder
  72. .url(host + "/api/pipeline/" + vo.getId())
  73. .put(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(vo)));
  74. }
  75. Request request = builder.build();
  76. final Call call = client.newCall(request);
  77. Response response = call.execute();
  78. PipelineVO pipelineVO = processResponse(objectMapper, response, PipelineVO.class);
  79. return pipelineVO;
  80. } catch (JsonProcessingException e) {
  81. logger.error("JSON writeValueAsString error", e);
  82. throw SeecoderBuildException.JSON_ERROR;
  83. } catch (IOException e) {
  84. logger.error("IOException", e);
  85. throw SeecoderBuildException.IO_ERROR;
  86. }
  87. }
  88. @Override
  89. public void delete(Integer id) {
  90. try {
  91. ObjectMapper objectMapper = new ObjectMapper();
  92. Request request = new Request.Builder()
  93. .url(host + "/api/pipeline/" + id)
  94. .delete()
  95. .addHeader("Authorization", token)
  96. .build();
  97. final Call call = client.newCall(request);
  98. Response response = call.execute();
  99. processResponse(objectMapper, response, null);
  100. } catch (IOException e) {
  101. logger.error("IOException", e);
  102. throw SeecoderBuildException.IO_ERROR;
  103. }
  104. }
  105. @Override
  106. public List<PipelineVO> getAll() {
  107. try {
  108. ObjectMapper objectMapper = new ObjectMapper();
  109. Request request = new Request.Builder()
  110. .url(host + "/api/pipeline")
  111. .get()
  112. .addHeader("Authorization", token)
  113. .build();
  114. final Call call = client.newCall(request);
  115. Response response = call.execute();
  116. PipelineVO[] pipelines = processResponse(objectMapper, response, PipelineVO[].class);
  117. return Arrays.asList(pipelines);
  118. } catch (IOException e) {
  119. logger.error("IOException", e);
  120. throw SeecoderBuildException.IO_ERROR;
  121. }
  122. }
  123. @Override
  124. public PipelineVO getDetailById(Integer id) {
  125. try {
  126. ObjectMapper objectMapper = new ObjectMapper();
  127. Request request = new Request.Builder()
  128. .url(host + "/api/pipeline/" + id)
  129. .get()
  130. .addHeader("Authorization", token)
  131. .build();
  132. final Call call = client.newCall(request);
  133. Response response = call.execute();
  134. return processResponse(objectMapper, response, PipelineVO.class);
  135. } catch (IOException e) {
  136. logger.error("IOException", e);
  137. throw SeecoderBuildException.IO_ERROR;
  138. }
  139. }
  140. @Override
  141. public String createJob(Integer pipelineId, String jobName) throws SeecoderBuildException {
  142. try {
  143. ObjectMapper objectMapper = new ObjectMapper();
  144. Map<String, Object> params = new HashMap<>();
  145. params.put("pipelineId", pipelineId);
  146. if (jobName != null) {
  147. params.put("jobName", jobName);
  148. }
  149. Request request = new Request.Builder()
  150. .url(host + "/api/job")
  151. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(params)))
  152. .addHeader("Authorization", token)
  153. .build();
  154. final Call call = client.newCall(request);
  155. Response response = call.execute();
  156. return processResponse(objectMapper, response, String.class);
  157. } catch (JsonProcessingException e) {
  158. logger.error("JSON writeValueAsString error", e);
  159. throw SeecoderBuildException.JSON_ERROR;
  160. } catch (IOException e) {
  161. logger.error("IOException", e);
  162. throw SeecoderBuildException.IO_ERROR;
  163. }
  164. }
  165. @Override
  166. public void deleteJob(String jobName) throws SeecoderBuildException {
  167. try {
  168. ObjectMapper objectMapper = new ObjectMapper();
  169. Request request = new Request.Builder()
  170. .url(host + "/api/job/" + jobName)
  171. .delete()
  172. .addHeader("Authorization", token)
  173. .build();
  174. final Call call = client.newCall(request);
  175. Response response = call.execute();
  176. processResponse(objectMapper, response, null);
  177. } catch (IOException e) {
  178. logger.error("IOException", e);
  179. throw SeecoderBuildException.IO_ERROR;
  180. }
  181. }
  182. @Override
  183. public BuildDetailsVO getBuildDetails(String jobName, Integer buildId) throws SeecoderBuildException {
  184. try {
  185. ObjectMapper objectMapper = new ObjectMapper();
  186. Request request = new Request.Builder()
  187. .url(host + "/api/job/" + jobName + "/build/" + buildId)
  188. .get()
  189. .addHeader("Authorization", token)
  190. .build();
  191. final Call call = client.newCall(request);
  192. Response response = call.execute();
  193. return processResponse(objectMapper, response, BuildDetailsVO.class);
  194. } catch (IOException e) {
  195. logger.error("IOException", e);
  196. throw SeecoderBuildException.IO_ERROR;
  197. }
  198. }
  199. @Override
  200. public String getEntity(String jobName, Integer buildId, String path) throws SeecoderBuildException {
  201. try {
  202. ObjectMapper objectMapper = new ObjectMapper();
  203. Request request = new Request.Builder()
  204. .url(host + "/api/job/entity?jobName=" + jobName + "&buildId=" + buildId + "&path=" +path)
  205. .get()
  206. .addHeader("Authorization", token)
  207. .build();
  208. final Call call = client.newCall(request);
  209. Response response = call.execute();
  210. return processResponse(objectMapper, response, String.class);
  211. } catch (IOException e) {
  212. logger.error("IOException", e);
  213. throw SeecoderBuildException.IO_ERROR;
  214. }
  215. }
  216. @Override
  217. public InputStream getArtifact(String jobName, Integer buildId, String path) throws SeecoderBuildException {
  218. try {
  219. ObjectMapper objectMapper = new ObjectMapper();
  220. Request request = new Request.Builder()
  221. .url(host + "/api/job/artifact?jobName=" + jobName + "&buildId=" + buildId + "&path=" +path)
  222. .get()
  223. .addHeader("Authorization", token)
  224. .build();
  225. final Call call = client.newCall(request);
  226. Response response = call.execute();
  227. validateResponseStatus(response);
  228. return response.body().byteStream();
  229. } catch (IOException e) {
  230. logger.error("IOException", e);
  231. throw SeecoderBuildException.IO_ERROR;
  232. }
  233. }
  234. @Override
  235. public Integer invokeBuild(Integer pipelineId, String jobName, Map<String, String> params) throws SeecoderBuildException {
  236. try {
  237. ObjectMapper objectMapper = new ObjectMapper();
  238. Map<String, Object> paramsMap = new HashMap<>();
  239. paramsMap.put("pipelineId", pipelineId);
  240. paramsMap.put("jobName", jobName);
  241. paramsMap.put("params", params);
  242. Request request = new Request.Builder()
  243. .url(host + "/api/job/run")
  244. .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(paramsMap)))
  245. .addHeader("Authorization", token)
  246. .build();
  247. final Call call = client.newCall(request);
  248. Response response = call.execute();
  249. return processResponse(objectMapper, response, Integer.class);
  250. } catch (IOException e) {
  251. logger.error("IOException", e);
  252. throw SeecoderBuildException.IO_ERROR;
  253. }
  254. }
  255. }