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

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

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

一、說在前面的話

本文是CI篇的上文,因為上一篇已經(jīng)作了總體設計,就不再贅述,有需要的請看前文。
我們將演示,使用CI工具–jenkins,怎么和CD工具–argocd串聯(lián),重點是在Jenkins該怎么做。準備工作和argocd等相關(guān)事項,在前文已鋪墊ok。

Jenkins,我們是使用k8s來部署的一個master-slave結(jié)構(gòu)的集群。
在開發(fā)環(huán)境,Jenkins和argocd都是部署在同一個k8s集群。

接下來,我們的java應用服務,也都將部署在該K8S里。

二、關(guān)鍵技術(shù)

  • jenkinsfile
  • global pipeline library

依賴的jenkins插件:

  • Workspace Cleanup

三、流水線步驟

Devops系列五(CI篇之pipeline libraray)jenkins將gitlab helm yaml和argocd 串聯(lián),自動部署到K8S,ci/cd,jenkins
流水線的各個步驟是有jenkinsfile來拼裝,每個流水,特別是構(gòu)建Docker鏡像、修改helm yaml、發(fā)送IM消息,都需要封裝到pipeline library里。

在詳細描述每個步驟前,我們需要預定服務發(fā)版的依據(jù),程序版本號,最好是每次打包都升級。但是,在開發(fā)環(huán)境,有時候我們會偷懶,所以就采用版本號+時間戳的方式。允許同一個版本號,提交多次代碼,均觸發(fā)部署。

四、詳細實現(xiàn)

4.1、配置pipeline libraray

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

本次k8s容器化部署,增加了一個java-k8s.jenkinsfile文件,讓程序的部署可以同時支持兩種部署方式。

下面詳細說一說這幾個pipeline libraray.

4.1.1、tools.groovy – 讀取java程序的版本號

讀取程序的版本號,讀取mvn package后的target目錄下的classes/git.properties文件里的版本號git.build.version。

// 讀取java應用的版本號
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()
}

那么git.properties是依賴哪個mvn插件呢?

     <plugin>
		<groupId>pl.project13.maven</groupId>
		<artifactId>git-commit-id-plugin</artifactId>
		<version>4.0.0</version>
		<executions>
			<execution>
				<goals>
					<goal>revision</goal>
				</goals>
			</execution>
		</executions>
		<configuration>
			<verbose>true</verbose>
			<dateFormat>yyyy-MM-dd'T'HH:mm:ssZ</dateFormat>
			<generateGitPropertiesFile>true</generateGitPropertiesFile>
			<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
			<includeOnlyProperties>
				<includeOnlyProperty>^git.build.(time|version)$</includeOnlyProperty>
				<includeOnlyProperty>^git.commit.id.(abbrev|full)$</includeOnlyProperty>
			</includeOnlyProperties>
			<commitIdGenerationMode>full</commitIdGenerationMode>
			<failOnNoGitDirectory>false</failOnNoGitDirectory>
		</configuration>
	</plugin>

考慮到java工程可以是多模塊的,那就不是簡單的target,而應該是${moduleName}/target了。

在mvn package后,見下圖:
Devops系列五(CI篇之pipeline libraray)jenkins將gitlab helm yaml和argocd 串聯(lián),自動部署到K8S,ci/cd,jenkins
git.properties內(nèi)容詳情參考:

#Generated by Git-Commit-Id-Plugin
#Wed May 17 11:20:13 CST 2023
git.build.time=2023-05-17T11\:20\:13+0800
git.build.version=1.0.7
git.commit.id.abbrev=3dab776
git.commit.id.full=3dab7764afac0e8222a2bef3d78dc8b3175f8caa

4.1.2、docker.groovy – 構(gòu)建鏡像并推送

封裝docker的幾個命令,考慮到變量比較多,如果你不是很明白,對比著示例來看,具體見前文。


package com.xxtech.devops

// 保證jenkins slave節(jié)點上安裝了docker
// 第一個參數(shù)是服務名稱,第二個參數(shù)是端口號,第四個是xxx.jar所在的目錄,都是在docker build的時候需要
// 第三個參數(shù)是docker image的版本號(一般是程序的版本號),第五個參數(shù)是dockerfile所在的位置
// 
def buildAndPushImage(appName, port, version, packagePath, dockerfileName, repoDomain = "192.168.5.6:8086") {
    def repoProject = "xxx"

    // 1、構(gòu)建
    sh """
        docker build --build-arg APPNAME="${appName}" --build-arg PORT="${port}" --build-arg PACKAGE_PATH="${packagePath}" -f ${dockerfileName} -t ${repoProject}/${appName}:${version} .
       """

    // 2、登錄、打標簽、推送
    // 這里需要配置jenkins憑證,用戶名和密碼方式。具體配置,在jenkins系列文章另說。
    // 只有這樣,在jenkins job控制臺,才不會輸出了密碼字段的內(nèi)容。
    withCredentials([usernamePassword(passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME', credentialsId: "e4681123-7da2-4bd5-9bc2-7dd68375c406",)]) {
        sh """
            docker login ${repoDomain} -u ${DOCKER_USERNAME} -p ${DOCKER_PASSWORD}

            docker tag ${repoProject}/${appName}:${version} ${repoDomain}/${repoProject}/${appName}:${version}

            docker push ${repoDomain}/${repoProject}/${appName}:${version}
           """
    }

    // 3、刪除本地鏡像
    sh """
        docker rmi -f ${repoProject}/${appName}:${version}
        docker rmi -f ${repoDomain}/${repoProject}/${appName}:${version}
       """
}

4.1.3、helm.groovy – 觸發(fā)helm部署

有兩種方式,

  • 一種是調(diào)用helm命令,helm install至k8s。-- 不是很建議,缺乏界面,而且各應用的配置不相同,維護成本高。
  • 另外一種是修改git代碼并提交,利用gitops思想,去觸發(fā)argocd部署。-- 本文是采用這種方式,也是本系列的設計思路。(讓CI的歸jenkins,讓CD的歸argocd,jenkins這里只是一個觸發(fā)動作,當然你是手動的話,你也可以略過本步驟。但是多少有點不完美)
package com.xxtech.devops
// helm yaml所在的git工程是  http://192.168.8.28:9980/root/argocd-helm-yaml.git
// 第一個參數(shù)是git代碼下的一個目錄,第二個參數(shù)的image的tag值
def updateYaml(appName, imageTag, repoUrl = "192.168.8.28:9980/root/argocd-helm-yaml.git") {
    // jenkins憑證
    def gitlabCredentialsId = "12116269-430c-4921-b63b-18a490f7531c"

    // 拉取git代碼
    checkout([$class           : 'GitSCM',
              branches         : [[name: '*/master']],
              extensions       : [],
              userRemoteConfigs: [[
                                          credentialsId: "${gitlabCredentialsId}",
                                          url          : "http://${repoUrl}"
                                  ]]]
    )

    // 修改values.yaml中的image.tag
    withCredentials([usernamePassword(credentialsId: "${gitlabCredentialsId}", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
        sh """
            // 替換image.tag的值,必須和上一次的不一樣,否則后面的git提交會報錯
            sed -i 's/tag:.*/tag: ${imageTag}/g' ${appName}/values.yaml
            git add ${appName}/values.yaml
            
            // 在git commit前,進行全局配置
            git config --global user.name "admin"
            git config --global user.email "admin@example.com"
            
            git commit -m "modify image tag to ${imageTag}"
            // git push的時候不會讓你再次輸入用戶名和密碼
            git push http://$GIT_USERNAME:$GIT_PASSWORD@${repoUrl} HEAD:master
           """
    }
}

4.1.4、http.groovy – 發(fā)送Im消息

我們需要把jenkins job的結(jié)果告知工程的相關(guān)人員。這就屬于im的范疇了,實現(xiàn)就是調(diào)用一個http請求,能發(fā)送http請求即可,具體處理是交由消息接收服務去發(fā)送。

有人要問,為什么不直接在jenkinsfile里發(fā),還要多引入一個服務呢?

這里,主要的原因是,我們的需求不是簡單的通過rebot機器人,把發(fā)送消息至企業(yè)微信群里。
而是會給應用打標簽,根據(jù)所屬標簽,而企業(yè)微信會維護標簽下有哪些人。

package com.xxtech.devops

def request(reqType, reqUrl, reqBody, reqFile = '', contentType = "APPLICATION_JSON_UTF8") {
    def response = httpRequest httpMode: reqType,
            contentType: contentType,
            consoleLogResponseBody: true,
            ignoreSslErrors: true,
            uploadFile: reqFile,
            requestBody: reqBody,
            url: "${reqUrl}",
            timeout: 600
    //quiet: true

    return response
}


def imNotify(projectName, result, buildEnv, message, branch, buildBy, robotKey = '') {
    def reqBody = """   {"projectName": "${projectName}",
                    "buildResult": "${result}", 
                    "branch": "${branch}", 
                    "buildBy": "${buildBy}", 
                    "env": "${buildEnv}", 
                    "reason": "${message}", 
                    "robotKey": "${robotKey}",
                    "buildUrl": "${env.BUILD_URL}" } """

    def url = "http://192.168.10.47/devops/api/jenkins/notify"

    request("POST", url, reqBody)
}

4.2、docker in docker 容器的配置

docker image的構(gòu)建和推送,要求你有docker環(huán)境,而不幸的是,我們無論是jnlp還是已安裝的容器都不具備。
所以,我額外引入了一個容器docker:dind
這里,著重說明下我在使用過程中,遇到的幾個問題。

4.2.1、未分配偽終端

報錯信息是Container docker was terminated (Exit Code: 0, Reason: Completed),導致Jenkins job直接沒跑起來。

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

4.2.2、未配置volumes

// dind運行,必須配置volumes如下。
volumes: [
    hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock')
 ]

4.2.3、dind運行不起來

dind沒有/bin/bash, 且必須增加參數(shù)–privileged

docker run -d --privileged docker:dind

docker exec -it {容器ID} sh

而jenkins containerTemplate中的容器,默認值: --privileged: true,要不然就用不了docker:dind

五、未完待續(xù)

我們把CI篇分為兩篇,本文是先介紹了pipeline library,是Jenkinsfile的一個基礎。
下一篇,我們將詳細說明java-k8s.jenkinsfile要怎么寫。文章來源地址http://www.zghlxwxcb.cn/news/detail-549126.html

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

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

領支付寶紅包贊助服務器費用

相關(guān)文章

  • 【基于 GitLab 的 CI/CD 實踐】03、GitLab Pipeline 實踐(上)

    【基于 GitLab 的 CI/CD 實踐】03、GitLab Pipeline 實踐(上)

    目錄 一、GitLab Pipeline 流水線語法有哪些?流水線參數(shù)列表 如何檢查語法錯誤?流水線語法檢測 二、Pipeline 基礎語法 job script before_script after_script stages 未定義 stages ?定義 stages 控制 stage 運行順序 ? .pre .post stage variables 綜合實例(一) tags allow_failure when manual 手動 delayed 延遲

    2024年02月17日
    瀏覽(31)
  • DevOps-Jenkins-CI持續(xù)集成操作

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

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

    2024年03月13日
    瀏覽(29)
  • 使用Gitlab管理Jenkins Pipeline流水線

    使用Gitlab管理Jenkins Pipeline流水線

    1、首先需要將已經(jīng)調(diào)試好的Jenkins pipeline文件上傳到git庫中,推薦以 Jenkinsfile 命名 放至git庫根目錄 上傳完成后 在git庫中可以查看到 如下圖所示: 2、配置Jenkins任務 完成后pipeline腳本會存放在git庫上面進行管理編輯了,當我們構(gòu)建此任務時會從git庫中獲取pipeline流水線進行執(zhí)

    2024年02月12日
    瀏覽(24)
  • (十四)devops持續(xù)集成開發(fā)——jenkins流水線使用pipeline方式發(fā)布項目

    (十四)devops持續(xù)集成開發(fā)——jenkins流水線使用pipeline方式發(fā)布項目

    本節(jié)內(nèi)容我們使用另外一種方式pipeline實現(xiàn)項目的流水線部署發(fā)布,Jenkins Pipeline是一種允許以代碼方式定義持續(xù)集成和持續(xù)交付流水線的工具。通過Jenkins Pipeline,可以將整個項目的構(gòu)建、測試和部署過程以腳本的形式寫入Jenkinsfile中,實現(xiàn)對整個流程的可視化管理和控制。在

    2024年02月21日
    瀏覽(37)
  • docker部署Jenkins(Jenkins+Gitlab+Maven實現(xiàn)CI/CD)

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

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

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

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

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

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

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

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

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

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

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

    2024年04月27日
    瀏覽(29)
  • 【軟件測試】- 將 Selenium 和 JMeter 測試腳本集成到 Jenkins 中實現(xiàn)自動化測試和持續(xù)集成(CI)及Jenkinsfile 實現(xiàn) Jenkins Pipeline 原理介紹

    將 Selenium 和 JMeter 測試腳本集成到 Jenkins 中是實現(xiàn)自動化測試和持續(xù)集成(CI)的關(guān)鍵步驟。以下是詳細的集成過程: 1、準備工作 安裝 Jenkins : 確保您已經(jīng)在服務器上安裝了 Jenkins。 可以從 Jenkins 官網(wǎng) 下載并安裝。 安裝必要的插件 : 在 Jenkins 中安裝所需的插件,如 Git 插

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

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

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

    2024年02月19日
    瀏覽(38)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包