Jenkins + Helm:Vue 应用发布实战

来自AI助手的总结
通过Harbor推送Chart并用Helm实现镜像构建部署自动化流程
Jenkins + Helm:Vue 应用发布实战

一、推送与安装Chart


[root@master01 ~]# cd /root/5/

[root@master01 5]# cp -r demo-helm/ demo-vue-helm

[root@master01 5]# cd demo-vue-helm/

# 生成指定包

[root@master01 ~]# cd /root/5/demo-helm/

[root@master01 demo-helm]# helm package .

Successfully packaged chart and saved it to: /root/5/demo-vue-helm/demo-vue-helm-0.2.2.tgz

#添加repo

[root@master01 helm-push]# helm repo add devopsrepo http://harbor.zhang-qing.com/chartrepo/demo \

  --username admin \

  --password 'Harbor12345'

# 上传包到harbor仓库

[root@master01 demo-helm]#

helm cm-push demo-vue-helm-0.2.2.tgz https://harbor.zhang-qing.com/chartrepo/demo \

  --username=admin \

  --password='Harbor12345'

Pushing demo-vue-helm-0.2.2.tgz to https://harbor.zhang-qing.com/chartrepo/demo...

Done.

浏览器输入https://harbor.zhang-qing.com/登录harbor,账号密码为admin/Harbor12345

image-20250511155533767

二、基于helm的部署方式

1、准备k8s-helm容器Dockerfile文件

(1)国内环境(本实验使用)


[root@master01 ~]# cd /root/5/demo-vue-helm/

[root@master01 demo-vue-helm]# vim Dockerfile

# 使用新版Alpine镜像

FROM registry.cn-hangzhou.aliyuncs.com/abroad_images/alpine:3.18

# Metadata

LABEL \

  org.opencontainers.image.title="lachlanevenson/k8s-helm" \

  org.opencontainers.image.url="https://helm.sh/docs/"

ENV HELM_VERSION="v3.7.2"

ARG TARGETARCH="amd64"

# 设置阿里云镜像源

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 安装依赖

RUN apk add --no-cache --update \

    ca-certificates \

    wget \

    git \

    openssl \

    bash && \

    wget -q "https://get.helm.sh/helm-${HELM_VERSION}-linux-${TARGETARCH}.tar.gz" && \

    tar -xzf "helm-${HELM_VERSION}-linux-${TARGETARCH}.tar.gz" && \

    mv "linux-${TARGETARCH}/helm" /usr/local/bin/helm && \

    rm -rf "helm-${HELM_VERSION}-linux-${TARGETARCH}.tar.gz" && \

    chmod +x /usr/local/bin/helm

ENTRYPOINT ["helm"]

CMD ["help"]

(2)国外环境


[root@master01 ~]# cd /root/5/demo-helm/

[root@master01 demo-helm]# vim Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/abroad_images/alpine:3.6

# Metadata

LABEL \

  org.opencontainers.image.title="lachlanevenson/k8s-helm" \

  org.opencontainers.image.url="https://helm.sh/docs/"

ENV HELM_LATEST_VERSION="v3.7.2"

ARG TARGETARCH

ENV TARGETARCH=${TARGETARCH:-amd64}

RUN \

  apk add --no-cache --update ca-certificates && \

  apk add --no-cache --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 -rf /var/cache/apk/* && \

  rm -f "helm-${HELM_LATEST_VERSION}-linux-${TARGETARCH}.tar.gz"

ENTRYPOINT ["helm"]

CMD ["help"]

2、构建镜像


[root@master01 demo-helm]#docker build -t harbor.zhang-qing.com/library/k8s-helm:v3.7.2 .

3、上传镜像到Harbor


[root@master01 demo-helm]# docker push harbor.zhang-qing.com/library/k8s-helm:v3.7.2

4、定义一个名为Vue-Demo-Test-Helm的Pipline

// 定义git相关数据
def git_address = "http://gitlab.zhang-qing.com/demoteam/vue-kubernetes.git"
def git_auth = "Gitlab-username"
// 构建版本的名称
def tag = "latest"
// Harbor私服地址
def harbor_url = "harbor.zhang-qing.com"
// Harbor的项目名称
def harbor_project_name = "demo"
// Harbor的凭证
def harbor_auth = "Harbor-username"
// 启动时间
def start = new Date().format('yyyy-MM-dd HH:mm:ss')
// 创建一个Pod的模板,label为jenkins-slave
podTemplate(
    label: 'jenkins-slave-vue',
    cloud: 'study-kubernetes',
    containers: [
         containerTemplate(
            name: 'jnlp',
            image: "harbor.zhang-qing.com/library/inbound-agent:3299.v0d0d06908537-1",
            ttyEnabled: true
        ),
        containerTemplate(
            name: 'docker',
            image: "harbor.zhang-qing.com/library/docker:stable",
            ttyEnabled: true,
            command: 'cat'
        ),
        containerTemplate(
            name: 'helm3',
            image: "harbor.zhang-qing.com/library/k8s-helm:v3.7.2",
            ttyEnabled: true,
            command: 'cat'
        )
    ],
    volumes: [
        hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
    ]
) {
    node("jenkins-slave-vue") {
        // 第一步:拉取代码
        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部署
                container('helm3') {
                    withCredentials([usernamePassword(
                        credentialsId: "${harbor_auth}",
                        passwordVariable: 'password',
                        usernameVariable: 'username'
                    )]) {
                        sh """
                        # 添加Helm仓库
                        helm repo add --username=${username} --password=${password} devopsrepo https://harbor.zhang-qing.com/chartrepo/demo \
                        """
                    }
                    withCredentials([file(credentialsId: 'kubernetes', variable: 'KUBECONFIG')]) {
                        sh """
                        mkdir -p /root/.kube/ && echo $KUBECONFIG >/root/.kube/config
                        echo "Helm应用配置信息确认..."
                        helm upgrade --install --dry-run --debug ${currentProjectName} --namespace ${namespaces} devopsrepo/demo-vue-helm \
                        --version 0.2.2 \
                        --set replicaCount=${replicas} \
                        --set image.repository=${deploy_image_name} \
                        --set service.type=ClusterIP \
                        --set resources.limits.memory=${limiteMem} \
                        --set ingress.enabled=${isIngress}
                        echo "应用部署..."
                        helm upgrade --install ${currentProjectName} --namespace ${namespaces} devopsrepo/demo-vue-helm \
                        --version 0.2.2 \
                        --set replicaCount=${replicas} \
                        --set image.repository=${deploy_image_name} \
                        --set service.type=ClusterIP \
                        --set resources.limits.memory=${limiteMem} \
                        --set ingress.enabled=${isIngress}
                        """
                    }
                }
            }
        }
    }
}

5、定义字符串参数

依次点击【参数化构建过程】-【字符参数】

  • 第一个字符参数:

  • 名称:branch

  • 默认值:main

  • 描述:Git 分支

  • 第二个字符参数:

  • 名称:project_name

  • 默认值:vue

  • 描述:项目名称

  • 第三个字符参数:

  • 名称:replicas

  • 默认值:1

  • 描述:副本数

  • 第四个字符参数:

  • 名称:namespaces

  • 默认值:demo

  • 描述:K8s 命名空间

  • 第五个字符参数:

  • 名称:limiteMem

  • 默认值:2Gi

  • 描述:内存 限制

  • 第六个字符参数:

  • 名称:isIngress

  • 默认值:false

  • 描述:Ingress开关

6、填写完成后,点击【应用】-【Save】

7、点击【Build with Parameters】,默认值即可,点击【Build】进行构建即可

8、构建完成后,验证查看


[root@master01 demo-vue-helm]# kg deploy,svc,ingress -n demo

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE

deployment.apps/vue   1/1     1            1           66s

NAME          TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE

service/vue   ClusterIP   192.168.166.167   <none>        80/TCP    66s

NAME                                CLASS   HOSTS                     ADDRESS     PORTS   AGE

ingress.networking.k8s.io/vue-ing   nginx   vue-test.zhang-qing.com   10.0.0.11   80      66s

三、环境还原


[root@master01 ~]# k delete ingress vue-ing -n demo

[root@master01 ~]# k delete svc,deploy vue -n demo

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容