jenkins 集成测试 promotion


最近参加公司的集成测试平台的开发,在开发中遇到了不少问题,两个星期的迭代也即将完成,在这也用这篇博客记录下开发中的问题,供读者参考

公司的应用较多,所以需要了解这几种应用在jenkins中如何做构建,我自己参与的有两种commander的应用,一种是大数据类的,一个是我们服务端架构组的scala应用

1、大数据应用BigData 
配置如下:

 

 

配置文件对应的xml文件:通过crul获取xml配置文件:http://host/job/tar_py_dwx_dev/config.xml 

  1. <project>
  2. <actions/>
  3. <description/>
  4. <keepDependencies>false</keepDependencies>
  5. <properties>
  6. <com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty plugin="gitlab-plugin@1.5.5">
  7. <gitLabConnection/>
  8. </com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty>
  9. <hudson.plugins.promoted__builds.JobPropertyImpl plugin="promoted-builds@3.1">
  10. <activeProcessNames>
  11. <string>Deploy DEV</string>
  12. </activeProcessNames>
  13. </hudson.plugins.promoted__builds.JobPropertyImpl>
  14. </properties>
  15. <scm class="hudson.plugins.git.GitSCM" plugin="git@3.8.0">
  16. <configVersion>2</configVersion>
  17. <userRemoteConfigs>
  18. <hudson.plugins.git.UserRemoteConfig>
  19. <url>ssh://git@172.0.10.182:10022/bigdata/dwx.git</url>
  20. <credentialsId>84f4be19-ea8d-4271-8cfb-42af8f507285</credentialsId>
  21. </hudson.plugins.git.UserRemoteConfig>
  22. </userRemoteConfigs>
  23. <branches>
  24. <hudson.plugins.git.BranchSpec>
  25. <name>*/develop</name>
  26. </hudson.plugins.git.BranchSpec>
  27. </branches>
  28. <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
  29. <submoduleCfg class="list"/>
  30. <extensions/>
  31. </scm>
  32. <assignedNode>!macmini</assignedNode>
  33. <canRoam>false</canRoam>
  34. <disabled>false</disabled>
  35. <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  36. <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  37. <triggers>
  38. <hudson.triggers.SCMTrigger>
  39. <spec>H/5 * * * *</spec>
  40. <ignorePostCommitHooks>false</ignorePostCommitHooks>
  41. </hudson.triggers.SCMTrigger>
  42. </triggers>
  43. <concurrentBuild>false</concurrentBuild>
  44. <builders>
  45. <hudson.tasks.Shell>
  46. <command>
  47. project=dwx1 cd ${WORKSPACE} tar zcvf ${project}.tar.gz * aws s3 cp ${project}.tar.gz s3://lattebank-jenkins-build-dev/${JOB_BASE_NAME}/${BUILD_NUMBER}/ --region cn-north-1 rm -rf ${project}.tar.gz
  48. </command>
  49. </hudson.tasks.Shell>
  50. </builders>
  51. <publishers/>
  52. <buildWrappers/>
  53. </project>

从xml中获取的信息有点和图中的配置文件有点对应不上

对于promotion的脚本在xml配置文件中是无法获取的,这时候就有一个问题,这种api是无法获取到promotion的的脚本,同时这也给我们的工作带来了极大的挑战,那也意味着单纯的通过这种方法是无法实现commander应用的部署,和通过平台的方式去直接操作jenkins的配置

但经过查询相关的api并不能找到相关的内容,经过不懈的努力,终于找到了和promote build 插件相关的api

查询:http://host/job/jobName/promotion/process/promotionName/config.xml

这个接口能获取到它的xml文件,但是并不能对该配置文件进行增加和修改

对此我自己封装了一些方法:

  1. /**
  2. * @author chenlang
  3. * date 2018/5/7
  4. */
  5. @Slf4j
  6. public class JenkinsPromotionUtils {
  7.  
  8.  
  9. private static final String SUB_PATH_PROMOTION_COOMMAND = "/hudson.plugins.promoted__builds.PromotionProcess";
  10. private static final String SUB_PATH_BUILD = "/buildSteps";
  11. private static final String SUB_PATH_BUILDER_SHELL_COMMAND = "/hudson.tasks.Shell/command";
  12. private static final String PATH_PROMOTION_COMMAND = SUB_PATH_PROMOTION_COOMMAND + SUB_PATH_BUILD + SUB_PATH_BUILDER_SHELL_COMMAND;
  13. private static String CREATE_PROMOTION_JSON = "{'properties':{'stapler-class-bag':'true','hudson-plugins-promoted_builds-JobPropertyImpl':{'promotions':{'activeItems':{'name':'%s','isVisible':'','icon':'star-gold','hasAssignedLabel':false,'assignedLabelString':'','conditions':{'stapler-class-bag':'true'}}}}}}";
  14. private static final String CONTENT_TYPE = "application/x-www-form-urlencoded";
  15.  
  16.  
  17. public static void updatePromotionShell(Document jobConfigDocument, String jobName, JenkinsPromotionClient jenkinsPromotionClient, String promotionShell, String path) throws IOException, DocumentException {
  18. if (StringUtils.isBlank(promotionShell)) {
  19. return;
  20. }
  21. String promotionName = getPromotionName(jobConfigDocument, path);
  22. Document document = jenkinsPromotionClient.getJobPromotionXml(jobName, promotionName);
  23. document.selectSingleNode(PATH_PROMOTION_COMMAND).setText(promotionShell);
  24. jenkinsPromotionClient.updateJob(jobName, promotionName, document.asXML());
  25. }
  26.  
  27. public static void createPromotionShell(Document jobConfigDocument, String tmpJobName, String jobName, String promotionShell, String path, JenkinsPromotionClient jenkinsPromotionClient) throws IOException, DocumentException {
  28. if (StringUtils.isBlank(promotionShell)) {
  29. return;
  30. }
  31. String promotionName = getPromotionName(jobConfigDocument, path);
  32. Document document = jenkinsPromotionClient.getJobPromotionXml(tmpJobName, promotionName);
  33. document.selectSingleNode(PATH_PROMOTION_COMMAND).setText(promotionShell);
  34. Map<String, String> map = Maps.newHashMap();
  35. map.put("Content-Type", CONTENT_TYPE);
  36. map.put("json", String.format(CREATE_PROMOTION_JSON, promotionName));
  37. try {
  38. jenkinsPromotionClient.createJob(jobName, map);
  39. } catch (Exception e) {
  40. log.error("初创promotion时失败" + e);
  41. }
  42. jenkinsPromotionClient.createJob(jobName, promotionName, document.asXML());
  43. }
  44.  
  45. public static String getPromotionName(Document jobConfigDocument, String path) {
  46. return jobConfigDocument.selectSingleNode(path).getText();
  47. }
  48.  
  49. }

  

  1. package cn.caijiajia.phoenix.service.jenkins;
  2.  
  3. import com.offbytwo.jenkins.client.JenkinsHttpClient;
  4. import com.offbytwo.jenkins.client.util.EncodingUtils;
  5. import org.dom4j.Document;
  6. import org.dom4j.DocumentException;
  7. import org.dom4j.DocumentHelper;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Component;
  10.  
  11. import java.io.IOException;
  12. import java.util.Map;
  13.  
  14. /**
  15. * @author chenlang
  16. * date 2018/5/4
  17. */
  18. @Component
  19. public class JenkinsPromotionClient {
  20.  
  21. @Autowired
  22. private JenkinsHttpClient jenkinsHttpClient;
  23.  
  24. public JenkinsPromotionClient() {
  25. }
  26.  
  27. /**
  28. * 获取job的promotion配置文件
  29. *
  30. * @param jobName job名称
  31. * @param promotionName promotion名称
  32. * @return
  33. * @throws IOException
  34. */
  35. public Document getJobPromotionXml(String jobName, String promotionName) throws IOException, DocumentException {
  36. return DocumentHelper.parseText(this.getJobXml(jobName, promotionName));
  37. }
  38.  
  39.  
  40. /**
  41. * 更新job
  42. *
  43. * @param jobName
  44. * @param promotionName
  45. * @param jobXml
  46. * @throws IOException
  47. */
  48. public void updateJob(String jobName, String promotionName, String jobXml) throws IOException {
  49. this.jenkinsHttpClient.post_xml(this.toJobBaseUrl(jobName, promotionName) + "/config.xml", jobXml, true);
  50. }
  51.  
  52. /**
  53. * 添加job脚本
  54. *
  55. * @param jobName
  56. * @param jobXml
  57. * @throws IOException
  58. */
  59. public void createJob(String jobName, String promotionName, String jobXml) throws IOException {
  60. this.jenkinsHttpClient.post_xml(this.toJobBaseUrl(jobName, promotionName) + "/config.xml", jobXml, true);
  61. }
  62.  
  63. /**
  64. * 添加promotion的job
  65. *
  66. * @param jobName
  67. * @param map
  68. * @throws IOException
  69. */
  70. public void createJob(String jobName, Map map) throws IOException {
  71. this.jenkinsHttpClient.post_form("/job/" + EncodingUtils.encode(jobName) + "/configSubmit?", map, false);
  72. }
  73.  
  74. private String getJobXml(String jobName, String promotionName) throws IOException {
  75. return this.jenkinsHttpClient.get(this.toJobBaseUrl(jobName, promotionName) + "/config.xml");
  76. }
  77.  
  78. private String toJobBaseUrl(String jobName, String promotionName) {
  79. return "/job/" + EncodingUtils.encode(jobName) + "/promotion/process/" + promotionName;
  80. }
  81.  
  82. /**
  83. * promotion脚本的构建
  84. * @param jobName
  85. * @param promotionName
  86. * @param version
  87. * @param isFirstBuild
  88. * @throws IOException
  89. */
  90. public void build(String jobName,String promotionName,Integer version,boolean isFirstBuild) throws IOException{
  91. if (isFirstBuild) {
  92. this.jenkinsHttpClient.post("/job/"+ EncodingUtils.encode(jobName) + "/"+version+"/promotion/forcePromotion?name="+promotionName+"&json=%7B%7D&Submit=Force promotion");
  93. } else {
  94. this.jenkinsHttpClient.post("/job/"+ EncodingUtils.encode(jobName) + "/"+version+"/promotion/"+promotionName+"/build?json=%7B%7D&Submit=Re-execute promotion");
  95. }
  96. }
  97.  
  98.  
  99. }

  

其中的方法封装了对promote build插件中关于配置的增删改查,以及promotion脚本的构建

 

posted on 2018-05-13 22:22 贝克田庄 阅读() 评论() 编辑 收藏

版权声明:本文为clovejava原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/clovejava/p/9033704.html