Jenkins基于Helm的应用发布

相对于基于控制器文件部署的方式有哪些优点:

  • 利于形成DEVOPS标准化;
  • 控制器方式需要维护大量的yaml文件;
  • 相对于helm方式,控制器方式低效且不够灵活;

当前环境环境基于控制器文件部署:

//定义git相关数据
def git_address = "http://gitlab.kubernets.cn/demoteam/java_kubernetes.git" 
def git_auth = "59d88ee6-8c38-4116-948d-66d812799c63"

//构建版本的名称
def tag = "latest"
//Harbor私服地址
def harbor_url = "harbor-local.kubernets.cn"
//Harbor的项目名称
def harbor_project_name = "demo"
//Harbor的凭证
def harbor_auth = "6d2ada67-9f69-4f79-85e8-c76a0b9e0564"
//启动时间
def start = new Date().format('yyyy-MM-dd HH:mm:ss')


//创建一个Pod的模板,label为jenkins-slave
podTemplate(label: 'jenkins-slave-java', cloud: 'kubernetes', containers: [ 
    containerTemplate(
        name: 'jnlp',
        image: "harbor-local.kubernets.cn/library/jenkins-slave-maven",
        ttyEnabled: true
        ),
    containerTemplate( 
        name: 'docker',
        image: "harbor-local.kubernets.cn/library/docker:stable",
        ttyEnabled: true,
        command: 'cat'
        ),
    ],
    volumes: [
        hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
    ],
)
{
node("jenkins-slave-java"){
    // 第一步
    stage('Pull'){
        checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
    }

    stage('BuildDescription') {
        // 自定义设置构建历史显示的名称和描述信息 
        // 不同的部署方式设置构建历史显示的名称和描述信息方式不一样,根据自己的部署方式自行百度找到设置方法
        script {
        //设置buildName
          wrap([$class: 'BuildUser']) {
           //修改Description
            buildDescription "${BUILD_USER} > ${project_name} > ${branch}"
           }
         }
     }

    // 第二步
    stage('Build&Tag&Push&Deploy'){
        //把选择的项目信息转为数组
        def selectedProjects = "${project_name}".split(',')

        for(int i=0;i<selectedProjects.size();i++){
            //取出每个项目的名称
            def currentProjectName = selectedProjects[i];

            //定义镜像名称
            def imageName = "${currentProjectName}:${tag}"

                        //定义newTag
                        def newTag = sh(returnStdout: true,script: 'echo `date +"%Y%m%d%H%M"_``git describe --tags --always`').trim()

            //编译,构建本地镜像
            //sh "sed -i 's#ACTIVEPROFILE#${springProfilesActive}#g' Dockerfile"
            sh "mvn clean package -Dmaven.test.skip=true"
            container('docker') {

                //镜像编译
                sh "docker build -t ${imageName} ."

                //给镜像打标签
                sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"

                //登录Harbor,并上传镜像
                withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')])
                {
                    //登录
                    sh "docker login -u ${username} -p ${password} ${harbor_url}"
                    //上传镜像
                    sh "docker push ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
                }

            //删除本地镜像
            sh "docker rmi -f ${imageName}" 
            sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
            }
            def deploy_image_name = "${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"

            //基于控制器的方式部署到K8S 
            sh """
                sed -i 's#\$IMAGE_NAME#${deploy_image_name}#' deployment.yaml
                sed -i 's#\$APP_NAME#${currentProjectName}#' deployment.yaml
                sed -i 's#\$APP_REPLICAS#${replicas}#' deployment.yaml
                sed -i 's#\$NAMESPACE#${namespaces}#' deployment.yaml
                sed -i 's#\$SPRINGENV#${springProfilesActive}#' deployment.yaml
                sed -i 's#\$PODMEMORY#${podsMem}#' deployment.yaml
                sed -i 's#\$PODCPU#${podsCpu}#' deployment.yaml
                cat deployment.yaml
            """
            //部署到K8S
            kubernetesDeploy(kubeconfigId: "7ab1d5e8-0f10-4ca7-918a-f505b727c23d", configs: "deployment.yaml")
        }
    }
}
}

基于helm的部署方式:

//定义git相关数据
def git_address = "https://gitlab.zhoumx.net/kubernetes/springdemo.git" 
def git_auth = "d94c267d-20be-4778-bfad-2a26f568a508"

//构建版本的名称
def tag = "latest"
//Harbor私服地址
def harbor_url = "harbor.zhoumx.cc"
//Harbor的项目名称
def harbor_project_name = "demo"
//Harbor的凭证
def harbor_auth = "e3ad80ae-89c8-428d-b8d4-4b25009fecc1"
//启动时间
def start = new Date().format('yyyy-MM-dd HH:mm:ss')


//创建一个Pod的模板,label为jenkins-slave
podTemplate(label: 'jenkins-slave-java', cloud: 'kubernetes', containers: [ 
    containerTemplate(
        name: 'jnlp',
        image: "harbor.zhoumx.cc/library/jenkins-slave-maven:v1",
        ttyEnabled: true
        ),
    containerTemplate( 
        name: 'docker',
        image: "harbor.zhoumx.cc/library/docker:stable",
        ttyEnabled: true,
        command: 'cat'
        ),
    containerTemplate( 
        name: 'helm3',
        image: "harbor.zhoumx.cc/library/k8s-helm:v3.12.3",
        ttyEnabled: true,
        command: 'cat'
        ),
    ],
    volumes: [
        hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
    ],
)
{
node("jenkins-slave-java"){
    // 第一步
    stage('Pull'){
        checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
    }

    stage('BuildDescription') {
        // 自定义设置构建历史显示的名称和描述信息 
        // 不同的部署方式设置构建历史显示的名称和描述信息方式不一样,根据自己的部署方式自行百度找到设置方法
        script {
        //设置buildName
          wrap([$class: 'BuildUser']) {
           //修改Description
            buildDescription "${BUILD_USER} > ${project_name} > ${branch}"
           }
         }
     }

    // 第二步
    stage('Build&Tag&Push&Deploy'){
        //把选择的项目信息转为数组
        def selectedProjects = "${project_name}".split(',')

        for(int i=0;i<selectedProjects.size();i++){
            //取出每个项目的名称
            def currentProjectName = selectedProjects[i];

            //定义镜像名称
            def imageName = "${currentProjectName}:${tag}"

                        //定义newTag
                        def newTag = sh(returnStdout: true,script: 'echo `date +"%Y%m%d%H%M"_``git describe --tags --always`').trim()

            //编译,构建本地镜像
            //sh "sed -i 's#ACTIVEPROFILE#${springProfilesActive}#g' Dockerfile"
            sh "mvn clean package -Dmaven.test.skip=true"
            container('docker') {

                //镜像编译
                sh "docker build -t ${imageName} ."

                //给镜像打标签
                sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"

                //登录Harbor,并上传镜像
                withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')])
                {
                    //登录
                    sh "docker login -u ${username} -p ${password} ${harbor_url}"
                    //上传镜像
                    sh "docker push ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
                }

            //删除本地镜像
            sh "docker rmi -f ${imageName}" 
            sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
            }
            def deploy_image_name = "${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"

            //基于Helm的方式部署到K8S 
            container('helm3') {
                withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                sh """
                    helm repo add --username=${username} --password=${password} devopsrepo https://harbor.zhoumx.cc/chartrepo/demo
                """
                }
                //需要使用secret类型凭据
                withCredentials([file(credentialsId: 'ef9b5d86-d6f6-4079-941d-7a2bfec74b33', variable: 'KUBECONFIG')]) {
                sh """
                    mkdir -p /root/.kube/ && echo $KUBECONFIG >/root/.kube/config
                    echo "Helm应用配置信息确认..."
                    helm upgrade --install --dry-run --debug ${currentProjectName} --namespace ${namespaces} devopsrepo/demohelm \
                        --set replicaCount=${replicas} \
                        --set image.repository=${deploy_image_name} \
                        --set service.type=ClusterIP \
                        --set resources.limits.memory=${podsMem} \
                        --set resources.limits.cpu=${podsCpu} \
                        --set resources.requests.memory=${podsMem} \
                        --set resources.requests.cpu=${podsCpu} \
                        --set ingress.enabled=${isIngress}
                    echo "应用部署..."
                    helm upgrade --install ${currentProjectName} --namespace ${namespaces} devopsrepo/demohelm \
                        --set replicaCount=${replicas} \
                        --set image.repository=${deploy_image_name} \
                        --set service.type=ClusterIP \
                        --set resources.limits.memory=${podsMem} \
                        --set resources.limits.cpu=${podsCpu} \
                        --set resources.requests.memory=${podsMem} \
                        --set resources.requests.cpu=${podsCpu} \
                        --set ingress.enabled=${isIngress}
                    """
                }
            }
        }
    }
}
}

k8s-helm容器Dockerfile文件

[root@master1 /tmp/charts]# cat Dockerfile
FROM alpine

# Metadata
LABEL org.opencontainers.image.title="lachlanevenson/k8s-helm" \
      org.opencontainers.image.url="https://helm.sh/docs/"

ENV HELM_LATEST_VERSION="v3.12.3"

ARG TARGETARCH
ENV TARGETARCH=${TARGETARCH:-amd64}

RUN apk add --update ca-certificates \
 && apk add --update -t deps wget git openssl bash \
 && wget -q https://get.helm.sh/helm-${HELM_LATEST_VERSION}-linux-${TARGETARCH}.tar.gz \
 && tar -xf helm-${HELM_LATEST_VERSION}-linux-${TARGETARCH}.tar.gz \
 && mv linux-${TARGETARCH}/helm /usr/local/bin \
 && apk del --purge deps \
 && rm /var/cache/apk/* \
 && rm -f /helm-${HELM_LATEST_VERSION}-linux-${TARGETARCH}.tar.gz

ENTRYPOINT ["helm"]
CMD ["help"]

编译及上传

$ docker build -t k8s-helm:v3.12.3 .
$ docker tag k8s-helm:v3.12.3 harbor.zhoumx.cc/library/k8s-helm:v3.12.3
$ docker push harbor.zhoumx.cc/library/k8s-helm:v3.12.3

编译结果

Jenkins基于Helm的应用发布

验证

$ helm list -n demo
NAME                NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
spring-java-demo    demo        1           2023-12-06 11:38:51.193517733 +0000 UTC deployed    demohelm-0.2.0  1.16.0

$ kubectl get po -n demo
NAME                                READY   STATUS    RESTARTS   AGE
spring-java-demo-844ff9f856-hjlmk   1/1     Running   0          4m5s

$ kubectl get svc -n demo
NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
spring-java-demo   ClusterIP   10.15.36.186   <none>        8080/TCP   52s

$ curl 10.15.36.186:8080/appone
appOne

$ curl 10.15.36.186:8080/apptwo
appTwo
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
Jenkins云原生

Jenkins部署在k8s集群之外使用动态slave模式

2025-7-15 2:39:14

Jenkins云原生

Jenkins Pipeline语法

2025-7-15 4:13:29

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
本站支持IPv6访问