#配置?jenkins?連接到我們存在的?k8s?集群
(1)訪問http://192.168.172.163:30002/configureClouds/新增一個云,在下拉菜單中選擇?kubernets?并添加
(2)填寫云?kubernetes?配置內容
kubernetes https://192.168.172.163:6443
如果是vip寫vip地址
?(3)測試?jenkins?和?k8s?是否可以通信
點擊連接測試,如果顯示?Connection test successful?或者顯示Connected to Kubernetes 1.20?說明測試成功,Jenkins?可以和?k8s?進行通信
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地址對應name
配置?k8s?集群的時候?jenkins?地址需要寫上面域名的形式,配置之后執行如下:?http://jenkins-service.jenkins-k8s.svc.cluster.local:8080?應用------>保存
#配置?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?解壓出來的鏡像,把這個鏡像上傳到?k8s?的各?node?節 點,手動解壓:docker load -i jenkins-jnlp.tar.gz
解壓出來的鏡像是 god/jenkins-jnlp:v1
在每一個?pod template?右下腳都有一個?Advanced,點擊?Advanced,出現如下
在?Service Account?處輸入?jenkins-k8s-sa,這個?sa?就是我們最開始安裝?jenkins?時的?sa?(3)給上面的?pod template?添加卷
添加卷------>選擇?Host Path Volume
/var/run/docker.sock /var/run/docker.sock
/root/.kube /home/jenkins/.kube?上面配置好之后,應用------>保存
#添加?dockerhub?憑據
首頁------>系統管理----→管理憑據--→全局--→添加憑據
添加自己的dockerhub用戶
username:cadrcadr password:**** ID:dockerhub?描述:這個地方隨便寫 上面修改好之后選擇確定即可
#測試通過?Jenkins?發布代碼到?k8s?開發環境、測試環境、生產環境 在?k8s?的控制節點創建名稱空間:
63 ~]# kubectl create ns devlopment namespace
63 ~]# kubectl create ns production namespace
63 ~]# kubectl create ns qatest namespace
回到?jenkins?首頁:
pod模版 標簽列表對應pipeline
新建一個任務
------>輸入一個任務名稱處輸入?jenkins-variable-test-deploy------>流水線----- ->確定------>在?Pipeline script?處輸入如下內容
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
應用------>保存------>立即構建 在左側可以看到構建任務,如下所示:
點擊?Console Output,可以看到?pipeline?定義的步驟的詳細信息
點擊?Input request,部署應用到預生產環境
點擊?Input request,部署應用到生產環境
看到?Finished:SUCCESS,,說明?pipeline?構建任務完成
報錯?1
解決方法:請修改 Pipeline script 處標簽更改為自己的 dockerhub 的 username。
6、驗證開發、預生產、生產環境部署的應用是否正常運行
]# 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?是什么?
為了適應 Jenkins Pipeline?和?Freestyle jobs?任務,Jenkins?推出了?BlueOcean UI,其目的就 是讓程序員執行任務時,降低工作流程的復雜度和提升工作流程的清晰度,它具有如下特征:?1、清晰的可視化:對?CI/CD pipelines,?可以快速直觀的觀察項目?pipeline?狀態。
2、pipeline?可編輯:引導用戶通過直觀的、可視化的過程來創建?Pipeline,從而使?Pipeline?的創 建變得平易近人。
3、pipeline?精確度:通過?UI?直接介入?pipeline?的中間問題。
#安裝?BlueOcean?插件 主頁—>系統管理→插件管理→可選插件—>過濾?BlueOcean→直接安裝
安裝完成后,重啟?jenkins
http://192.168.172.163:30002/restart
重啟進入?jenkins?之后,在主頁左側可以看到打開?Blue Ocean
Jenkins?實現?k8s?應用按照指定版本回滾
回到首頁:
新建一個任務------>輸入一個任務名稱處輸入?jenkins-variable-test-deploy-rollout------>流水 線------>確定------>在?Pipeline script?處輸入如下內容
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"
}
}
點擊應用->保存-立即構建