Jenkins Pipeline 流水線腳本中使用 Helm 啟動應用說明


參考:http://www.mydlq.club/article/8/

創建Helm執行方法

這里提前創建好執行 helm 的方法,將其簡單封裝一下用於執行流水線時候,調用此方法,執行對應的 Helm 操作。

  • 方法名:helmDeploy()
  • 可配參數:
    init: 是否為執行 helm 初始化
    url: 初始化 chart 倉庫地址
    dry: 是否為嘗試部署
    name: 部署的應用 Release 名
    namespace: 應用啟動到哪個Namespace
    image: 鏡像名
    tag: 鏡像標簽
    template: 選用的chart模板
// 執行Helm的方法
def helmDeploy(Map args) {
    // Helm 初始化
    if(args.init){
        sh "helm init --client-only --stable-repo-url ${args.url}"
    } 
    // Helm 嘗試部署
    else if (args.dry_run) {
        println "嘗試 Helm 部署,驗證是否能正常部署"
        sh "helm upgrade --install ${args.name} --namespace ${args.namespace} -f values.yaml --set ${args.repository},${args.tag} stable/${args.template} --dry-run --debug"
    } 
    // Helm 正式部署
    else {
        println "正式 Helm 部署"
        sh "helm upgrade --install ${args.name} --namespace ${args.namespace} -f values.yaml --set ${args.repository},${args.tag} stable/${args.template}"
    }
}

// 方法調用
stage() {
    echo "Helm 初始化 http://chart.mydlq.club"
    helmDeploy(init: true ,url: "Helm 倉庫地址");
    echo "Helm 嘗試執行部署"
    helmDeploy(init: false ,dry: true ,name: "應用名" ,namespace: "應用啟動的Namespace" ,image: "鏡像名",tag: "鏡像標簽" ,template: "選用的chart模板")
    echo "Helm 正式執行部署"
    helmDeploy(init: false ,dry: false ,name: "應用名" ,namespace: "應用啟動的Namespace" ,image: "鏡像名",tag: "鏡像標簽" ,template: "選用的chart模板")
}

完整Groovy腳本

// 執行Helm的方法
def helmDeploy(Map args) {
    if(args.init){
        println "Helm 初始化"
        sh "helm init --client-only --stable-repo-url ${args.url}"
    } else if (args.dry_run) {
        println "嘗試 Helm 部署,驗證是否能正常部署"
        sh "helm upgrade --install ${args.name} --namespace ${args.namespace} ${args.values} --set ${args.image},${args.tag} stable/${args.template} --dry-run --debug"
    } else {
        println "正式 Helm 部署"
        sh "helm upgrade --install ${args.name} --namespace ${args.namespace} ${args.values} --set ${args.image},${args.tag} stable/${args.template}"
    }
}

// jenkins slave 執行流水線任務
timeout(time: 600, unit: 'SECONDS') {
    try{
        def label = "jnlp-agent"
        podTemplate(label: label,cloud: 'kubernetes' ){
            node (label) {
                stage('Git階段'){
                    echo "Git 階段"
                    git branch: "master" ,changelog: true , url: "https://github.com/my-dlq/springboot-helloworld.git"
                }
                stage('Maven階段'){
                    echo "Maven 階段"
                    container('maven') {
                        //這里引用上面設置的全局的 settings.xml 文件,根據其ID將其引入並創建該文件
                        configFileProvider([configFile(fileId: "75884c5a-4ec2-4dc0-8d87-58b6b1636f8a", targetLocation: "settings.xml")]){
                            sh "mvn clean install -Dmaven.test.skip=true --settings settings.xml"
                        }
                    }
                }
                stage('Docker階段'){
                    echo "Docker 階段"
                    container('docker') {
                        // 讀取pom參數
                        echo "讀取 pom.xml 參數"
                        pom = readMavenPom file: './pom.xml'
                        // 設置鏡像倉庫地址
                        hub = "registry.cn-shanghai.aliyuncs.com"
                        // 設置倉庫項目名
                        project_name = "mydlq"
                        echo "編譯 Docker 鏡像"
                        docker.withRegistry("http://${hub}", "ffb3b544-108e-4851-b747-b8a00bfe7ee0") {
                            echo "構建鏡像"
                            // 設置推送到aliyun倉庫的mydlq項目下,並用pom里面設置的項目名與版本號打標簽
                            def customImage = docker.build("${hub}/${project_name}/${pom.artifactId}:${pom.version}")
                            echo "推送鏡像"
                            customImage.push()
                            echo "刪除鏡像"
                            sh "docker rmi ${hub}/${project_name}/${pom.artifactId}:${pom.version}" 
                        }
                    }
                }
                stage('Helm階段'){
                    container('helm-kubectl') {
                        withKubeConfig([credentialsId: "8510eda6-e1c7-4535-81af-17626b9575f7",serverUrl: "https://kubernetes.default.svc.cluster.local"]) {
                            // 設置參數
                            image = "image.repository=${hub}/${project_name}/${pom.artifactId}"
        		            tag = "image.tag=${pom.version}"
        		            // 設置使用的 chart 並指定版本
        		            template = "spring-boot --version 1.1.0"
        		            repo_url = "http://chart.mydlq.club"
        		            app_name = "${pom.artifactId}"
        		            // 檢測是否存在yaml文件
        		            def values = ""
        		            if (fileExists('values.yaml')) {
        		                values = "-f values.yaml"
        		            }
        		            // 執行 Helm 方法
                            echo "Helm 初始化"
                            helmDeploy(init: true ,url: "${repo_url}");
                            echo "Helm 執行部署測試"
                            helmDeploy(init: false ,dry_run: true ,name: "${app_name}" ,namespace: "mydlqcloud" ,image: "${image}" ,tag: "${tag}" , values: "${values}" ,template: "${template}")
                            echo "Helm 執行正式部署"
                            helmDeploy(init: false ,dry_run: false ,name: "${app_name}" ,namespace: "mydlqcloud",image: "${image}" ,tag: "${tag}" , values: "${values}" ,template: "${template}")
                        }
                    }
                }
            }
        }
    }catch(Exception e) {
        currentBuild.result = "FAILURE"
    }finally {
        // 獲取執行狀態
        def currResult = currentBuild.result ?: 'SUCCESS' 
        // 判斷執行任務狀態,根據不同狀態發送郵件
        stage('email'){
            if (currResult == 'SUCCESS') {
                echo "發送成功郵件"
                emailext(subject: '任務執行成功',to: '32******7@qq.com',body: '''任務已經成功構建完成...''')
            }else {
                echo "發送失敗郵件"
                emailext(subject: '任務執行失敗',to: '32******7@qq.com',body: '''任務執行失敗構建失敗...''')
            }
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM