jenkins中集成commander應用

来源:https://www.cnblogs.com/clovejava/archive/2018/05/13/9033704.html
-Advertisement-
Play Games

jenkins中集成commander應用 jenkins 集成測試 promotion 公司的應用較多,所以需要瞭解這幾種應用在jenkins中如何做構建,我自己參與的有兩種commander的應用,一種是大數據類的,一個是我們服務端架構組的scala應用 1、大數據應用BigData 配置如下: ...


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="[email protected]">
<gitLabConnection/>
</com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty>
<hudson.plugins.promoted__builds.JobPropertyImpl plugin="[email protected]">
<activeProcessNames>
<string>Deploy DEV</string>
</activeProcessNames>
</hudson.plugins.promoted__builds.JobPropertyImpl>
</properties>
<scm class="hudson.plugins.git.GitSCM" plugin="[email protected]">
<configVersion>2</configVersion>
<userRemoteConfigs>
<hudson.plugins.git.UserRemoteConfig>
<url>ssh://[email protected]: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腳本的構建

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JDK10安裝配置詳解 1. 下載jdk10 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html 選擇“Accept License Agreement”後根據自己的操作系統下 ...
  • 責任鏈模式, Chain of Responsibility, Java實現 ...
  • Python isdigit() 方法檢測字元串是否只由數字組成。 Python int() 函數用於將一個字元串或數字轉換為整型。 判斷字元、列表、元組等的長度或項目個數:Python len()。 enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字元串)組合為一個索引序列, ...
  • 責任鏈模式,Chain of Responsibility,Java實現 ...
  • 需要實現的功能是:三級菜單1.從文本內讀出選項2.查詢每一級的選項,並能對選項進行增/刪/改功能3.每一級可以退出程式或者返回上一層思路三個操作模塊,分別是 增/刪/改 功能三個查詢模塊,分別對每一級別進行查詢報錯信息:Traceback (most recent call last): File  ...
  • 編程問題中相當大的一部分都可以通過使用順序編程來解決。 對於某些問題,如果能夠並行地執行程式中的多個部分,則會變得非常方便。 並行編程可以使程式執行速度得到極大地提高。 當並行執行的任務彼此開始產生互相干涉時,實際的併發問題就會接踵而至。 Web伺服器經常包含多個處理器,而併發是充分利用這些處理器的 ...
  • 手冊里可能有寫,但不是特別清晰,在這給個實例,有兩種方式: 1.多個入口文件: 將public下的index.php複製一份,粘貼、重命名為對應模塊的名字,如admin: 編輯admin.php的內容,修改模塊綁定的代碼: 之後訪問方式就是'功能變數名稱/admin.php',沒有映射功能變數名稱就是'localh ...
  • 一. Java多線程: Java給多線程編程提供了內置的支持。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務。 多線程是多任務的一種特別的形式,但多線程使用了更小的資源開銷。 這裡定義和線程相關的另一個術語--進程:一個進程包括由操作系統分配的記憶體空 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...