国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Devops系列六(CI篇之jenkinsfile)jenkins將gitlab helm yaml和argocd 串聯(lián),自動部署到K8S

這篇具有很好參考價值的文章主要介紹了Devops系列六(CI篇之jenkinsfile)jenkins將gitlab helm yaml和argocd 串聯(lián),自動部署到K8S。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

一、為什么是jenkinsfile

上文我們說了pipeline,已為本文鋪路不少,接下里就是將之串聯(lián)起來。
先想說下,為什么是jenkinsfile, 因?yàn)閖enkins job還支持pipeline方式。
Devops系列六(CI篇之jenkinsfile)jenkins將gitlab helm yaml和argocd 串聯(lián),自動部署到K8S,ci/cd,jenkins
這種方式,不建議實(shí)際使用,僅限于測試或調(diào)試groovy代碼。

下面貼出來,我們的使用方式。好處是:采用分布式的思想,改動git上的jenkinsfile,就可以讓所有的job更新。
Devops系列六(CI篇之jenkinsfile)jenkins將gitlab helm yaml和argocd 串聯(lián),自動部署到K8S,ci/cd,jenkins

二、jenkinsfile的參數(shù)

這也有兩種方式,我反而又不建議你寫在jenkinsfile里。

  • Job (建議方式,因?yàn)槊總€工程的參數(shù)不一樣,需要持久化保存)
  • jenkinsfile

Devops系列六(CI篇之jenkinsfile)jenkins將gitlab helm yaml和argocd 串聯(lián),自動部署到K8S,ci/cd,jenkins
對于java語言來說, 我梳理了以下幾個必須參數(shù):

  • jarName
  • port
  • projectName(消息通知)
  • codeUrl
  • branch

為了一些額外需求,我們還定義了幾個擴(kuò)展參數(shù):

  • packageType(打包方式,mvn或者gradle。默認(rèn)為mvn)
  • robotKey(消息通知的機(jī)器人robot,默認(rèn)為空)
  • childModule(子模塊, 用于一個多module的項(xiàng)目打包,指定某模塊以發(fā)布。默認(rèn)為空)

三、groovy編碼的幾點(diǎn)建議

1、變量一定要使用trim()方法

舉例,shell命令讀取程序版本號,返回值如果沒有使用trim(),會額外多一個換行符。-- 后期在使用該變量拼接的時候,很容易就把明明一行執(zhí)行的,硬生生地被拆成了兩行執(zhí)行。

// 讀取java應(yīng)用的版本號
def getAppVersion(packagePath) {
    def appVersion = sh returnStdout: true,
            script: """
                    grep 'git.build.version' ${packagePath}/classes/git.properties | cut -d'=' -f2 | sed 's/\\r//'
                    """
    // trim()
    return appVersion.trim()
}

// 鏡像版本號
def dockerImageVersion = appVersion + "-001"

docker build -f ${dockerfileName} -t ${repoProject}/${appName}:${dockerImageVersion} .
// 如果你沒有使用trim()的話, 上面的這行代碼,就會變成:
docker build -f ${dockerfileName} -t ${repoProject}/${appName}:${dockerImageVersion}
// 我還在納悶,怎么最后的.被誰吃掉了呢。。。
// 當(dāng)你期望的是
docker build -f /opt/Dockerfile -t xxx/devops-service:1.0.7-001 .

// 實(shí)際卻是:
docker build -f /opt/Dockerfile -t xxx/devops-service:1.0.7

2、引入pipeline library

這里的名稱,對應(yīng)前文配置中的name

為了避免jenkinsfile的代碼量過于復(fù)雜,我們往往會抽取出公共的方法。

@Library('jenkinslib') _

def tools = new com.xhtech.devops.tools()

tools.PrintMes("pull code!!!", "green")

3、讀取參數(shù)

這里的參數(shù)分為兩種,一是自定義,一是系統(tǒng)自帶。

  • 字符串類型的變量,后面都緊跟著trim()方法。
// JOB_NAME是系統(tǒng)自帶
String jobName = "${env.JOB_NAME}".trim()

// jarName是我們在job的參數(shù)化構(gòu)建中配置
String jarName = "${env.jarName}".trim()

4、運(yùn)行shell命令

// 正確的寫法,必須由script括起來
script {
    sh "mvn clean package -Dmaven.test.skip=true -U"                
}

5、切換目錄

dir("${env.WORKSPACE}") 

6、指定容器

默認(rèn)容器是jnlp, 如果你的Pod配置了多個容器,docker image的相關(guān)操作就必須在docker容器里執(zhí)行。

  • container(‘docker’),這里的docker就是對應(yīng)PodTemplate中的容器名稱。
container('docker') {
    dir("${env.WORKSPACE}") {
        docker.buildAndPushImage(jarName, port, dockerImageVersion, packagePath, dockerfileName)
    }
}

7、歸檔archiveArtifacts

把版本號寫入到文件,并且歸檔

dir("${env.WORKSPACE}") {
    sh "echo ${appVersion} > version_${appVersion}.txt"

    archiveArtifacts artifacts: 'version_*.txt', followSymlinks: false
}

Devops系列六(CI篇之jenkinsfile)jenkins將gitlab helm yaml和argocd 串聯(lián),自動部署到K8S,ci/cd,jenkins

8、設(shè)置操作的超時時間

timeout(time: 1, unit: "MINUTES") {
  // 具體操作,預(yù)計(jì)在1分鐘內(nèi)完成
}

9、指定工作空間

我們把工作空間持久化到某個目錄,而不是放在Pod里。這樣的好處是:起到了緩存的作用,不會隨著Pod的銷毀而需重建。

// 我們會對/opt/.m2進(jìn)行持久化操作
String sharefile = "/opt/.m2"
String jobName = "${env.JOB_NAME}".trim()

String PROJECT_WORKSPACE = "$sharefile/java-workspaces/$jobName"

agent {
    kubernetes {
        inheritFrom 'jnlp-maven'
        customWorkspace "${PROJECT_WORKSPACE}"
    }
}

10、清理空間

安裝jenkins plugin: Workspace Cleanup

// 文檔地址: https://plugins.jenkins.io/ws-cleanup/

stage('Clean Workspace') {
    steps {
        cleanWs()
    }
}

四、完整的java-k8s.jenkinsfile


#!groovy

@Library('jenkinslib') _

String sharefile = "/opt/.m2"
String dockerfileName = sharefile + "/" + "Dockerfile"

// java代碼倉庫gitlab的ssh密鑰
String gitlabCredentialsId = "ffcbbd41-1e6a-49ec-8277-87a1299606dd"

def tools = new com.xxtech.devops.tools()
def http = new com.xxtech.devops.http()
def docker = new com.xxtech.devops.docker()
def helm = new com.xxtech.devops.helm()

// OA:項(xiàng)目管理--研發(fā)項(xiàng)目--產(chǎn)品列表中的英文名稱
String projectName = "${env.projectName}".trim()

// jenkins job
String jobName = "${env.JOB_NAME}".trim()

// jar包的名稱
String jarName = "${env.jarName}".trim()
// java應(yīng)用的端口
int port = "${env.port}"
// java代碼的git倉庫地址
String codeUrl = "${env.codeUrl}".trim()
// java代碼的git分支
String branch = "${env.branch}".trim()

// 消息通知的機(jī)器人robot
String robotKey = "${env.robotKey}".trim()

// 打包方式,mvn或者gradle
String packageType = "${env.packageType}".trim()

// 構(gòu)建者
String buildUser = ""

// 版本號, 由jenkins去讀取
String appVersion = ""

//docker image version
String dockerImageVersion = ""

// 子模塊, 用于一個多module的項(xiàng)目打包,指定某模塊以發(fā)布
String childModule = "${env.childModule}".trim()
String packagePath = "target"
if (childModule && childModule != "null" && childModule.trim() != "") {
    tools.PrintMes("build package for childModule: " + childModule, "green")
    packagePath = childModule + "/target"
}

// 判斷是否為gradle打包
boolean gradlePackage = packageType.equalsIgnoreCase("gradle")
if (gradlePackage) {
    packagePath = "build/libs"
}
String gradleUserHome = "$sharefile/java-gradle-homes"
String gradleProjectCacheDir = "$gradleUserHome/$jobName"

// workspace
String PROJECT_WORKSPACE = "$sharefile/java-workspaces/$jobName"

// 校驗(yàn)不能為空
if (!projectName) {
    tools.PrintMes("projectName is null", "red")
    return
}

if (!jarName) {
    tools.PrintMes("jarName is null", "red")
    return
}

if (!codeUrl) {
    tools.PrintMes("codeUrl is null", "red")
    return
}

if (!branch) {
    tools.PrintMes("branch is null", "red")
    return
}

//根據(jù)jobName讀取環(huán)境區(qū)分
String[] jobInfoArray = jobName.split("_")
// 環(huán)境
String buildEnv = jobInfoArray[0]

pipeline {
    agent {
        kubernetes {
            inheritFrom 'jnlp-maven'
            customWorkspace "${PROJECT_WORKSPACE}"
        }
    }

    options {
        timestamps()  //日志會有時間
        skipDefaultCheckout()  //刪除隱式checkout scm語句
        disableConcurrentBuilds() //禁止并行
        timeout(time: 1, unit: 'HOURS')  //流水線超時設(shè)置1h
    }

    stages {
        stage('Get UserInfo') {
            steps {
                wrap([$class: 'BuildUser']) {
                    script {
                        def BUILD_USER = "${env.BUILD_USER}"
                        def BUILD_USER_ID = "${env.BUILD_USER_ID}"

                        buildUser = BUILD_USER + "(" + BUILD_USER_ID + ")"
                    }
                }
            }
        }

        stage('Pull Code') {
            steps {
                script {
                    tools.PrintMes("pull code!!!", "green")
                    // 拉取代碼:git協(xié)議
                    git branch: "$branch", credentialsId: "$gitlabCredentialsId", url: "$codeUrl"
                }
            }
            post {
                failure {
                    //當(dāng)此Pipeline失敗時打印消息
                    script {
                        tools.PrintMes("pull code failure!!!", "red")
                        http.imNotify(projectName, "FAIL", buildEnv, "pull code failure", branch, buildUser, robotKey)
                    }
                }
            }
        }

        stage('Compile') {
            steps {
                script {
                    tools.PrintMes("compile!!!", "green")
                    container('maven') {
                        dir("${env.WORKSPACE}") {
                            if (gradlePackage) {
                                sh "$sharefile/gradle-7.6/bin/gradle build -x test --build-cache -g $gradleUserHome --no-daemon --project-cache-dir $gradleProjectCacheDir"
                            } else {
                                sh "mvn clean package -Dmaven.test.skip=true -U  -s  $sharefile/settings.xml"
                            }
                        }
                    }
                }
            }
            post {
                failure {
                    //當(dāng)此Pipeline失敗時打印消息
                    script {
                        tools.PrintMes("compile failure!!!", "red")
                        http.imNotify(projectName, "FAIL", buildEnv, "compile failure", branch, buildUser, robotKey)
                    }
                }
            }
        }

        stage('Get Version') {
            steps {
                script {
                    tools.PrintMes("Get Version!!!", "green")
                    appVersion = tools.getAppVersion(packagePath)
                    // 輸出程序的版本號
                    tools.PrintMes("get version: ${appVersion}", "green")
                }
            }
            post {
                failure {
                    //當(dāng)此Pipeline失敗時打印消息
                    script {
                        tools.PrintMes("Get Version failure!!!", "red")
                        http.imNotify(projectName, "FAIL", buildEnv, "Get Version failure", branch, buildUser, robotKey)
                    }
                }
            }
        }

        stage('Push Docker Image') {
            steps {
                script {
                    tools.PrintMes("Push Docker Image!!!", "green")
                    def currentTime = sh returnStdout: true,
                            script: """
                                    date +%m%d%H%M%S
                                    """
                    // 注意:這里的分隔符不能使用冒號, trim()
                    dockerImageVersion = appVersion + "-" + currentTime.trim()
                    tools.PrintMes("Docker Image Version: ${dockerImageVersion}", "green")

                    container('docker') {
                        dir("${env.WORKSPACE}") {
                            docker.buildAndPushImage(jarName, port, dockerImageVersion, packagePath, dockerfileName)
                        }
                    }
                }
            }
            post {
                failure {
                    //當(dāng)此Pipeline失敗時打印消息
                    script {
                        tools.PrintMes("Push Docker Image failure!!!", "red")
                        http.imNotify(projectName, "FAIL", buildEnv, "Push Docker Image failure", branch, buildUser, robotKey)
                    }
                }
            }
        }

        stage('Clean Workspace') {
            steps {
                script {
                    tools.PrintMes("Clean Workspace!!!", "green")
                    cleanWs()
                }
            }
            post {
                failure {
                    script {
                        //當(dāng)此Pipeline失敗時打印消息
                        tools.PrintMes("Clean Workspace failure!!!", "red")
                        http.imNotify(projectName, "FAIL", buildEnv, "Clean Workspace failure", branch, buildUser, robotKey)
                    }
                }
            }
        }

        stage('Update Helm Yaml') {
            steps {
                script {
                    tools.PrintMes("Update Helm Yaml!!!", "green")

                    helm.updateYaml(jarName, dockerImageVersion)
                }
            }
            post {
                failure {
                    script {
                        //當(dāng)此Pipeline失敗時打印消息
                        tools.PrintMes("Update Helm Yaml failure!!!", "red")
                        http.imNotify(projectName, "FAIL", buildEnv, "Update Helm Yaml failure", branch, buildUser, robotKey)
                    }
                }
            }
        }
    }

    post {
        success {
            //當(dāng)此Pipeline成功時打印消息
            timeout(time: 1, unit: "MINUTES") {
                script {
                    tools.PrintMes("archive jar, send the message of build successfully to user", "green")
                    container('maven') {
                        dir("${env.WORKSPACE}") {
                            sh "echo ${appVersion} > version_${appVersion}.txt"

                            archiveArtifacts artifacts: 'version_*.txt', followSymlinks: false
                        }

                        http.imNotify(projectName, "SUCCESS", buildEnv, "OK", branch, buildUser, robotKey)
                    }
                }
            }
        }
    }
}

五、消息通知

  • TODO: 我們對于構(gòu)建成功的消息內(nèi)容,增加程序版本號。

Devops系列六(CI篇之jenkinsfile)jenkins將gitlab helm yaml和argocd 串聯(lián),自動部署到K8S,ci/cd,jenkins
具體消息通知的實(shí)現(xiàn),就不在本文的范疇。

寫在末尾的話

后期,我們有空,就Jenkins集群、插件(包括二次開發(fā)插件)等話題,聊一聊我們的實(shí)際使用情況。文章來源地址http://www.zghlxwxcb.cn/news/detail-537070.html

到了這里,關(guān)于Devops系列六(CI篇之jenkinsfile)jenkins將gitlab helm yaml和argocd 串聯(lián),自動部署到K8S的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • DevOps-Jenkins-CI持續(xù)集成操作

    DevOps-Jenkins-CI持續(xù)集成操作

    創(chuàng)建個web項(xiàng)目 我這里直接用Spring Web自動生成的demos 啟動項(xiàng)目,訪問展示如下默認(rèn)頁面信息 在項(xiàng)目下新建docker目錄,新增Dockerfile、docker-compose.yml文件 Dockerfile文件,將mytest.jar 復(fù)制到容器的/usr/local/目錄下,在/usr/local執(zhí)行命令java -jar mytest.jar docker-compose.yml文件,當(dāng)前目錄以D

    2024年03月13日
    瀏覽(29)
  • docker部署Jenkins(Jenkins+Gitlab+Maven實(shí)現(xiàn)CI/CD)

    docker部署Jenkins(Jenkins+Gitlab+Maven實(shí)現(xiàn)CI/CD)

    ?? ?? GitLab是一個用于倉庫管理系統(tǒng)的開源項(xiàng)目,使用Git作為代碼管理工具,并在此基礎(chǔ)上搭建起來的Web服務(wù),可通過Web界面進(jìn)行訪問公開的或者私人項(xiàng)目。它擁有與Github類似的功能,能夠?yàn)g覽源代碼,管理缺陷和注釋。 ??????GitLab是由GitLabInc.開發(fā),使用MIT許可證的基于

    2024年02月03日
    瀏覽(32)
  • gitlab+jenkins+harbor實(shí)現(xiàn)CI/CD(2)——初級

    gitlab+jenkins+harbor實(shí)現(xiàn)CI/CD(2)——初級

    git安裝 jenkins主機(jī)上安裝docker-ce 配置倉庫證書 測試 創(chuàng)建項(xiàng)目 創(chuàng)建一個freestyle project 在jenkins主機(jī)獲取密鑰 在gitlab上傳公鑰 在jenkins上傳私鑰 輸入測試命令后保存 點(diǎn)擊立即構(gòu)建 查看控制臺輸出 工作路徑 構(gòu)建觸發(fā)器,定時觸發(fā) 安裝插件 gitlab和 Cloudbee docker 配置gitlab 在網(wǎng)絡(luò)設(shè)

    2024年02月09日
    瀏覽(25)
  • DevOps搭建(十九)-Jenkins+K8s自動化CI搭建詳細(xì)步驟

    DevOps搭建(十九)-Jenkins+K8s自動化CI搭建詳細(xì)步驟

    完整的pipeline-auto.yml腳本如下 完整的Jenkinsfile腳本如下 在Jenkins插件管理中搜索GitLab插件進(jìn)行安裝。 進(jìn)入Jenkins項(xiàng)目配置里的 構(gòu)建觸發(fā)器 ,勾選如下選項(xiàng): 從系統(tǒng)管理-系統(tǒng)配置-Gitlab將驗(yàn)證去掉,生產(chǎn)最好配置保證安全。 如果是GitLab和Jenkins在同一臺服務(wù)器,需要開啟允許請求

    2024年01月23日
    瀏覽(33)
  • 使用 Jenkins、Gitlab、Harbor、Helm、k8s 來實(shí)現(xiàn)流水線作業(yè)

    使用 Jenkins、Gitlab、Harbor、Helm、k8s 來實(shí)現(xiàn)流水線作業(yè)

    使用 Jenkins、Gitlab、Harbor、Helm、Kubernetes 來實(shí)現(xiàn)一個完整的持續(xù)集成和持續(xù)部署的流水線作業(yè) 開發(fā)人員提交代碼到 Gitlab 代碼倉庫 通過 Gitlab 配置的 Jenkins Webhook 觸發(fā) Pipeline 自動構(gòu)建 Jenkins 觸發(fā)構(gòu)建構(gòu)建任務(wù),根據(jù) Pipeline 腳本定義分步驟構(gòu)建 先進(jìn)行代碼靜態(tài)分析,單元測試

    2024年04月27日
    瀏覽(29)
  • devops完整搭建教程(gitlab、jenkins、harbor、docker)

    devops完整搭建教程(gitlab、jenkins、harbor、docker)

    DevOps(Development Operations)是一種軟件開發(fā)方法論和工作流程,旨在促進(jìn)軟件開發(fā)團(tuán)隊(duì)和運(yùn)維團(tuán)隊(duì)之間的協(xié)作與溝通,以實(shí)現(xiàn)更高效的軟件交付和運(yùn)營。 持續(xù)集成(Continuous Integration,CI):開發(fā)團(tuán)隊(duì)將代碼頻繁地集成到共享存儲庫中,確保代碼的一致性和穩(wěn)定性。 持續(xù)交付(

    2024年02月19日
    瀏覽(38)
  • GitLab+Jenkins搭建DevOps一體化運(yùn)維平臺

    GitLab+Jenkins搭建DevOps一體化運(yùn)維平臺

    ? 大家拿到代碼后,要如何運(yùn)行呢?導(dǎo)入IDEA,然后啟動?開發(fā)過程可定沒有問題,那生產(chǎn)環(huán)境呢?在現(xiàn)在互聯(lián)網(wǎng)大環(huán)境下,越來越要求開發(fā)運(yùn)維一體化。如果對于企業(yè)級的項(xiàng)目管理方式不了解,那么開發(fā)工作將舉步維艱。這一節(jié)課主要帶大家快速理解一下電商項(xiàng)目的運(yùn)維部

    2024年02月09日
    瀏覽(49)
  • 快速構(gòu)建一個 GitLab + Jenkins + Harbor 的云原生 DevOps 環(huán)境

    快速構(gòu)建一個 GitLab + Jenkins + Harbor 的云原生 DevOps 環(huán)境

    今天我們要搭建一條怎樣的工具鏈呢?且看效果圖: GitLab + Jenkins + Harbor Toolchain Workflow 首先我們需要完成 GitLab、Jenkins 和 Harbor 三個工具的部署; 接著我們需要在 GitLab 上創(chuàng)建一個代碼庫,并且在 Jenkins 上創(chuàng)建相應(yīng)的流水線,這個流程最好也自動化(確實(shí)可以自動化); 然后

    2024年02月15日
    瀏覽(27)
  • DevOps系列文章-Kubernetes實(shí)現(xiàn)CI與CD配置

    DevOps系列文章-Kubernetes實(shí)現(xiàn)CI與CD配置

    基于 Kubernetes 實(shí)現(xiàn) CI/CD 配置,其實(shí)和往常那些 CI/CD 配置并沒有太大區(qū)別。都是通過 提交代碼,拉取代碼,構(gòu)建代碼,發(fā)布代碼來實(shí)現(xiàn)的。 只不過要是通過 K8s 來實(shí)現(xiàn)的話,則是需要將構(gòu)建好的代碼打包成鏡像,通過鏡像的方式來運(yùn)行。 CI/CD 流程圖: 開發(fā)將代碼提交代碼倉

    2024年02月05日
    瀏覽(22)
  • DevOps系列文章 之 SnakeYAML解析與序列化YAML

    DevOps系列文章 之 SnakeYAML解析與序列化YAML

    如何使用SnakeYAML庫將 YAML文檔轉(zhuǎn)換為Java對象,以及JAVA對象如何序列化為YAML文檔 。 在DevOps平臺系統(tǒng)中是基礎(chǔ)的能力支持,不管是spring boot 的配置還是K8S 資源清單yaml 要在項(xiàng)目中使用SnakeYAML,需要添加Maven依賴項(xiàng)(可在此處找到最新版本) 該 YAML 類是API的入口點(diǎn): 由于實(shí)現(xiàn)不

    2024年02月13日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包