jenkins中集成commander应用
jenkins中集成commander应用
jenkins 集成测试 promotion
最近参加公司的集成测试平台的开发,在开发中遇到了不少问题,两个星期的迭代也即将完成,在这也用这篇博客记录下开发中的问题,供读者参考
公司的应用较多,所以需要了解这几种应用在jenkins中如何做构建,我自己参与的有两种commander的应用,一种是大数据类的,一个是我们服务端架构组的scala应用
1、大数据应用BigData
配置如下:


配置文件对应的xml文件:通过crul获取xml配置文件:http://host/job/tar_py_dwx_dev/config.xml
<project>
<actions/>
<description/>
<keepDependencies>false</keepDependencies>
<properties>
<com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty plugin="gitlab-plugin@1.5.5">
<gitLabConnection/>
</com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty>
<hudson.plugins.promoted__builds.JobPropertyImpl plugin="promoted-builds@3.1">
<activeProcessNames>
<string>Deploy DEV</string>
</activeProcessNames>
</hudson.plugins.promoted__builds.JobPropertyImpl>
</properties>
<scm class="hudson.plugins.git.GitSCM" plugin="git@3.8.0">
<configVersion>2</configVersion>
<userRemoteConfigs>
<hudson.plugins.git.UserRemoteConfig>
<url>ssh://git@172.0.10.182:10022/bigdata/dwx.git</url>
<credentialsId>84f4be19-ea8d-4271-8cfb-42af8f507285</credentialsId>
</hudson.plugins.git.UserRemoteConfig>
</userRemoteConfigs>
<branches>
<hudson.plugins.git.BranchSpec>
<name>*/develop</name>
</hudson.plugins.git.BranchSpec>
</branches>
<doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
<submoduleCfg class="list"/>
<extensions/>
</scm>
<assignedNode>!macmini</assignedNode>
<canRoam>false</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers>
<hudson.triggers.SCMTrigger>
<spec>H/5 * * * *</spec>
<ignorePostCommitHooks>false</ignorePostCommitHooks>
</hudson.triggers.SCMTrigger>
</triggers>
<concurrentBuild>false</concurrentBuild>
<builders>
<hudson.tasks.Shell>
<command>
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
</command>
</hudson.tasks.Shell>
</builders>
<publishers/>
<buildWrappers/>
</project>
从xml中获取的信息有点和图中的配置文件有点对应不上
对于promotion的脚本在xml配置文件中是无法获取的,这时候就有一个问题,这种api是无法获取到promotion的的脚本,同时这也给我们的工作带来了极大的挑战,那也意味着单纯的通过这种方法是无法实现commander应用的部署,和通过平台的方式去直接操作jenkins的配置
但经过查询相关的api并不能找到相关的内容,经过不懈的努力,终于找到了和promote build 插件相关的api
查询:http://host/job/jobName/promotion/process/promotionName/config.xml
这个接口能获取到它的xml文件,但是并不能对该配置文件进行增加和修改
对此我自己封装了一些方法:
/**
* @author chenlang
* date 2018/5/7
*/
@Slf4j
public class JenkinsPromotionUtils { private static final String SUB_PATH_PROMOTION_COOMMAND = "/hudson.plugins.promoted__builds.PromotionProcess";
private static final String SUB_PATH_BUILD = "/buildSteps";
private static final String SUB_PATH_BUILDER_SHELL_COMMAND = "/hudson.tasks.Shell/command";
private static final String PATH_PROMOTION_COMMAND = SUB_PATH_PROMOTION_COOMMAND + SUB_PATH_BUILD + SUB_PATH_BUILDER_SHELL_COMMAND;
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'}}}}}}";
private static final String CONTENT_TYPE = "application/x-www-form-urlencoded"; public static void updatePromotionShell(Document jobConfigDocument, String jobName, JenkinsPromotionClient jenkinsPromotionClient, String promotionShell, String path) throws IOException, DocumentException {
if (StringUtils.isBlank(promotionShell)) {
return;
}
String promotionName = getPromotionName(jobConfigDocument, path);
Document document = jenkinsPromotionClient.getJobPromotionXml(jobName, promotionName);
document.selectSingleNode(PATH_PROMOTION_COMMAND).setText(promotionShell);
jenkinsPromotionClient.updateJob(jobName, promotionName, document.asXML());
} public static void createPromotionShell(Document jobConfigDocument, String tmpJobName, String jobName, String promotionShell, String path, JenkinsPromotionClient jenkinsPromotionClient) throws IOException, DocumentException {
if (StringUtils.isBlank(promotionShell)) {
return;
}
String promotionName = getPromotionName(jobConfigDocument, path);
Document document = jenkinsPromotionClient.getJobPromotionXml(tmpJobName, promotionName);
document.selectSingleNode(PATH_PROMOTION_COMMAND).setText(promotionShell);
Map<String, String> map = Maps.newHashMap();
map.put("Content-Type", CONTENT_TYPE);
map.put("json", String.format(CREATE_PROMOTION_JSON, promotionName));
try {
jenkinsPromotionClient.createJob(jobName, map);
} catch (Exception e) {
log.error("初创promotion时失败" + e);
}
jenkinsPromotionClient.createJob(jobName, promotionName, document.asXML());
} public static String getPromotionName(Document jobConfigDocument, String path) {
return jobConfigDocument.selectSingleNode(path).getText();
} }
package cn.caijiajia.phoenix.service.jenkins; import com.offbytwo.jenkins.client.JenkinsHttpClient;
import com.offbytwo.jenkins.client.util.EncodingUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import java.io.IOException;
import java.util.Map; /**
* @author chenlang
* date 2018/5/4
*/
@Component
public class JenkinsPromotionClient { @Autowired
private JenkinsHttpClient jenkinsHttpClient; public JenkinsPromotionClient() {
} /**
* 获取job的promotion配置文件
*
* @param jobName job名称
* @param promotionName promotion名称
* @return
* @throws IOException
*/
public Document getJobPromotionXml(String jobName, String promotionName) throws IOException, DocumentException {
return DocumentHelper.parseText(this.getJobXml(jobName, promotionName));
} /**
* 更新job
*
* @param jobName
* @param promotionName
* @param jobXml
* @throws IOException
*/
public void updateJob(String jobName, String promotionName, String jobXml) throws IOException {
this.jenkinsHttpClient.post_xml(this.toJobBaseUrl(jobName, promotionName) + "/config.xml", jobXml, true);
} /**
* 添加job脚本
*
* @param jobName
* @param jobXml
* @throws IOException
*/
public void createJob(String jobName, String promotionName, String jobXml) throws IOException {
this.jenkinsHttpClient.post_xml(this.toJobBaseUrl(jobName, promotionName) + "/config.xml", jobXml, true);
} /**
* 添加promotion的job
*
* @param jobName
* @param map
* @throws IOException
*/
public void createJob(String jobName, Map map) throws IOException {
this.jenkinsHttpClient.post_form("/job/" + EncodingUtils.encode(jobName) + "/configSubmit?", map, false);
} private String getJobXml(String jobName, String promotionName) throws IOException {
return this.jenkinsHttpClient.get(this.toJobBaseUrl(jobName, promotionName) + "/config.xml");
} private String toJobBaseUrl(String jobName, String promotionName) {
return "/job/" + EncodingUtils.encode(jobName) + "/promotion/process/" + promotionName;
} /**
* promotion脚本的构建
* @param jobName
* @param promotionName
* @param version
* @param isFirstBuild
* @throws IOException
*/
public void build(String jobName,String promotionName,Integer version,boolean isFirstBuild) throws IOException{
if (isFirstBuild) {
this.jenkinsHttpClient.post("/job/"+ EncodingUtils.encode(jobName) + "/"+version+"/promotion/forcePromotion?name="+promotionName+"&json=%7B%7D&Submit=Force promotion");
} else {
this.jenkinsHttpClient.post("/job/"+ EncodingUtils.encode(jobName) + "/"+version+"/promotion/"+promotionName+"/build?json=%7B%7D&Submit=Re-execute promotion");
}
} }
其中的方法封装了对promote build插件中关于配置的增删改查,以及promotion脚本的构建
jenkins中集成commander应用的更多相关文章
- Jenkins中集成jmeter-maven插件
转自:http://my.oschina.net/u/1377774/blog/168969 目录[-] 第一步.先在maven工程中单独使用jmeter-maven插件 0.环境 1.在POM.xm ...
- Jenkins中集成Gcov代码覆盖率报告
最近终于把gcov代码覆盖报告集成到jenkins中了,总算是完成工作,写篇博客总结下. 我循序渐进地用了三个工具:gcov, lcov, gcovr 这三个工具原理(其实gcovr依赖于GNU的gc ...
- 在Jenkins中集成Sonarqube
Analyzing with SonarQube Scanner for MSBuild Global Configuration This step is mandatory if you want ...
- jenkins 中集成JNI的坑
有包名1.生成class> javac myjni\HelloJNI.java2.生成.h文件> javah -d include myini.HelloJNI3.生成.dll文件> ...
- Jenkins中集成python,支持参数生成Makefile文件
#!/usr/bin/env python import os print os.getenv("BUILD_NUMBER") print os.getenv("uuid ...
- Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)
Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...
- 在jenkins中调用maven的变量
Maven内置变量说明: ${basedir} 项目根目录(即pom.xml文件所在目录) ${project.build.directory} 构建目录,缺省为target目录 ${project. ...
- 持续集成 解决 Jenkins 中无法展示 HTML 样式的问题
对于测试报告来说,除了内容的简洁精炼,样式的美观也很重要.常用的做法是,采用HTML格式的文档,并搭配CSS和JS,实现自定义的样式和动画效果(例如展开.折叠等). 在Jenkins中要展示HTML文 ...
- python_java_selenium_ jenkins持续集成Firfox_chrome浏览器不显示的解决方法?
python_java_selenium_ jenkins持续集成Firfox_chrome浏览器不显示的解决方法: 原因:因为jenkins是用windows installer 安装成 windo ...
随机推荐
- 9.8、Libgdx的返回键和菜单键捕获
(官网:www.libgdx.cn) 当用户在Android设备中点击返回键是,通常关闭当前运行的activity.游戏可能会给出一个确认对话框让用户选择退出或继续.要这样的话需要捕获返回键: Gdx ...
- MySQL学习笔记_9_MySQL高级操作(上)
MySQL高级操作(上) 一.MySQL表复制 create table t2 like t1; #复制表结构,t2可以学习到t1所有的表结构 insert into t2 ...
- uGUI使用代码动态添加Button.OnClick()事件(Unity3D开发之十二)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/42705885 ...
- 不要使用jQuery触发原生事件
原文链接: DO NOT TRIGGER REAL EVENT NAMES WITH JQUERY! 原文日期: 2014年02月26日 翻译日期: 2014年03月2日 翻译人员: 铁锚 JavaS ...
- Mplayer 的编译
由于项目要用到mplayer,所以要对mplayer进行编译,首先我的平台如下: 系统:windows xp2 安装好mingw+msys,目录为c:/mingw,其中装的gcc是4.3.2版本的. ...
- android 数据重构(仿淘宝浏览记录,足迹)
数据结构 ->数据重构 原因 处理这个数据的主要原因是,后台服务器返回的数据格式在ios那边因为其控件可以对数据进行分区显示,可以直接处理,而在android上我们显示控件就是listview, ...
- AndFix使用感想
AndFix已经使用了一段时间了,但是到AndFix上看了一下,最近2个月都没有更新代码了,有141个issues和3个pull request没人处理,其实AndFix的Contributors就俩 ...
- Java-ServletConfig
/** * * A servlet configuration object used by a servlet container * to pass information to a servle ...
- 带三方登录(qq,微信,微博)
实现QQ.微信.新浪微博和百度第三方登录(Android Studio) 前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于 ...
- 巨高兴,偶的文章 “如何在服务器上配置ODBC来访问本机DB2for Windows服务器”被推荐至CSDN博客首页
非常高兴,偶的文章 "如何在服务器上配置ODBC来访问本机DB2for Windows服务器"被推荐至CSDN博客首页,截图留念. 文章被推荐在C ...