通过Jenkins部署应用到K8S的操作手册

前提:项目代码准备

  • 代码下载
    • 从SVN将代码checkout到本地
    • Vue工程需确保npm installnpm run build正常
  • 代码上传到Gitlab
    • 确保工程代码最新
    • 多余文件删除
    • .gitignore文件创建
    • 在gitlab中创建工程
    • 上传到Gitlab,如下
csharp 复制代码
## 上传代码到Git命令

# 进入项目根目录
# 初始化git本地仓库
git init
# 初始提交
git add . 
git commit -m "Initial Commit"
# 关联远程Gitlab仓库
git remote add origin http://gitlab.hangzhou.net/date-info/ad/info-manage.git
# 推送代码到远程仓库master分支
git push -u origin master
# 创建并切换到 dev 分支
git checkout -b dev
# 推送dev分支到远程仓库
git push --set-upstream origin dev

一、部署Java工程

1.部署文件准备

Dockerfile

  • 在项目根目录中创建Dockerfile文件(如果项目中原有Dockerfile,尽量修改为下述内容结构)
  • 内容先复制如下内容
bash 复制代码
FROM xxxxxxx/openjdk:8-jre

MAINTAINER wangx test@foxmail.com

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

COPY target/test-gateway-server.jar /app.jar

ENTRYPOINT ["java", "-Xmx512m", "-Djava.security.egd=file:/dev/./urandom", "-Ddruid.mysql.usePingMethod=false", "-jar", "/app.jar"]
  • 根据项目修改以下几点
    • MAINTAINER:作者,写自己的即可;
    • COPY:将jar文件的名称修改项目名称;
    • 如有需要COPY字体文件,可在COPY jar下发增加COPY simsun.ttc /usr/share/fonts/simsun.ttc命令。

Jenkinsfile

  • 在项目根目录中创建Jenkinsfile文件
  • 内容先复制如下内容
php 复制代码
pipeline {
    agent any

    environment{
        repoHost = 'registry-dev.hangzhou.net'
        repoNs = 'test'
        repoUser = 'testadmin'
        repoPasswd = 'test@114514'
    }

    // 存放所有任务的合集
    stages {
        // 拉取代码
        stage('git checkout') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/dev']], extensions: [], userRemoteConfigs: [[credentialsId: 'wagnxin-gitlab', url: 'http://gitlab.hangzhou.net/date-info/test/test-cloud.git']]])
            }
        }
        // 构建代码
        stage('mvn clean package') {
            steps {
                sh '/var/jenkins_home/maven_3.6.1/bin/mvn clean package -Ptest -DskipTests'
            }
        }
        // 制作自定义镜像并发布
        stage('docker build and push') {
            steps {
                sh '''docker build -t ${JOB_NAME}:${IMAGE_TAG} ./
                      docker login -u ${repoUser} -p ${repoPasswd} ${repoHost}
                docker tag ${JOB_NAME}:${IMAGE_TAG} ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}
                docker push ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}
                docker rmi ${JOB_NAME}:${IMAGE_TAG}
                docker rmi ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}'''
            }
        }
        // 上传pipeline.yml文件
        stage('upload yaml to k8s') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/test-app', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'PROJECT_NAME.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }

        // 修改yaml文件中镜像版本为自定生成的版本号
        stage('set docker image tag') {
            steps {
                sh 'ssh root@172.16.1.232 sed -i s/IMAGE_TAG/${IMAGE_TAG}/ /home/test-app/${JOB_NAME}.yaml'
            }
        }

        // 远程执行kubectl命令
        stage('publish') {
            steps {
                sh 'ssh root@172.16.1.232 kubectl apply -f /home/test-app/${JOB_NAME}.yaml'
            }
        }
    }
    post {
        success {
            dingtalk (
                robot: 'ad_dingding_robot',
                type:'MARKDOWN',
                title: "${JOB_NAME}发布成功",
                text: ["${JOB_NAME}部署结果通知 \n- 构建结果:成功构建\n- 镜像版本:${IMAGE_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:${JOB_NAME}"]
            )
        }
        failure {
            dingtalk (
                robot: 'ad_dingding_robot',
                type:'MARKDOWN',
                title: "${JOB_NAME}发布失败",
                text: ["${JOB_NAME}部署结果通知\n- 构建结果:构建失败 \n- 镜像版本:${IMAGE_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:${JOB_NAME}"]
            )
        }
    }
}
  • 根据项目修改以下几点
    • 拉取代码区域:根据自己的Gitlab代码地址修改url的值
    • 构建代码区域:根据项目情况决定是否保留-Ptest
    • 上传pipeline.yml文件区域:修改PROJECT_NAME为你的项目名称,最终和k8s yaml文件名称保持一致
    • 如当前项目是某个学校,需要提前创建好名称空间,替换当前文件中test-app为新的名称空间名称

k8s yaml

  • 在项目根目录中创建PROJECT_NAME.yaml文件,PROJECT_NAME修改为项目名称
  • 内容先复制如下内容
yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metainfo:
  labels:
    k8s.kuboard.cn/layer: svc
    k8s.kuboard.cn/name: PROJECT_NAME
  name: PROJECT_NAME
  namespace: test-app
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s.kuboard.cn/layer: svc
      k8s.kuboard.cn/name: PROJECT_NAME
  template:
    metainfo:
      labels:
        k8s.kuboard.cn/layer: svc
        k8s.kuboard.cn/name: PROJECT_NAME
    spec:
      containers:
        - image: registry-dev.hangzhou.net/test/PROJECT_NAME:IMAGE_TAG
          imagePullPolicy: Always
          name: PROJECT_NAME
          ports:
            - containerPort: 8888
              name: gateway
              protocol: TCP
          resources:
            limits:
              memory: 500Mi
            requests:
              memory: 200Mi
      restartPolicy: Always
      imagePullSecrets:
        - name: zyharbor
---
apiVersion: v1
kind: Service
metainfo:
  labels:
    k8s.kuboard.cn/layer: svc
    k8s.kuboard.cn/name: PROJECT_NAME
  name: PROJECT_NAME
  namespace: test-app
spec:
  ports:
    - name: api
      port: 8888
      protocol: TCP
      targetPort: 8888
  selector:
    k8s.kuboard.cn/layer: svc
    k8s.kuboard.cn/name: PROJECT_NAME
  type: NodePort
  • 根据项目修改以下几点
    • 将所有的PROJECT_NAME修改为当前项目名称
    • 8888端口修改为项目使用的端口
    • 如当前项目是某个学校,需要提前创建好名称空间,替换当前文件中test-app为新的名称空间名称

2.创建Jenkins Job

  • 进入Jenkins
arduino 复制代码
地址:http://172.16.1.247:8080
账号:admin
密码:admin123
  • 选择指定组织视图,如果无可创建视图,再点击左上角+新建任务
  • 任务名称输入项目名称
  • 选择流水线类型
  • 复制输入框输入test-gateway-server,会出现一个下拉框选择出现的test-gateway-server
  • 点击OK按钮保存,然后进入配置页
  • 点击左侧流水线,定位到配置仓库位置,修改Repository URL的值为当前项目的Git地址
  • 脚本路径输入框修改为Jenkinsfile值即可
  • 点击应用、保存

3.测试应用部署

  • 在刚创建的任务里,点击Build with Parameters,进入构建页面,继续点击开始构建即可
  • 在左边下发的Build History会出现一个进行中的构建,点击可查看具体日志
  • 构建成功后,访问K8Shttp://172.16.1.232/(admin/Gj@CbYJihcI#5igy)
  • 侧边栏找到名称空间-选择并点击,点击test-app名称空间
  • 侧边栏找到应用程序-工作负载并点击在列表中找到刚刚部署的应用,点击名称进入详情页
  • 然后点击顶部栏的服务,具体端口如图所示
  • 通过172.16.1.232:PORT再拼接上接口的详情地址即可访问
  • 部署完成

二、部署Vue工程

1.部署文件准备

nginx.conf

  • 在项目根目录中创建nginx.conf文件
  • 内容复制如下内容
ini 复制代码
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    keepalive_timeout  65;

    #gzip  on;

    server {
        listen 17003 default_server;
        listen [::]:17003 default_server;

        location / {
            root /usr/share/nginx/html;
            index index.html;
        }

        # 接口代理
        location /api {
            proxy_pass http://172.16.1.232:32001/api;
        }

    }

}
  • 根据项目修改以下几点
    • 接口代理:修改为项目所需要的接口地址

Dockerfile

  • 在项目根目录中创建Dockerfile文件(如果项目中原有Dockerfile,尽量修改为下述内容结构)
  • 内容先复制如下内容
bash 复制代码
FROM registry-dev.hangzhou.net/library/nginx:1.18.0-alpine

WORKDIR /

# 复制前端文件
COPY ./dist /usr/share/nginx/html

# 复制nginx配置文件
COPY ./nginx.conf /etc/nginx/nginx.conf
  • 不需要修改任何内容

Jenkinsfile

  • 在项目根目录中创建Jenkinsfile文件
  • 内容先复制如下内容
php 复制代码
pipeline {
    agent any

    environment{
        repoHost = 'registry-dev.hangzhou.net'
        repoNs = 'test'
        repoUser = 'testadmin'
        repoPasswd = 'test@114514'
    }

    // 存放所有任务的合集
    stages {
        // 拉取代码
        stage('git checkout') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/dev']], extensions: [], userRemoteConfigs: [[credentialsId: 'wagnxin-gitlab', url: 'http://gitlab.hangzhou.net/date-info/test/big-info-auth-web.git']]])
            }
        }
        // 构建代码
        stage('npm install and build') {
            steps {
                sh '''/var/jenkins_home/node_12.20.0/bin/npm install
                /var/jenkins_home/node_12.20.0/bin/npm run build'''
            }
        }
        // 制作自定义镜像并发布
        stage('docker build and push') {
            steps {
                sh '''docker build -t ${JOB_NAME}:${IMAGE_TAG} ./
                docker login -u ${repoUser} -p ${repoPasswd} ${repoHost}
                docker tag ${JOB_NAME}:${IMAGE_TAG} ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}
                docker push ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}
                docker rmi ${JOB_NAME}:${IMAGE_TAG}
                docker rmi ${repoHost}/${repoNs}/${JOB_NAME}:${IMAGE_TAG}'''
            }
        }
        // 上传pipeline.yml文件
        stage('upload yaml to k8s') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/test-app', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'PROJECT_NAME.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }

        // 修改yaml文件中镜像版本为自定生成的版本号
        stage('set docker image tag') {
            steps {
                sh 'ssh root@172.16.1.232 sed -i s/IMAGE_TAG/${IMAGE_TAG}/ /home/test-app/${JOB_NAME}.yaml'
            }
        }

        // 远程执行kubectl命令
        stage('publish') {
            steps {
                sh 'ssh root@172.16.1.232 kubectl apply -f /home/test-app/${JOB_NAME}.yaml'
            }
        }
    }
    post {
        success {
            dingtalk (
                robot: 'ad_dingding_robot',
                type:'MARKDOWN',
                title: "${JOB_NAME}发布成功",
                text: ["${JOB_NAME}部署结果通知 \n- 构建结果:成功构建\n- 镜像版本:${IMAGE_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:${JOB_NAME}"]
            )
        }
        failure {
            dingtalk (
                robot: 'ad_dingding_robot',
                type:'MARKDOWN',
                title: "${JOB_NAME}发布失败",
                text: ["${JOB_NAME}部署结果通知\n- 构建结果:构建失败 \n- 镜像版本:${IMAGE_TAG}\n- 持续时间:${currentBuild.durationString}\n- 任务:${JOB_NAME}"]
            )
        }
    }
}
  • 根据项目修改以下几点
    • 拉取代码区域:根据自己的Gitlab代码地址修改url的值
    • 上传pipeline.yml文件区域:修改PROJECT_NAME为你的项目名称,最终和k8s yaml文件名称保持一致
    • 如当前项目是某个学校,需要提前创建好名称空间,替换当前文件中test-app为新的名称空间名称

k8s yaml

  • 在项目根目录中创建PROJECT_NAME.yaml文件,PROJECT_NAME修改为项目名称
  • 内容先复制如下内容
yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metainfo:
  labels:
    k8s.kuboard.cn/layer: web
    k8s.kuboard.cn/name: PROJECT_NAME
  name: PROJECT_NAME
  namespace: test-app
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s.kuboard.cn/layer: web
      k8s.kuboard.cn/name: PROJECT_NAME
  template:
    metainfo:
      labels:
        k8s.kuboard.cn/layer: web
        k8s.kuboard.cn/name: PROJECT_NAME
    spec:
      containers:
        - image: registry-dev.hangzhou.net/test/PROJECT_NAME:IMAGE_TAG
          imagePullPolicy: Always
          name: PROJECT_NAME
          ports:
            - containerPort: 17003
              name: web
              protocol: TCP
          resources:
            limits:
              memory: 500Mi
            requests:
              memory: 200Mi
      restartPolicy: Always
      imagePullSecrets:
        - name: zyharbor
---
apiVersion: v1
kind: Service
metainfo:
  labels:
    k8s.kuboard.cn/layer: web
    k8s.kuboard.cn/name: PROJECT_NAME
  name: PROJECT_NAME
  namespace: test-app
spec:
  ports:
    - name: web
      port: 17003
      protocol: TCP
      targetPort: 17003
  selector:
    k8s.kuboard.cn/layer: web
    k8s.kuboard.cn/name: PROJECT_NAME
  type: NodePort
  • 根据项目修改以下几点
    • 将所有的PROJECT_NAME修改为当前项目名称
    • 如当前项目是某个学校,需要提前创建好名称空间,替换当前文件中test-app为新的名称空间名称

2.创建Jenkins Job

  • 进入Jenkins
arduino 复制代码
地址:http://172.16.1.247:8080
账号:admin
密码:admin123
  • 选择指定组织视图,如果无可创建视图,再点击左上角+新建任务
  • 任务名称输入项目名称
  • 选择流水线类型
  • 复制输入框输入test-authority-web,会出现一个下拉框选择出现的test-authority-web
  • 点击OK按钮保存,然后进入配置页
  • 点击左侧流水线,定位到配置仓库位置,修改Repository URL的值为当前项目的Git地址
  • 脚本路径输入框修改为Jenkinsfile值即可
  • 点击应用、保存

3.测试应用部署

  • 在刚创建的任务里,点击Build with Parameters,进入构建页面,继续点击开始构建即可
  • 在左边下发的Build History会出现一个进行中的构建,点击可查看具体日志
  • 构建成功后,访问K8Shttp://172.16.1.232/(admin/Gj@CbYJihcI#5igy)
  • 侧边栏找到名称空间-选择并点击,点击test-app名称空间
  • 侧边栏找到应用程序-工作负载并点击在列表中找到刚刚部署的应用,点击名称进入详情页
  • 然后点击顶部栏的服务,具体端口如图所示
  • 通过172.16.1.232:PORT再拼接上接口的详情地址即可访问
  • 部署完成

三、设置Webhooks自动构建

1.Jenkins开启Webhooks

  • 找到构建触发器Build when a change is pushed to GitLab. GitLab webhook URL: http://172.16.1.247:8080/project/xxx并勾选(同时把URL复制放到文本编辑器中留存)
  • 勾选后会有展开内容,在展开内容最后点击高级...按钮,
  • 找到Secret token输入框,点击输入框右下角的Generate,在输入框中会出现一个字符串,把字符串复制到文本编辑器中留存
  • 点击保存

2.Gitlab配置Webhooks

  • 进入Gitlab项目中,找到设置-Webhooks
  • 把之前复制的URL粘贴到网址输入框
  • 把之前复制的Secret token值粘贴到Secret token输入框
  • 推送事件数据库输入监听的分支名称,如:dev
  • 取消勾选SSL验证
  • 点击Add webhook进行保存

3.验证

在Gitlab中设置-Webhooks中最下方的Project Hooks区域,点击测试-Push-event,然后前往Jenkins中查看Job是否自动创建。

相关推荐
易协同低代码17 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo17 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志17 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..18 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects18 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰18 小时前
一些基础和问题解决
后端
陈随易18 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN18 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana18 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端
学渣超18 小时前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构