采用的非jenkins-slave方式
jenkins配置:
Jenkins添加k8s master節點的服務器信息
在Jenkins容器內部與k8s master節點設置免費登錄
# docker過濾查詢出運行的Jenkins服務
$ docker ps | grep jenkins# 進入Jenkins容器內部
$ docker exec -it jenkins-server /bin/bash# 在 /root/.ssh 目錄下生成了 id_rsa和id_rsa.pub,三次回車
$ ssh-keygen -t rsa# 進入生成秘鑰的目錄
$cd /root/.ssh/# 查看秘鑰文件
$ ls###免密
ssh-copy-id -i /root/.ssh/id_rsa.pub ssh root@192.168.95.101
在Springboot工程準備k8s yml部署文件和修改Jenkinsfile
######Jenkinsfilepipeline {// 指定任務再哪個集群節點中執行agent any// 聲明全局變量,方便后面使用environment {// harbor用戶名harborUserName = 'DevOps'// harbor密碼harborPassword = 'Dev12345'// harbor地址harborAddress = '192.168.95.131:9020'// harbor項目名harborRepo = 'repos'}stages {stage ('拉取git倉庫代碼') {steps {checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'b62b7b20-3b03-46e7-8f8b-09ab5efe0f12', url: 'http://192.168.95.130:8929/root/jenkins-publish-demo.git']]])}}stage ('通過maven構建項目') {steps {sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'}}stage ('通過Sonarqube做質量檢測') {steps {sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.source=./ -Dsonar.java.binaries=./target/ -Dsonar.login=c8483abbf03c0fd4212ffce2c1e93c5ae8cd65bd'}}stage ('通過Docker制作自定義鏡像') {steps {sh '''cp -rf target/*.jar docker/docker build -t ${JOB_NAME}:$tag docker/'''}}stage ('將自定義鏡像推送到Harbor') {steps {sh '''docker login -u ${harborUserName} -p ${harborPassword} ${harborAddress}docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''}}stage ('將yml文件傳到k8s-master上') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.95.101-k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'jenkins-publish-demo.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}}post {// 構建成功通知success {dingtalk (robot: 'Dingding-robot',type: 'MARKDOWN',title: "success: ${JOB_NAME}",text: ["- 構建成功: ${JOB_NAME}項目!\n- 版本: ${tag}\n" +"- 持續時間: ${currentBuild.durationString}\n- 任務:#${JOB_NAME}"])}// 構建失敗通知failure {dingtalk (robot: 'Dingding-robot',type: 'MARKDOWN',title: "fail: ${JOB_NAME}",text: ["- 構建失敗: ${JOB_NAME}項目!\n- 版本: ${tag}\n" +"- 持續時間: ${currentBuild.durationString}\n- 任務:#${JOB_NAME}"])}}
}
#####k8s.ymlapiVersion: apps/v1
kind: Deployment
metadata:name: springboot-demonamespace: default
spec:selector:matchLabels:app: springboot-demotemplate:metadata:labels:app: springboot-demospec:containers:- image: IMAGE_NAMEimagePullPolicy: IfNotPresentname: springboot-demoports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: springboot-demonamespace: default
spec:selector:app: springboot-demotype: NodePortports:- protocol: TCPport: 8080targetPort: 8080name: myapp-http
Jenkinsfile增加遠程執行k8s master服務器執行流水線腳本步驟
// 所有的腳本命令都放在pipeline中
pipeline {// 指定任務再哪個集群節點中執行agent any// 聲明全局變量,方便后面使用environment {// harbor用戶名harborUserName = 'DevOps'// harbor密碼harborPassword = 'Dev12345'// harbor地址harborAddress = '192.168.95.131:9020'// harbor項目名harborRepo = 'repos'}stages {stage ('拉取git倉庫代碼') {steps {checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[credentialsId: 'b62b7b20-3b03-46e7-8f8b-09ab5efe0f12', url: 'http://192.168.95.130:8929/root/jenkins-publish-demo.git']]])}}stage ('通過maven構建項目') {steps {sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'}}stage ('通過Sonarqube做質量檢測') {steps {sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.source=./ -Dsonar.java.binaries=./target/ -Dsonar.login=c8483abbf03c0fd4212ffce2c1e93c5ae8cd65bd'}}stage ('通過Docker制作自定義鏡像') {steps {sh '''cp -rf target/*.jar docker/docker build -t ${JOB_NAME}:$tag docker/'''}}stage ('將自定義鏡像推送到Harbor') {steps {sh '''docker login -u ${harborUserName} -p ${harborPassword} ${harborAddress}docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''}}stage ('將yml文件傳到k8s-master上') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.95.101-k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'jenkins-publish-demo.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}stage ('遠程執行k8s-master的kubectl命令') {steps {sh 'ssh root@192.168.95.101 kubectl apply -f /usr/local/deploy/k8s/jenkins-publish-demo.yml'}}}post {// 構建成功通知success {dingtalk (robot: 'Dingding-robot',type: 'MARKDOWN',title: "success: ${JOB_NAME}",text: ["- 構建成功: ${JOB_NAME}項目!\n- 版本: ${tag}\n" +"- 持續時間: ${currentBuild.durationString}\n- 任務:#${JOB_NAME}"])}// 構建失敗通知failure {dingtalk (robot: 'Dingding-robot',type: 'MARKDOWN',title: "fail: ${JOB_NAME}",text: ["- 構建失敗: ${JOB_NAME}項目!\n- 版本: ${tag}\n" +"- 持續時間: ${currentBuild.durationString}\n- 任務:#${JOB_NAME}"])}}
}