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: [], submoduleCfg: [], 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