Jenkins 構(gòu)建企業(yè)級(jí) DevOps 容器云平臺(tái)2

#配置?jenkins?連接到我們存在的?k8s?集群

(1)訪問http://192.168.172.163:30002/configureClouds/新增一個(gè)云,在下拉菜單中選擇?kubernets?并添加

(2)填寫云?kubernetes?配置內(nèi)容

kubernetes https://192.168.172.163:6443

如果是vip寫vip地址

?(3)測(cè)試?jenkins?和?k8s?是否可以通信

點(diǎn)擊連接測(cè)試,如果顯示?Connection test successful?或者顯示Connected to Kubernetes 1.20?說明測(cè)試成功,Jenkins?可以和?k8s?進(jìn)行通信

kubectl get svc -n jenkins-k8s

NAME? ? ? ? ? ? ? TYPE? ? ? CLUSTER-IP? ? ? EXTERNAL-IP? PORT(S)? ? ? ? ? ? ? ? ? ? ? ? ? AGE

jenkins-service? NodePort? 10.109.88.145? <none>? ? ? ? 8080:30002/TCP,50000:30814/TCP? 108m

jenkins地址對(duì)應(yīng)name

配置?k8s?集群的時(shí)候?jenkins?地址需要寫上面域名的形式,配置之后執(zhí)行如下:?http://jenkins-service.jenkins-k8s.svc.cluster.local:8080?應(yīng)用------>保存

#配置?pod-template

(1)配置?pod template

訪問?http://192.168.172.163:30002/configureClouds/

添加?Pod?模板------>Kubernetes Pod Template--->按如下配置

(2)在上面的?pod template?下添加容器 添加容器------>Container Template------>按如下配置------>

Docker?鏡像:使用?jenkins-jnlp.tar.gz?解壓出來的鏡像,把這個(gè)鏡像上傳到?k8s?的各?node?節(jié) 點(diǎn),手動(dòng)解壓:docker load -i jenkins-jnlp.tar.gz

解壓出來的鏡像是 god/jenkins-jnlp:v1

在每一個(gè)?pod template?右下腳都有一個(gè)?Advanced,點(diǎn)擊?Advanced,出現(xiàn)如下

在?Service Account?處輸入?jenkins-k8s-sa,這個(gè)?sa?就是我們最開始安裝?jenkins?時(shí)的?sa?(3)給上面的?pod template?添加卷

添加卷------>選擇?Host Path Volume

/var/run/docker.sock /var/run/docker.sock

/root/.kube /home/jenkins/.kube?上面配置好之后,應(yīng)用------>保存

#添加?dockerhub?憑據(jù)

首頁------>系統(tǒng)管理----→管理憑據(jù)--→全局--→添加憑據(jù)

添加自己的dockerhub用戶

username:cadrcadr password:**** ID:dockerhub?描述:這個(gè)地方隨便寫 上面修改好之后選擇確定即可

#測(cè)試通過?Jenkins?發(fā)布代碼到?k8s?開發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境 在?k8s?的控制節(jié)點(diǎn)創(chuàng)建名稱空間:

63 ~]# kubectl create ns devlopment namespace

63 ~]# kubectl create ns production namespace

63 ~]# kubectl create ns qatest namespace

回到?jenkins?首頁:

pod模版 標(biāo)簽列表對(duì)應(yīng)pipeline

新建一個(gè)任務(wù)

------>輸入一個(gè)任務(wù)名稱處輸入?jenkins-variable-test-deploy------>流水線----- ->確定------>在?Pipeline script?處輸入如下內(nèi)容

node('testhan') {

? ? stage('Clone') {

? ? ? ? echo "1.Clone Stage"

? ? ? ? git url: "https://github.com/cadrcadr/jenkins-sample.git"

? ? ? ? script {

? ? ? ? ? ? build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()

? ? ? ? }

? ? }

? ? stage('Test') {

? ? ? echo "2.Test Stage"

? ? }

? ? stage('Build') {

? ? ? ? echo "3.Build Docker Image Stage"

? ? ? ? sh "docker build -t cadrcadr/jenkins-demo:${build_tag} ."

? ? }

? ? stage('Push') {

? ? ? ? echo "4.Push Docker Image Stage"

? ? ? ? withCredentials([usernamePassword(credentialsId: 'dockerhub', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {

? ? ? ? ? ? sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"

? ? ? ? ? ? sh "docker push cadrcadr/jenkins-demo:${build_tag}"

? ? ? ? }

? ? }

? ? stage('Deploy to dev') {

? ? ? ? echo "5. Deploy DEV"

sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev-god.yaml"

? ? ? sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev-god.yaml"

//? ? ? ? sh "bash running-devlopment.sh"

? ? ? ? sh "kubectl apply -f k8s-dev-god.yaml? --validate=false"

}

stage('Promote to qa') {

def userInput = input(

? ? ? ? ? ? id: 'userInput',

? ? ? ? ? ? message: 'Promote to qa?',

? ? ? ? ? ? parameters: [

? ? ? ? ? ? ? ? [

? ? ? ? ? ? ? ? ? ? $class: 'ChoiceParameterDefinition',

? ? ? ? ? ? ? ? ? ? choices: "YES\nNO",

? ? ? ? ? ? ? ? ? ? name: 'Env'

? ? ? ? ? ? ? ? ]

? ? ? ? ? ? ]

? ? ? ? )

? ? ? ? echo "This is a deploy step to ${userInput}"

? ? ? ? if (userInput == "YES") {

? ? ? ? ? ? sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa-god.yaml"

sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa-god.yaml"

//? ? ? ? ? ? sh "bash running-qa.sh"

? ? ? ? ? ? sh "kubectl apply -f k8s-qa-god.yaml --validate=false"

? ? ? ? ? ? sh "sleep 6"

? ? ? ? ? ? sh "kubectl get pods -n qatest"

? ? ? ? } else {

? ? ? ? ? ? //exit

? ? ? ? }

? ? }

stage('Promote to pro') {

def userInput = input(

? ? ? ? ? ? id: 'userInput',

? ? ? ? ? ? message: 'Promote to pro?',

? ? ? ? ? ? parameters: [

? ? ? ? ? ? ? ? [

? ? ? ? ? ? ? ? ? ? $class: 'ChoiceParameterDefinition',

? ? ? ? ? ? ? ? ? ? choices: "YES\nNO",

? ? ? ? ? ? ? ? ? ? name: 'Env'

? ? ? ? ? ? ? ? ]

? ? ? ? ? ? ]

? ? ? ? )

? ? ? ? echo "This is a deploy step to ${userInput}"

? ? ? ? if (userInput == "YES") {

? ? ? ? ? ? sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod-god.yaml"

? ? ? ? ? ? sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod-god.yaml"

//? ? ? ? ? ? sh "bash running-production.sh"

? ? ? ? ? ? sh "cat k8s-prod-god.yaml"

? ? ? ? ? ? sh "kubectl apply -f k8s-prod-god.yaml --record --validate=false"

? ? ? ? }

? ? }

}

god?變成自己的?dockerhub?用戶名?k8s-prod-god.yaml

應(yīng)用------>保存------>立即構(gòu)建 在左側(cè)可以看到構(gòu)建任務(wù),如下所示:

點(diǎn)擊?Console Output,可以看到?pipeline?定義的步驟的詳細(xì)信息

點(diǎn)擊?Input request,部署應(yīng)用到預(yù)生產(chǎn)環(huán)境

點(diǎn)擊?Input request,部署應(yīng)用到生產(chǎn)環(huán)境

看到?Finished:SUCCESS,,說明?pipeline?構(gòu)建任務(wù)完成

報(bào)錯(cuò)?1

解決方法:請(qǐng)修改 Pipeline script 處標(biāo)簽更改為自己的 dockerhub 的 username。

6、驗(yàn)證開發(fā)、預(yù)生產(chǎn)、生產(chǎn)環(huán)境部署的應(yīng)用是否正常運(yùn)行

]# kubectl get pods -n devlopment

NAME READY STATUS RESTARTS AGE

jenkins-demo-784885d9c9-b4jkg 1/1 Running 0

]#kubectl get pods -n qatest

NAME READY STATUS RESTARTS AGE jenkins-demo-784885d9c9-59tsm 1/1 Running 0 5m19s

]#kubectl get pods -n production

NAME READY STATUS jenkins-demo-784885d9c9-42hz4 1/1 running

Jenkins?管理插件?BlueOcean?配置和使用

# BlueOcean?是什么?

為了適應(yīng) Jenkins Pipeline?和?Freestyle jobs?任務(wù),Jenkins?推出了?BlueOcean UI,其目的就 是讓程序員執(zhí)行任務(wù)時(shí),降低工作流程的復(fù)雜度和提升工作流程的清晰度,它具有如下特征:?1、清晰的可視化:對(duì)?CI/CD pipelines,?可以快速直觀的觀察項(xiàng)目?pipeline?狀態(tài)。

2、pipeline?可編輯:引導(dǎo)用戶通過直觀的、可視化的過程來創(chuàng)建?Pipeline,從而使?Pipeline?的創(chuàng) 建變得平易近人。

3、pipeline?精確度:通過?UI?直接介入?pipeline?的中間問題。

#安裝?BlueOcean?插件 主頁—>系統(tǒng)管理→插件管理→可選插件—>過濾?BlueOcean→直接安裝

安裝完成后,重啟?jenkins

http://192.168.172.163:30002/restart

重啟進(jìn)入?jenkins?之后,在主頁左側(cè)可以看到打開?Blue Ocean

Jenkins?實(shí)現(xiàn)?k8s?應(yīng)用按照指定版本回滾

回到首頁:

新建一個(gè)任務(wù)------>輸入一個(gè)任務(wù)名稱處輸入?jenkins-variable-test-deploy-rollout------>流水 線------>確定------>在?Pipeline script?處輸入如下內(nèi)容

node('testhan') {

? stage('git clone') {

? ? git url: "https://github.com/luckylucky421/jenkins-rollout"

? ? sh "ls -al"

? ? sh "pwd"

}

stage('select env') {

? def envInput = input(

? ? id: 'envInput',

? ? message: 'Choose a deploy environment',

? ? parameters: [

? ? ? [

? ? ? ? $class: 'ChoiceParameterDefinition',

? ? ? ? choices: "devlopment\nqatest\nproduction",

? ? ? ? name: 'Env'

? ? ? ]

? ? ]

)

echo "This is a deploy step to ${envInput}"

sh "sed -i 's/<namespace>/${envInput}/' getVersion.sh"

sh "sed -i 's/<namespace>/${envInput}/' rollout.sh"

sh "bash getVersion.sh"

// env.WORKSPACE = pwd()

// def version = readFile "${env.WORKSPACE}/version.csv"

// println version

}

stage('select version') {

? env.WORKSPACE = pwd()

def version = readFile "${env.WORKSPACE}/version.csv"

println version

? def userInput = input(id: 'userInput',

? ? message: '選擇回滾版本',

? ? parameters: [

? ? ? [

? ? ? ? $class: 'ChoiceParameterDefinition',

? ? ? ? choices: "$version\n",

? ? ? ? name: 'Version'

? ? ? ]

? ? ? ? ]

)

? ? sh "sed -i 's/<version>/${userInput}/' rollout.sh"

}

stage('rollout deploy') {

? ? sh "bash rollout.sh"

}

}

點(diǎn)擊應(yīng)用->保存-立即構(gòu)建

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容