中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Jenkins遷移之pipeline共享庫怎么使用

發布時間:2022-07-22 09:46:29 來源:億速云 閱讀:232 作者:iii 欄目:開發技術

這篇文章主要介紹“Jenkins遷移之pipeline共享庫怎么使用”,在日常操作中,相信很多人在Jenkins遷移之pipeline共享庫怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Jenkins遷移之pipeline共享庫怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    背景

    我們一直使用的 jenkins 服務還是 2.0 以下不支持 pipeline 的版本。平時創建任務多數使用 maven 項目,構建后的 shell 部署命令都是在各個 job 中獨立維護。這種方式的缺點就是:
    1.腳本維護麻煩 (環境對應的服務器變更,構建入參更新等等狀況);
    2.不利于后期功能擴展 (例如 java 服務想接入覆蓋率服務);
    3.不利于 jenkins 項目遷移 (例如磁盤不足等原因)。
    剛好上述原因都遇到了,所以計劃遷移到新的 Jenkins 服務中,所有 job 都通過 pipeline 來管理。在使用 pipelin 之后的感覺用 2 個字來形容:真香

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

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

    初期需求

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

    成果展示

    先展示下目前的成果:

    1.創建 job

    這里是說在 Jenkins 中配置簡單,其實還有一些信息配置的,是保存在文件或者數據庫中

    Jenkins遷移之pipeline共享庫怎么使用

    2.job 參數配置

    Jenkins遷移之pipeline共享庫怎么使用

    default jenkinsfile 文件的維護 (僅僅負責調用共享庫,所有的實現均在共享庫項目中完成) 

    Jenkins遷移之pipeline共享庫怎么使用

    共享庫

    共享庫結構

    ├─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
        }
    }

    參數使用 jobInfo 對象管理

    /**
    針對不同類型的項目,使用不同的jobInfo:JavaJobInfo/AppJobinfo
    */
    class JobInfo {
        /**
         * 頁面入參
         */
        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
        }
        /**
         * 配置參數
         */
        //通用字段
        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)
        }
        //默認項
        /**
         * 是否為自動構建
         */
        boolean isAutoBuild = false
        /**
         * 自動構建時,默認構建的環境:加入構建指令需要環境參數時
         */
        String defaultEnv = "test"
        /**
         * 默認構建方式:僅構建
         */
        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 結構:defaultPipeline.groovy

    Jenkins遷移之pipeline共享庫怎么使用

    動態參數:initParamsStage.groovy

    stage("init params step"){
            script{
                log.info("start init params...")
                /**
                 * 先根據構建工具,來構建不同的構建參數
                 * 后期如果同一個構建工具,針對不同的job,入參類型不同,那么在根據job處理
                 */
                switch (jobInfo.toolsType){
                    case ToolsType.MVN:
                        properties([
                                parameters([
                                        choice(name:'env', choices:env_list, description:'選擇構建環境'),
                                        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:'選擇構建環境'),
                                            choice(name:'buildType', choices:['buildAndDeploy', 'build', 'deploy'],
                                                    description:'選擇部署方式:編譯并部署、僅編譯、僅部署')
                                    ])
                            ])
                        }else{
                            properties([
                                    parameters([
                                            choice(name:'env', choices:env_list, description:'選擇構建環境'),
                                            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:'選擇構建環境'),
                                        choice(name:'buildType', choices:['buildAndDeploy', 'build', 'deploy'],
                                                description:'選擇部署方式:編譯并部署、僅編譯、僅部署')
                                ])
                        ])
                }
            }
        }

    共享庫的擴展示例

    java 服務增加 jacoco 覆蓋率功能

    1.維護 JavaAppInfo 對象

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

    2.在部署時,啟動 jacoco

    def exec_jar(JavaJobInfo jobInfo){
        def util = new common_util()
        def log = new Log()
        def jacocoHandle = new JacocoHandle()
        //判斷是否要啟用jacoco服務
        if(jobInfo.isCollectCoverage){
            //先獲取jacoco port
            jacocoHandle.getJacocoPort(jobInfo)
            //在獲取本次構建代碼最新的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共享庫怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    青州市| 成都市| 叙永县| 镇雄县| 绍兴县| 日土县| 朝阳市| 琼结县| 盘锦市| 宁津县| 潍坊市| 年辖:市辖区| 大渡口区| 高尔夫| 阳原县| 霍林郭勒市| 吴旗县| 屏边| 通辽市| 龙川县| 湖口县| 三江| 乌兰察布市| 昌图县| 曲麻莱县| 陆河县| 富顺县| 白玉县| 喜德县| 大厂| 盘锦市| 永嘉县| 霍州市| 纳雍县| 穆棱市| 青神县| 亚东县| 汶川县| 改则县| 五原县| 阳春市|