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实现代码持续集成