jenkins + k8s实现代码持续部署

Jenkins简介

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。

部署安装

安装部署步骤此文不再具体讲解,具体的安装步骤可参考官方文档安装部署,主要讲解slave节点在k8s中的实现过程
本文中演示所用为一台master节点,slave节点为基于配置的Kubernetes,按需要创建pod运行Agent

节点管理

添加k8s证书

在这里插入图片描述
类型使用X.509,下面填入相应的k8s对应证书,id可以不填写,会自动生成一个id,然后点击"create"提交表单

添加云节点

在这里插入图片描述
在这里插入图片描述

此处填写的凭据ID就是在上一步中添加的k8s证书后所生成的id,配置好后,点击"连接测试",查看是否能够正常获取k8s版本信息.

Pipeline script

公共部分

import java.util.List
import java.util.ArrayList
import java.net.URLEncoder
label_k8s = "slave-jenkins-${UUID.randomUUID().toString()}"
     
def kubectl(cmd,namespace="default") {
    return sh(script: "kubectl --namespace=${namespace} ${cmd}", returnStdout: true)
}
git_repo = "https://gitee.com/xxx/xxx.git"
def productionTemplate(label, body) {
  podTemplate(label: label, cloud: 'k8s-test',
        containers: [containerTemplate(name: 'jnlp', image: 'swr.cn-east-3.myhuaweicloud.com/xxx/jnpl_base:v0.1', args: '${computer.jnlpmac} ${computer.name}')],
        imagePullSecrets: [ 'regsecret' ]) { ### 需要提前创建镜像仓库secret,不然无法推送和拉取docker镜像
    body()
}
}             
def offlineTemplate(label, body) { ##以下为docker-in-docker的方式,创建多个镜像环境
  podTemplate(label: label, cloud: 'k8s-test',
        containers: [
            containerTemplate( 
                name: 'jnlp', ## 用户代码的拉取,需要在镜像中部署git环境
                image: 'swr.cn-east-3.myhuaweicloud.com/xxx/jnlp_base:v0.1', 
                args: '${computer.jnlpmac} ${computer.name}',
                resourceLimitCpu: '2',
                resourceLimitMemory: '4Gi'
            ),
            containerTemplate( ## 编译环境,此处使用gradle对java服务进行编译打包
                name: 'gradle', 
                image: 'swr.cn-east-3.myhuaweicloud.com/xxx/gradle_jdk8:7.4.2', 
                ttyEnabled: true,
                command: 'cat',
                resourceLimitCpu: '4',
                resourceLimitMemory: '8Gi'
            ),
            containerTemplate( ##镜像制作,大家可以提前了解下kaniko工具的具体使用方式
                name: 'kaniko',
                image: 'registry.cn-hongkong.aliyuncs.com/cmi/kaniko-project_executor:debug',
                ttyEnabled: true,
                command: 'cat',
                resourceLimitCpu: '1',
                resourceLimitMemory: '2Gi',
                envVars: [
                    envVar(key: 'DOCKER_CONFIG', value: '/home/jenkins/.docker')
                ]
            )
            
            
        ],
        imagePullSecrets: [ 'regsecret' ],
        volumes: [
            secretVolume(secretName: 'jenkins-docker-cfg', mountPath: '/home/jenkins/.docker'),
            nfsVolume(mountPath: '/home/jenkins/agent/web/', serverAddress: '172.18.0.181', serverPath: '/jenkins', readOnly: false) ## 使用此共享存储的目的是,由于slave节点是动态的,每次执行完打包动作之后,slave节点会在k8s中自动回收,打包后的制品不会持久化存储,所以加了个nas做持久化存储使用
        ]
        ) {
            body()
    }
}

CI/CD

stage('建立任务'){
    try{
        offlineTemplate(label_k8s){
            node(label_k8s) {
                container('jnlp') {
                    stage('拉取代码'){ 
                        dir("${BUILD_ID}"){
                            checkout ( [$class: 'GitSCM',
                            branches: [[name: "env.branch"]],
                            userRemoteConfigs: [[
                            credentialsId: '18fa3646-f6fe-42e8-9726-xxxx', 
                            url: git_repo]]])
                            commitid = sh(returnStdout: true, script: "git --no-pager show -s --format=%H").trim()
                            ref_branch = sh(returnStdout: true, script: "git branch -r --contains ${commitid}").trim()
                            echo commitid
                        }
                    }
                    stage('开始编译'){ 
                        container('gradle') {
                            dir("${BUILD_ID}"){
                                sh "gradle bootJar"
                                sh "cp -r ./ /home/jenkins/agent/web/"
                                
                            }
                        }
                    }
                    stage('构建&推送镜像'){
                        container('kaniko') {
                            dir("${BUILD_ID}"){
                                sh "/kaniko/executor --dockerfile=`pwd`/Dockerfile --context=`pwd`  --destination=swr.cn-east-3.myhuaweicloud.com/xxx/dingzktest:0.2"
                            }
                        }
    				}
    				stage('发布至生产环境'){
    				     created = kubectl("set image deployment/dingzktest dingzktest=swr.cn-east-3.myhuaweicloud.com/xxx/dingzktest:0.2","default").trim()
    				 }
                }
            }
        }
        echo "构建完成"
    }catch(all){
        echo "构建异常" 
    }
}

其他

本文主要介绍了jenkins+k8s实现过程,pipeline中的一些细节部分,可以参考jenkins + ecs静态agent实现代码持续集成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值