十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
小編給大家分享一下jenkins中怎么集成commander應用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)建站是專業(yè)的哈密網(wǎng)站建設公司,哈密接單;提供成都網(wǎng)站制作、網(wǎng)站設計,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行哈密網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
前言
Jenkins 是一款流行的開源持續(xù)集成(Continuous Integration)工具,廣泛用于項目開發(fā),具有自動化構(gòu)建、測試和部署等功能。
最近參加公司的集成測試平臺的開發(fā),在開發(fā)中遇到了不少問題,兩個星期的迭代也即將完成,在這也用這篇博客記錄下開發(fā)中的問題,供讀者參考
公司的應用較多,所以需要了解這幾種應用在jenkins中如何做構(gòu)建,我自己參與的有兩種commander的應用,一種是大數(shù)據(jù)類的,一個是我們服務端架構(gòu)組的scala應用
1、大數(shù)據(jù)應用BigData
配置如下:

配置文件對應的xml文件:通過crul獲取xml配置文件:http://host/job/tar_py_dwx_dev/config.xml
false Deploy DEV 2 ssh://git@172.0.10.182:10022/bigdata/dwx.git 84f4be19-ea8d-4271-8cfb-42af8f507285 */develop false !macmini false false false false H/5 * * * * false false 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
從xml中獲取的信息有點和圖中的配置文件有點對應不上
對于promotion的腳本在xml配置文件中是無法獲取的,這時候就有一個問題,這種api是無法獲取到promotion的的腳本,同時這也給我們的工作帶來了極大的挑戰(zhàn),那也意味著單純的通過這種方法是無法實現(xiàn)commander應用的部署,和通過平臺的方式去直接操作jenkins的配置
但經(jīng)過查詢相關(guān)的api并不能找到相關(guān)的內(nèi)容,經(jīng)過不懈的努力,終于找到了和promote build 插件相關(guān)的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 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("初創(chuàng)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腳本的構(gòu)建
* @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插件中關(guān)于配置的增刪改查,以及promotion腳本的構(gòu)建
以上是“jenkins中怎么集成commander應用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!