#配置?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)建


