通过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 [email protected]

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 [email protected] sed -i s/IMAGE_TAG/${IMAGE_TAG}/ /home/test-app/${JOB_NAME}.yaml'
            }
        }

        // 远程执行kubectl命令
        stage('publish') {
            steps {
                sh 'ssh [email protected] 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 [email protected] sed -i s/IMAGE_TAG/${IMAGE_TAG}/ /home/test-app/${JOB_NAME}.yaml'
            }
        }

        // 远程执行kubectl命令
        stage('publish') {
            steps {
                sh 'ssh [email protected] 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是否自动创建。

相关推荐
程序员爱钓鱼4 小时前
匿名函数与闭包(Anonymous Functions and Closures)-《Go语言实战指南》原创
后端·golang
言之。6 小时前
Go 语言中接口类型转换为具体类型
开发语言·后端·golang
diving deep6 小时前
XML简要介绍
xml·java·后端
编程乐学(Arfan开发工程师)8 小时前
06、基础入门-SpringBoot-依赖管理特性
android·spring boot·后端
编程乐学(Arfan开发工程师)8 小时前
05、基础入门-SpringBoot-HelloWorld
java·spring boot·后端
橘子海全栈攻城狮8 小时前
【源码+文档+调试讲解】党员之家服务系统小程序1
java·开发语言·spring boot·后端·小程序·旅游
冼紫菜9 小时前
Java开发中使用 RabbitMQ 入门到进阶详解(含注解方式、JSON配置)
java·spring boot·后端·rabbitmq·springcloud
boring_1119 小时前
Apache Pulsar 消息、流、存储的融合
分布式·后端
源码方舟11 小时前
SpringBoot + Shiro + JWT 实现认证与授权完整方案实现
java·spring boot·后端
热河暖男15 小时前
【实战解决方案】Spring Boot+Redisson构建高并发Excel导出服务,彻底解决系统阻塞难题
spring boot·后端·excel