Jenkins与Kubernetes深度整合实践

发布于:2025-06-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

采用的非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

######Jenkinsfile


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)])
            }
        }
    }

    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.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-demo
  namespace: default
spec:
  selector:
    matchLabels:
      app: springboot-demo
  template:
    metadata:
      labels:
        app: springboot-demo
    spec:
      containers:
      - image: IMAGE_NAME
        imagePullPolicy: IfNotPresent
        name: springboot-demo
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: springboot-demo
  namespace: default
spec:
  selector:
    app: springboot-demo
  type: NodePort
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    name: 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}"]
            )
        }
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到