欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Jenkins遷移之pipeline共享庫(kù)的實(shí)踐示例

 更新時(shí)間:2022年07月21日 16:01:19   作者:alwans  
這篇文章主要為大家介紹了Jenkins遷移之pipeline共享庫(kù)的實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

我們一直使用的 jenkins 服務(wù)還是 2.0 以下不支持 pipeline 的版本。平時(shí)創(chuàng)建任務(wù)多數(shù)使用 maven 項(xiàng)目,構(gòu)建后的 shell 部署命令都是在各個(gè) job 中獨(dú)立維護(hù)。這種方式的缺點(diǎn)就是:
1.腳本維護(hù)麻煩 (環(huán)境對(duì)應(yīng)的服務(wù)器變更,構(gòu)建入?yún)⒏碌鹊葼顩r);
2.不利于后期功能擴(kuò)展 (例如 java 服務(wù)想接入覆蓋率服務(wù));
3.不利于 jenkins 項(xiàng)目遷移 (例如磁盤不足等原因)。
剛好上述原因都遇到了,所以計(jì)劃遷移到新的 Jenkins 服務(wù)中,所有 job 都通過(guò) pipeline 來(lái)管理。在使用 pipelin 之后的感覺(jué)用 2 個(gè)字來(lái)形容:真香

順便感謝一下大佬,但是不知道他的 id,所以直接貼一下他的gitee 共享庫(kù)項(xiàng)目地址

我的共享庫(kù)項(xiàng)目中縫合了大佬很多代碼,寫的太好了,忍不住借鑒一下

初期需求

遷移之初,參考了網(wǎng)上很多的 pipeline 使用教程。首先肯定不想在每個(gè)項(xiàng)目中,維護(hù)大量的 Jenkinsfile 文件 (萬(wàn)一需要修改,那不是得改到吐,雖然也可以用 git 項(xiàng)目來(lái)統(tǒng)一管理 jenkinsfile),最終采用了 Multibranch Pipeline with defaults(多分支流水線) + Pipeline: Multibranch with defaults 插件的方式,通過(guò)維護(hù)簡(jiǎn)單的 default jenkinfile 文件來(lái)實(shí)現(xiàn) pipeline 的使用。第二個(gè)考慮的問(wèn)題就是,后期對(duì)腳本的維護(hù)和擴(kuò)展希望盡可能的簡(jiǎn)單,這自然就想到 pipeline 共享庫(kù)的使用。

成果展示

先展示下目前的成果:

1.創(chuàng)建 job

這里是說(shuō)在 Jenkins 中配置簡(jiǎn)單,其實(shí)還有一些信息配置的,是保存在文件或者數(shù)據(jù)庫(kù)中

2.job 參數(shù)配置

default jenkinsfile 文件的維護(hù) (僅僅負(fù)責(zé)調(diào)用共享庫(kù),所有的實(shí)現(xiàn)均在共享庫(kù)項(xiàng)目中完成) 

共享庫(kù)

共享庫(kù)結(jié)構(gòu)

├─resources
│ app.json
│ base.json
│ host_info.json
├─src
│ │
│ └─com
│ │ common_util.groovy
│ │ exec_shell.groovy
│ │ Log.groovy
│ │
│ ├─beans
│ │ AppJobInfo.groovy
│ │ HostInfo.groovy
│ │ JavaJobInfo.groovy
│ │ JobInfo.groovy
│ │
│ ├─build
│ │ androidBuild.groovy
│ │ build.groovy
│ │ gradleBuild.groovy
│ │ mavenBuild.groovy
│ │ npmBuild.groovy
│ │ yarnBuild.groovy
│ │
│ ├─deploy
│ │ deploy.groovy
│ │
│ ├─enums
│ │ BuildType.groovy
│ │ PipelineType.groovy
│ │ ToolsType.groovy
│ │
│ ├─qikqiak
│ │ GlobalVars.groovy
│ │
│ └─services
│ JacocoHandle.groovy
└─vars
defaultPipeline.groovy
initParamsStage.groovy
loadPipeline.groovy
testPipeline.groovy
unknownPipeline.groovy

入口代碼: loadPipeline.groovy

def call(PipelineType pipelineType) {
    JobInfo jobInfo = creatJobInfo()
    switch (pipelineType) {
        case PipelineType.DefaultPipeline:
            defaultPipeline jobInfo
            break
        case PipelineType.TestPipeline:
            testPipeline jobInfo
            break
        default:
            unknownPipeline null
            break
    }
}

參數(shù)使用 jobInfo 對(duì)象管理

/**
針對(duì)不同類型的項(xiàng)目,使用不同的jobInfo:JavaJobInfo/AppJobinfo
*/
class JobInfo {
    /**
     * 頁(yè)面入?yún)?
     */
    String jobName
    String env
    BuildType buildType
    String branchName
    JobInfo(Map map){
        this.jobName = map.job_name
        this.env = map.env
        this.buildType = BuildType.getBuildTypeByKey(map.buildType)
        this.branchName = map.branchName
    }
    /**
     * 配置參數(shù)
     */
    //通用字段
    String groupName
    ToolsType toolsType
    Map<String, String> envMap
    def setConfigParams(Map map){
        this.groupName = map.groupName
        this.toolsType = com.enums.ToolsType.getToolsTypeByKey(map.toolsType)
        this.envMap = map.env_map
    }
    def getEnvKeyList(){
        return this.envMap.keySet().toList()
    }
    def getHost(){
        return this.envMap.get(this.env)
    }
    //默認(rèn)項(xiàng)
    /**
     * 是否為自動(dòng)構(gòu)建
     */
    boolean isAutoBuild = false
    /**
     * 自動(dòng)構(gòu)建時(shí),默認(rèn)構(gòu)建的環(huán)境:加入構(gòu)建指令需要環(huán)境參數(shù)時(shí)
     */
    String defaultEnv = "test"
    /**
     * 默認(rèn)構(gòu)建方式:僅構(gòu)建
     */
    BuildType defaultBuildType = BuildType.BUILD
    @NonCPS
    def setAutoBuildParams(){
        this.env = defaultEnv
        this.buildType = defaultBuildType
    }
    @Override
    @NonCPS
    public String toString() {
        return "JobInfo{" +
                "jobName='" + jobName + '\'' +
                ", env='" + env + '\'' +
                ", buildType=" + buildType +
                ", branchName='" + branchName + '\'' +
                ", groupName='" + groupName + '\'' +
                ", toolsType=" + toolsType +
                ", envMap=" + envMap +
                ", isAutoBuild=" + isAutoBuild +
                ", defaultEnv='" + defaultEnv + '\'' +
                ", defaultBuildType=" + defaultBuildType +
                '}';
    }
}

pipeline 結(jié)構(gòu):defaultPipeline.groovy

動(dòng)態(tài)參數(shù):initParamsStage.groovy

stage("init params step"){
        script{
            log.info("start init params...")
            /**
             * 先根據(jù)構(gòu)建工具,來(lái)構(gòu)建不同的構(gòu)建參數(shù)
             * 后期如果同一個(gè)構(gòu)建工具,針對(duì)不同的job,入?yún)㈩愋筒煌?,那么在根?jù)job處理
             */
            switch (jobInfo.toolsType){
                case ToolsType.MVN:
                    properties([
                            parameters([
                                    choice(name:'env', choices:env_list, description:'選擇構(gòu)建環(huán)境'),
                                    booleanParam(defaultValue:false, name: 'isCollectCoverage',description: '是否啟用jacoco收集代碼覆蓋率'),
                                    choice(name:'buildType', choices:['buildAndDeploy', 'build', 'deploy'],
                                            description:'選擇部署方式:編譯并部署、僅編譯、僅部署')
                            ])
                    ])
                    break
                case ToolsType.GRADLE:
                    if(jobInfo instanceof AppJobInfo){
                        properties([
                                parameters([
                                        choice(name:'env', choices:env_list, description:'選擇構(gòu)建環(huán)境'),
                                        choice(name:'buildType', choices:['buildAndDeploy', 'build', 'deploy'],
                                                description:'選擇部署方式:編譯并部署、僅編譯、僅部署')
                                ])
                        ])
                    }else{
                        properties([
                                parameters([
                                        choice(name:'env', choices:env_list, description:'選擇構(gòu)建環(huán)境'),
                                        booleanParam(defaultValue:false, name: 'isCollectCoverage',description: '是否啟用jacoco收集代碼覆蓋率'),
                                        choice(name:'buildType', choices:['buildAndDeploy', 'build', 'deploy'],
                                                description:'選擇部署方式:編譯并部署、僅編譯、僅部署')
                                ])
                        ])
                    }
                    break
                default:
                    properties([
                            parameters([
                                    choice(name:'env', choices:env_list, description:'選擇構(gòu)建環(huán)境'),
                                    choice(name:'buildType', choices:['buildAndDeploy', 'build', 'deploy'],
                                            description:'選擇部署方式:編譯并部署、僅編譯、僅部署')
                            ])
                    ])
            }
        }
    }

共享庫(kù)的擴(kuò)展示例

java 服務(wù)增加 jacoco 覆蓋率功能

1.維護(hù) JavaAppInfo 對(duì)象

class JavaJobInfo extends JobInfo{
    boolean isCollectCoverage
    JavaJobInfo(Map map) {
        super(map)
        this.isCollectCoverage =  map.isCollectCoverage
    }
    //Jacoco相關(guān)屬性
    String jacocoPort
    String projectId //jacoco覆蓋率服務(wù)中,coverage_app表中的project_id字段
    String commitId
    String includes  //需要增強(qiáng)類的通配符表達(dá)式
    String excludes  //需要排除增強(qiáng)類的通配符表達(dá)式
}

2.在部署時(shí),啟動(dòng) jacoco

def exec_jar(JavaJobInfo jobInfo){
    def util = new common_util()
    def log = new Log()
    def jacocoHandle = new JacocoHandle()
    //判斷是否要啟用jacoco服務(wù)
    if(jobInfo.isCollectCoverage){
        //先獲取jacoco port
        jacocoHandle.getJacocoPort(jobInfo)
        //在獲取本次構(gòu)建代碼最新的commit id
        jacocoHandle.getCommitId(jobInfo)
        def shell_str = "ssh root@${jobInfo.getHost()} '/home/deployscripts/deploy.sh -d jar //省略 "
        if(jobInfo.includes !=""){
            shell_str += " -I ${jobInfo.includes}"
        }
        if(jobInfo.excludes != ""){
            shell_str += " -E ${jobInfo.excludes}"
        }
        shell_str += "'"
        sh "${shell_str}"
    }else{
        sh "ssh root@${jobInfo.getHost()} '/home/deployscripts/deploy.sh -d jar //省略 " 
    }
}

以上就是Jenkins遷移之pipeline共享庫(kù)的實(shí)踐示例的詳細(xì)內(nèi)容,更多關(guān)于Jenkins遷移共享庫(kù)pipeline的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論