
4、参数化构建
parameters {
gitParameter branch: '', branchFilter: '.', defaultValue: '', description: '选择发布的分支', name: 'Branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '', type: 'PT_BRANCH' ###动态的去获取参数
extendedChoice defaultValue: 'none', description: '选择发布的微服务', \ ###加了扩展,可以多选发布多个微服务
微服务找出我们需要哪些需要人工交互的
就是使用的这套微服务都适用于这套chart模版
1、微服务名称,以及针对一些服务需要带上域名,另外比如去配置的微服务的名字都是不一样的,这个名字是保证是唯一的,需要使用include,,一般写在_helpers。tpl下,因为我们部署的时候已经拿到微服务的名称了,所以helm起的名字也是微服务的名字,然后再加上公用的标签就区分出来了,另外就是微服务的端口也是不一样的
2、端口,每个微服务的端口也都不一
3、命名空间 使用helm -n 就可以部署到指定的命名空间了
4、副本数 这个本来在helm中是3个副本,我们可以通过传参的形式变成5或者2都可以
5、资源的限制,本身这个k8s中的限制是无法满足一个java应用的限制的,一般1.8jdk版本是不兼容的,新的版本是兼容的,所以手动的去指定它的对内存的大小,这个一般在dockerfile启用jar包的时候带入
6、chart模版的选择 可能一个项目满足不了一个项目,那么可能就得需要两个模版来实现
multiSelectDelimiter: ',', name: 'Service', type: 'PT_CHECKBOX', \
value: 'gateway-service:9999,portal-service:8080,product-service:8010,order-service:8020,stock-service:8030'
choice (choices: ['ms', 'demo'], description: '部署模板', name: 'Template')
choice (choices: ['1', '3', '5', '7'], description: '副本数', name: 'ReplicaCount')
choice (choices: ['ms'], description: '命名空间', name: 'Namespace')
}
然后需要将这个chart模版添加到repo里
[root@k8s-master1 ~]
# helm repo add --username admin --password Harbor12345 myrepo
"myrepo" has been added to your repositories
[root@k8s-master1 ~]
# helm repo list
NAME URL
myrepo
http:/
/192.168.30.27/chartrepo/library
将helm制作完成后打包并push到仓库中,然后当我们部署的时候就去拉这个helm模版地址
[root@k8s-master1 ~]
# helm push ms-0.1.0.tgz --username=admin --password=Harbor12345 http://192.168.30.27/chartrepo/library
Pushing ms
-0.1.0.tgz to http:
//192.168.30.27/chartrepo/library...
Done.

5、jenkins-slave所执行的具体任务
stages {
stage(
'拉取代码'){
steps {
checkout([
$class:
'GitSCM',
branches: [[name:
"${params.Branch}"]],
doGenerateSubmoduleConfigurations:
false,
extensions: [], submoduleC
fg: [],
userRemoteConfigs: [[credentialsId:
"${git_auth}", url:
"${git_url}"]]
它需要将这个参数传给上面的git parameters,让它能够动态的git地址中拉取所有的分支,
])
}
}
stage(
'代码编译') {
// 编译指定服务
steps {
sh
"""
mvn clean package -Dmaven.test.skip=true
"""
}
}
stage(
'构建镜像') {
steps {
withCredentials([usernamePassword(credentialsId:
"${harbor_registry_auth}", passwordVariable:
'password', usernameVariable:
'username')]) {
这里使用了一个凭据的认证将连接harbor认证信息保存到凭据里面,为了安全性,使用了凭据的引用,动态的将它保存到变量中,然后通过调用变量的形式去登录这镜像仓库,这样的话就不用在pipeline中去体现密码了,
sh
"""
docker login -u ${username} -p '${password}' ${registry}
for service in \$(echo ${Service} |sed 's/,/ /g'); do
service_name=\${service%:*}
因为我们是部署的微服务,所以我们需要很多的服务的构建,所以这里加了一个for循环
它调用的$service正是参数化构建中的选择的services,然后根据不同的服务推送到镜像仓库,
image_name=${registry}/${project}/\${service_name}:${BUILD_NUMBER}
cd \${service_name}
if ls |grep biz &>/dev/null; then
cd \${service_name}-biz
fi
docker build -t \${image_name} .
docker push \${image_name}
cd ${WORKSPACE}
done
""" 之前说需要kubeconfig这个配置存到jenins中的slave的pod中,起个名字叫admin.kubeconfig
configFileProvider([configFile(fileId:
"${k8s_auth}", targetLocation:
"admin.kubeconfig")]){
sh
"""
# 添加镜像拉取认证 当使用拉取镜像的认证信息的时候就可以直接指定admin.kubeconfig了,它就能连接到这个集群了
kubectl create secret docker-registry ${image_pull_secret} --docker-username=${username} --docker-password=${password} --docker-server=${registry} -n ${Namespace} --kubeconfig admin.kubeconfig |true
# 添加私有chart仓库到这个pod中
helm repo add --username ${username} --password ${password} myrepo ${registry}/chartrepo/${project}
"""
}
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------
6、deploy,使用helm部署到k8s中
stage(
'Helm部署到K8S') {
steps {
sh
"""定义公共的参数,使用helm,kubectl都要加namespace命名空间,连接k8s认证的kubeconfig文件
common_args="-n
${Namespace} --kubeconfig admin.kubeconfig
"
for service in \$(echo ${Service} |sed 's/,/ /g'); do
for循环每个微服务的端口都不一样,所以在微服务这里添加微服务的名字和它对应的端口,把选择的服务和端口进行拆分
service_name=\${service%:*}
service_port=\${service#*:}
image=${registry}/${project}/\${service_name}
tag=${BUILD_NUMBER} 。 jenkins构建的一个编号
helm_args="\
${service_name} --set image.repository=\
${image} --set image.tag=\
${tag} --set replicaCount=
${replicaCount} --set imagePullSecrets[0].name=
${image_pull_secret} --set service.targetPort=\
${service_port} myrepo/
${Template}"
# 判断是否为新部署
if helm history \${service_name} \${common_args} &>/dev/null;then 那么加一个判断看看是不是部署了,为假就install,为真就upgrade
action=upgrade 旧部署的使用upgrade更新
else
action=install 新部署的使用install
fi
# 针对服务启用ingress
if [ \${service_name} == "gateway-service
" ]; then
helm \${action} \${helm_args} \
--set ingress.enabled=true \ 为true就启用ingress,因为chart肯定默认的为force,就是不启用ingress
--set ingress.host=${gateway_domain_name} \
\${common_args}
elif [ \${service_name} == "portal-service
" ]; then
helm \${action} \${helm_args} \
--set ingress.enabled=true \
--set ingress.host=${portal_domain_name} \
\${common_args}
else
helm \${action} \${helm_args} \${common_args}
fi
done
# 查看Pod状态
sleep 10
kubectl get pods \${common_args}
"""
}
}
}
}
修改一些认证信息,这个pipeline最好先从一个地方复制一下,修改完再放进pipeline
gitlab的项目地址def git_url =
"http://192.168.30.28/root/ms.git"
修改harbor的凭据
选择credentials