您當前的位置:首頁 > 書法

K8S結合Jenkins實現持續整合的動態配置詳情分享

作者:由 雲計算福利 發表于 書法時間:2021-07-08

前言:

Kubernetes,簡稱K8s,相信大家都不會陌生。這是一個開源的,用於管理雲平臺中多個主機上的容器化的應用。

Jenkins,是一個開源軟體專案,是基於Java開發的一種持續整合工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體專案可以進行持續整合。

在程式設計師日常的開發當中,使用著各種不同的程式語言,流程中少不了開發、測試、打包、釋出等等的步驟,這其中的部分環節,是重複且必須的工作。所以慢慢地引入了持續整合的概念,從而減輕開發人員,運維人員的操作和時間成本,更好地服務好我們的程式猿(嗷嗷嗷 ~ 程式設計師太苦啦,是時候來點甜啦~)。

接下來讓我來給大家分享一下,如何結合K8S和Jenkins可以實現快速地實現以上的一些重複性且必要的工作,讓我們的攻城獅更好地專注在開發工作當中!

前置環境條件:

1、已經有部署好的K8S叢集環境;

2、已經在K8S環境中已經部署好Jenkins應用;

3、程式碼倉庫(如gitlab、GitHub等)已經透過webhook等方式,和Jenkins能進行通訊;

4、jenkins新增好程式碼倉庫對應的流水線作業。

1、登入到Jenkins UI進行模版配置

K8S結合Jenkins實現持續整合的動態配置詳情分享

登入到Jenkins – 左選單(系統設定) – 節點管理 – Configure Clouds,進行模版的配置

K8S結合Jenkins實現持續整合的動態配置詳情分享

1.1 編輯Kubernetes模版

K8S結合Jenkins實現持續整合的動態配置詳情分享

第一頁詳細配置如上圖,基本都是用預設值即可,有幾個地方需要根據實際的叢集資訊進行填寫就可以啦,挺簡單的!!

1.2 編輯pod模版

2-1和2-2是pod模版的名稱和模版標籤

K8S結合Jenkins實現持續整合的動態配置詳情分享

第二頁詳細配置如上圖,按照上圖說明即可。俗話說,工欲善其事,必先利其器,至此,jenkins的模版關鍵配置已經完成啦,接下來就是使用這些模版的時候啦,請繼續往下閱讀!!

2、可持續整合配置

2.1 Jenkinsfile使用詳解

這裡的lable是 上面的標籤設定的值

//模板需要修改的值:label(配置的jenkins的slave標籤),cloud:(配置的jenkins的cloud)

//定義變數

def label = “jenkins-slave-js”

//設定pod模版的資訊,label是模版標籤,cloud是第一步設定的jenkins模版名

//以下操作都是在打包容器裡面進行,內容可以高度自定義,貼合不同的需求

podTemplate(label: label , cloud: ‘kubernetes’) {

node(label) {

//拉取倉庫程式碼

def myRepo = checkout scm

def gitBranch = myRepo。GIT_BRANCH。replaceAll(“origin/”,“”)。replaceAll(“/”,“-”)。replaceAll(“\\。”,“-”)

def timestamp = sh(script: “echo `date ‘+%Y%m%d%H%M%S’`”, returnStdout: true)。trim()

def gitCommit = sh(script: “git rev-parse ——short HEAD”, returnStdout: true)。trim()

gitCommit = “${gitCommit}_${timestamp}”

//映象標籤,這裡使用git分支名作為映象的tag

def imageTag = “${gitBranch}”

//映象倉庫基礎地址

def dockerRegistryUrl = “http://xxxxx”

//應用服務名稱,統一用於以下各個變數名稱

def appName = “testAbc”

//模板需要更改的值 開始

//helm工具釋出時,使用的名稱,這裡使用【應用名-分支名】的格式

def helmReleaseName = “${appName}-${gitBranch}”

//部署應用服務的名稱空間

def namespace = “${appName}”

//映象的中間名稱,用於平均基礎映象地址

def imageEndpoint = “${appName}/webapi”

//模板需要更改的值 結束

//完整映象地址(不包含映象tag)

def image = “${dockerRegistryUrl}/${imageEndpoint}”

//helmChart模版的倉庫名稱

def chartName = “${appName}”

//helmChart的版本

def chartVersion = “1。0”

//helmChart完整名稱

def chartDirName = “${appName}/${appName}”

//K8S的網路模式,一般有Cluster(不對外訪問)、NodePort(釋放埠對外訪問)

def serviceType = “ClusterIP”

//如果serviceType值是NodePort,這裡可以設定指定供對外訪問的埠號,不指定則隨機,範圍詳見K8S的NodePort範圍,預設是30000-32767

def serviceNodePort = “”

//是否使用外部K8S儲存,是則設定true,否則設定false

def createPvc = true

//如果設定了使用外部儲存,則這裡需要填寫k8s的PVC資源的名稱,以便以釋出的應用服務能繫結此外部儲存

def pvcName = “${gitBranch}-${appName}-configs-pvc”

//設定外部儲存對應應用服務容器裡面的路徑

def pvcMountPath = “/var/www/${appName}/storage”

//定義不同階段,可以方便清晰地在jenkins UI上看到每個階段的耗時

stage(‘單元測試階段’) {

script{

}

}

stage(‘專案編譯階段’) {

//此處使用container指定第二步配置的容器名稱,就可以使用該容器環境的命令進行操作,如下面命令是前端node編譯程式碼

container(“node”){

sh “npm build 。/main”

sh “npm run serve”

}

}

stage(‘構建 Docker 映象階段’) {

container(‘構建 Docker 映象’) {

withCredentials([[$class: ‘UsernamePasswordMultiBinding’,

credentialsId: ‘docker-harbor’,

usernameVariable: ‘DOCKER_HUB_USER’,

passwordVariable: ‘DOCKER_HUB_PASSWORD’]]) {

//此處是引入了docker環境,進行docker的打包,推送到遠端倉庫等操作

container(‘docker’) {

sh “”“

docker login ${dockerRegistryUrl} -u ${DOCKER_HUB_USER} -p ${DOCKER_HUB_PASSWORD}

docker build -t ${imageEndpoint}:${imageTag} 。

docker tag ${imageEndpoint}:${imageTag} ${dockerRegistryUrl}/${imageEndpoint}:${imageTag}

docker push ${image}:${imageTag}

”“”

}

}

}

}

//K8S使用了helm釋出工具進行應用服務的釋出

stage(‘Helm 部署階段’) {

withCredentials([[$class: ‘UsernamePasswordMultiBinding’,

credentialsId: ‘docker-harbor’,

usernameVariable: ‘DOCKER_HUB_USER’,

passwordVariable: ‘DOCKER_HUB_PASSWORD’]]) {

container(‘helm’) {

// 這裡也可以做一些其他的分支判斷是否要直接部署

echo “[INFO] 開始 Helm 部署”

echo “1 初始化helm client”

sh “helm init ——client-only ——stable-repo-url https://mirror。azure。cn/kubernetes/charts/”

//新增打包容器裡面的本地helm倉庫

sh “helm repo add ——username ${DOCKER_HUB_USER} ——password ${DOCKER_HUB_PASSWORD} ${chartName} http://${dockerRegistryUrl}/chartrepo/${chartName}”

echo “2 如果更新了chart包則需要更新repo倉庫”

sh “helm repo update”

echo “3 更新 ${helmReleaseName} 應用服務”

sh “”“

helm upgrade ——install ${helmReleaseName} ${chartDirName} \

——version ${chartVersion} \

——set namespace=${namespace} \

——set gitCommit=${gitCommit} \

——set gitBranch=${gitBranch} \

——set productionDeployment。image。repository=${image} \

——set canaryDeployment。image。repository=${image} \

——set productionDeployment。image。tag=${imageTag} \

——set canaryDeployment。image。tag=master \

——set createPvc=${createPvc} \

——set pvcName=${pvcName} \

——set pvcMountPath=${pvcMountPath} \

——set service。type=${serviceType} \

——set service。nodePort=${serviceNodePort} \

——namespace=${namespace}

”“”

echo “[INFO] Helm 部署應用成功。。。”

}

}

}

}

}

至此,我們已經完成配置好jenkins模版和jenkinsfile完整的一套可持續整合系統的工作,我們後續開發時,只需要合併好程式碼,觸發webhook流水線,通知jenkins進行打包、釋出、部署的操作即可,實現真正解放我們的雙手啦!!!哈哈哈!!!

標簽: def  模版  set  jenkins  sh