通过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是否自动创建。

相关推荐
m0_748235951 小时前
Spring Boot问题总结
java·spring boot·后端
brhhh_sehe1 小时前
Spring Boot 热部署
java·spring boot·后端
在线打码2 小时前
SpringBoot接口自动化测试实战:从OpenAPI到压力测试全解析
spring boot·后端·功能测试·压力测试·postman
m0_748233883 小时前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis
一个热爱生活的普通人3 小时前
深入解析Go语言Channel的底层实现与高效使用实践
后端·go
Victor3563 小时前
Zookeeper(78)Zookeeper的性能优化有哪些方法?
后端
不懂904 小时前
Spring Boot集成Jetty、Tomcat或Undertow及支持HTTP/2协议
spring boot·后端·http·https
总是学不会.5 小时前
从“记住我”到 Web 认证:Cookie、JWT 和 Session 的故事
java·前端·后端·开发
Neozsvc5 小时前
飞书工单审批对接腾讯电子签:开启合同流程自动化新时代
运维·人工智能·后端·自动化·飞书
℡52Hz★6 小时前
利用node.js搭配express框架写后端接口(一)
后端·node.js·express