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

相关推荐
摇滚侠4 小时前
Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
spring boot·笔记·后端
程序员小凯6 小时前
Spring Boot测试框架详解
java·spring boot·后端
你的人类朋友7 小时前
什么是断言?
前端·后端·安全
程序员小凯8 小时前
Spring Boot缓存机制详解
spring boot·后端·缓存
i学长的猫8 小时前
Ruby on Rails 从0 开始入门到进阶到高级 - 10分钟速通版
后端·ruby on rails·ruby
用户21411832636029 小时前
别再为 Claude 付费!Codex + 免费模型 + cc-switch,多场景 AI 编程全搞定
后端
茯苓gao9 小时前
Django网站开发记录(一)配置Mniconda,Python虚拟环境,配置Django
后端·python·django
Cherry Zack9 小时前
Django视图进阶:快捷函数、装饰器与请求响应
后端·python·django
爱读源码的大都督9 小时前
为什么有了HTTP,还需要gPRC?
java·后端·架构
码事漫谈9 小时前
致软件新手的第一个项目指南:阶段、文档与破局之道
后端