一、简介

DevOps (Development和Operations的组合词)是一系列做法和工具,可以使 IT 和软件开发团队之间的流程实现自动化。其中,随着敏捷软件开发日趋流行,持续集成 (CI) 和持续交付 (CD) 已经成为该领域一个理想的解决方案。在 CI/CD 工作流中,每次集成都通过自动化构建来验证,包括编码、发布和测试,从而帮助开发者提前发现集成错误,团队也可以快速、安全、可靠地将内部软件交付到生产环境。

我们借助KubeSphere来学习DevOps:KubeSphere DevOps 系统

步骤如下:

  1. 拉取代码
  2. 项目编译
  3. 构建镜像
  4. 推送镜像仓库
  5. 部署k8s

二、首先创建一个devops工程以及流水线

1、创建流水线工程

2、创建流水线

3、 编辑流水线

 选择上面的流水线模板:

上面的模板我们需要自定义,主要分为如下几个步骤:

  1. 拉取代码
  2. 项目编译
  3. 构建镜像
  4. 推送镜像仓库
  5. 部署k8s


三、开始定义流水线之拉取代码

1、编写第一个拉取代码的步骤

点击添加步骤:

可以参考kubesphere的官网,可供选择的有4个容器:

 

点击添加嵌套步骤主要是用来拉取代码:

 

 

下面我们再加一个嵌套步骤,用来看拉取代码是否成功:

点击确认:

点击保存:

下面我们点击运行,看看第一步拉取代码是否成功:

 点击进去:

发现失败了,可以查看日志:

重新编辑流水线,将容器换成maven:

点击运行,查看日志,第一步代码已经拉取成功:


四、开始定义流水线之项目编译

1、开始编写项目编译步骤

2、先指定容器为maven

 

3、添加嵌套命令ls,确定代码

4、再次添加嵌套的shell命令用来打包项目代码

mvn clean package -Dmaven.skip.test=true 

5、点击确定保存,运行流水线

注意:
在使用mvn clean pacgage Dmaven.test.skip=true 命令进行编译打包时,Maven会从中央仓库去下载依赖,这样速度会很慢,我们需要修改Maven的配置文件ks-devops-agent,修改为阿里云的,注意这个要使用admin账户登录,选择集群管理

下面我们重新运行看看速度:

可以发现是从阿里云下载的依赖了


五、开始定义流水线之构建镜像

1、开始编写构建镜像命令,下面我们以ruoyi-auth服务为例,指定容器

2、添加嵌套步骤,查看编译好的代码结构

我们先运行看一下:

3、下面根据上面的目录编写生成镜像的命令

点击保存

4、下面我们点击运行测试一下

由上可知,编译镜像成功!

5、下面我们把后端其他的镜像也一起构建,我们使用并行的方式

点击添加并行阶段:

 可以发现上面一个一个添加太慢了,我们直接编辑Jenkinsfile文件:

我们直接找到这部分进行修改,具体内容如下:

pipeline {agent {node {label 'maven'}}stages {stage('拉取代码') {agent nonesteps {container('maven') {git(url: 'https://gitee.com/kgf897570/ruoyi-cloud.git', branch: 'master', credentialsId: 'ruoyi-cloud-gitee', changelog: true, poll: false)sh 'ls'}}}stage('项目编译') {agent nonesteps {container('maven') {sh 'ls'sh 'mvn clean package -Dmaven.skip.test=true'sh 'ls'}}}stage('default-2') {parallel {stage('构建ruoyi-auth镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-auth 'sh 'docker build -t ruoyi-auth:latest -f ruoyi-auth/Dockerfile ./ruoyi-auth/'}}}stage('构建ruoyi-monitor镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-visual/ruoyi-monitor/'sh 'docker build -t ruoyi-monitor:latest -f ruoyi-visual/ruoyi-monitor/Dockerfile ./ruoyi-visual/ruoyi-monitor/'}}}stage('构建ruoyi-gateway镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-gateway/'sh 'docker build -t ruoyi-gateway:latest -f ruoyi-gateway/Dockerfile ./ruoyi-gateway/'}}}stage('构建ruoyi-file镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-modules/ruoyi-file/'sh 'docker build -t ruoyi-file:latest -f ruoyi-modules/ruoyi-file/Dockerfile ./ruoyi-modules/ruoyi-file/'}}}stage('构建ruoyi-job镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-modules/ruoyi-file/'sh 'docker build -t ruoyi-file:latest -f ruoyi-modules/ruoyi-file/Dockerfile ./ruoyi-modules/ruoyi-file/'}}}stage('构建ruoyi-system镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-modules/ruoyi-system/'sh 'docker build -t ruoyi-system:latest -f ruoyi-modules/ruoyi-system/Dockerfile ./ruoyi-modules/ruoyi-system/'}}}}}stage('推送镜像仓库') {when {branch 'master'}steps {container('maven') {sh 'docker tag  $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest 'sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '}}}stage('部署到dev环境') {steps {input(id: 'deploy-to-dev', message: 'deploy to dev?')kubernetesDeploy(configs: 'deploy/dev-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")}}stage('deploy to production') {steps {input(id: 'deploy-to-production', message: 'deploy to production?')kubernetesDeploy(configs: 'deploy/prod-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")}}}environment {DOCKER_CREDENTIAL_ID = 'dockerhub-id'GITHUB_CREDENTIAL_ID = 'github-id'KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'REGISTRY = 'docker.io'DOCKERHUB_NAMESPACE = 'docker_username'GITHUB_ACCOUNT = 'kubesphere'APP_NAME = 'devops-java-sample'}parameters {string(name: 'TAG_NAME', defaultValue: '', description: '')}
}

最后结果如下:

下面我们直接点击运行试一下:

可以发现运行成功


六、开始定义流水线之推送到镜像仓库

1、直接编辑Jenkinsfile文件,在environment定义环境变量,可以直接使用$来引用。

2、创建登录凭证:

 

3、修改推送镜像的Jenkinsfile文件部分

 stage('推送镜像仓库') {agent nonesteps {container('maven') {withCredentials([usernamePassword(credentialsId : 'aliyu-ruoyi' ,passwordVariable : 'DOCKER-PWD-VAR' ,usernameVariable : 'DOCKER-USER-VAR' ,)]) {sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin ' //表示登录到阿里云仓库sh 'docker tag ruoyi-auth:latest $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-auth:SNAPSHOT-$BUILD_NUMBER ' //打上标签sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-auth:SNAPSHOT-$BUILD_NUMBER ' //推送到阿里云仓库}}}}

4、下面我们将环境变量以及推送镜像部分的修改放到流水线的Jenkinsfile中

5、下面我们保存然后运行一下

由上可知登录阿里云仓库以及打版本号都已经成功

推送失败了,没有权限是我们的阿里云凭证搞错了,修改后重新推送:

成功,查看阿里云仓库:

6、上面完整的Jenkinsfile内容如下

pipeline {agent {node {label 'maven'}}stages {stage('拉取代码') {agent nonesteps {container('maven') {git(url: 'https://gitee.com/kgf897570/ruoyi-cloud.git', branch: 'master', credentialsId: 'ruoyi-cloud-gitee', changelog: true, poll: false)sh 'ls'}}}stage('项目编译') {agent nonesteps {container('maven') {sh 'ls'sh 'mvn clean package -Dmaven.skip.test=true'sh 'ls'}}}stage('default-2') {parallel {stage('构建ruoyi-auth镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-auth 'sh 'docker build -t ruoyi-auth:latest -f ruoyi-auth/Dockerfile ./ruoyi-auth/'}}}stage('构建ruoyi-monitor镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-visual/ruoyi-monitor/'sh 'docker build -t ruoyi-monitor:latest -f ruoyi-visual/ruoyi-monitor/Dockerfile ./ruoyi-visual/ruoyi-monitor/'}}}stage('构建ruoyi-gateway镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-gateway/'sh 'docker build -t ruoyi-gateway:latest -f ruoyi-gateway/Dockerfile ./ruoyi-gateway/'}}}stage('构建ruoyi-file镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-modules/ruoyi-file/'sh 'docker build -t ruoyi-file:latest -f ruoyi-modules/ruoyi-file/Dockerfile ./ruoyi-modules/ruoyi-file/'}}}stage('构建ruoyi-job镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-modules/ruoyi-file/'sh 'docker build -t ruoyi-file:latest -f ruoyi-modules/ruoyi-file/Dockerfile ./ruoyi-modules/ruoyi-file/'}}}stage('构建ruoyi-system镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-modules/ruoyi-system/'sh 'docker build -t ruoyi-system:latest -f ruoyi-modules/ruoyi-system/Dockerfile ./ruoyi-modules/ruoyi-system/'}}}}}stage('推送镜像仓库') {agent nonesteps {container('maven') {withCredentials([usernamePassword(credentialsId : 'aliyu-ruoyi' ,passwordVariable : 'DOCKER_PWD_VAR' ,usernameVariable : 'DOCKER_USER_VAR' ,)]) {sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin 'sh 'docker tag ruoyi-auth:latest $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-auth:SNAPSHOT-$BUILD_NUMBER 'sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-auth:SNAPSHOT-$BUILD_NUMBER '}}}}stage('部署到dev环境') {steps {input(id: 'deploy-to-dev', message: 'deploy to dev?')kubernetesDeploy(configs: 'deploy/dev-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")}}stage('deploy to production') {steps {input(id: 'deploy-to-production', message: 'deploy to production?')kubernetesDeploy(configs: 'deploy/prod-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")}}}environment {DOCKER_CREDENTIAL_ID = 'dockerhub-id'GITHUB_CREDENTIAL_ID = 'github-id'KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'REGISTRY = 'registry.cn-zhangjiakou.aliyuncs.com'DOCKERHUB_NAMESPACE = 'kgf-ruoyi'GITHUB_ACCOUNT = 'kubesphere'APP_NAME = 'devops-java-sample'}parameters {string(name: 'TAG_NAME', defaultValue: '', description: '')}
}

7、创建并行推送镜像到阿里云仓库

先创建一个并行的模板:

 然后将Jenkinsfile的内容拷贝出来进行手动修改:

开始将我们所有的后台服务都进行编写推送:

​​​​​​​

点击运行测试推送:

由上可知推送成功,我们去仓库查看:

下面开始部署项目


六、开始定义流水线之部署项目到k8s

1、编写流水线步骤

 

上面的就是凭证ID名称的来源,要保持一致

2、给每个微服务准备一个deployment.yml文件:

yaml文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: ruoyi-authname: ruoyi-authnamespace: ormis   #一定要写名称空间
spec:progressDeadlineSeconds: 600replicas: 1selector:matchLabels:app: ruoyi-authstrategy:rollingUpdate:maxSurge: 50%maxUnavailable: 50%type: RollingUpdatetemplate:metadata:labels:app: ruoyi-authspec:imagePullSecrets:- name: kgf-aliyun-hub  #提前在项目下配置访问阿里云的账号密码containers:- image: $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-auth:SNAPSHOT-$BUILD_NUMBERimagePullPolicy: Alwaysname: ruoyi-authports:- containerPort: 8080protocol: TCPresources:limits:cpu: 300mmemory: 600MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysterminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:labels:app: ruoyi-authname: ruoyi-authnamespace: ormis
spec:ports:- name: httpport: 8080protocol: TCPtargetPort: 8080selector:app: ruoyi-authsessionAffinity: Nonetype: ClusterIP

上面的kgf-aliyun-hub凭证要提前在项目中建好:

3、下面我们运行流水线测试一下看看是否可以部署成功

修改一下Jenkinsfile文件:

再次部署:

成功,下面到项目中看一下:

4、下面我们将其他几个服务创建并行部署

我们先简单创建一个模板:

直接编辑Jenkinsfile文件:

 

5、点击运行测试

后端全部部署成功!


七、开始定义流水线之部署前端项目到k8s

1、创建前端服务的流水线

 如果指定路径下存在Jenkinsfile,将会为我们自动创建流水线

2、查看应用负载

创建一个对外的svc

访问:

访问成功:

3、前端用到的相关配置文件

3.1、deploy.yaml

内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: ruoyi-uiname: ruoyi-uinamespace: ormis   #一定要写名称空间
spec:progressDeadlineSeconds: 600replicas: 1selector:matchLabels:app: ruoyi-uistrategy:rollingUpdate:maxSurge: 50%maxUnavailable: 50%type: RollingUpdatetemplate:metadata:labels:app: ruoyi-uispec:imagePullSecrets:- name: kgf-aliyun-hub  #提前在项目下配置访问阿里云的账号密码containers:- image: $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-ui:SNAPSHOT-$BUILD_NUMBERimagePullPolicy: Alwaysname: ruoyi-uiports:- containerPort: 8080protocol: TCPresources:limits:cpu: 300mmemory: 600MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysterminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:labels:app: ruoyi-uiname: ruoyi-uinamespace: ormis
spec:ports:- name: httpport: 8080protocol: TCPtargetPort: 8080selector:app: ruoyi-uisessionAffinity: Nonetype: ClusterIP

3.2、Jenkinsfile文件

内容如下:

pipeline {agent {node {label 'nodejs'}}stages {stage('拉取代码') {agent nonesteps {container('nodejs') {git(url: 'https://gitee.com/kgf897570/ruoyi-cloud.git', credentialsId: 'ruoyi-cloud-gitee', branch: 'master', changelog: true, poll: false)sh 'ls -al ruoyi-ui/'}}}stage('项目编译') {agent nonesteps {container('nodejs') {sh 'ls -l'sh 'cd ruoyi-ui/ && ls -al'sh 'cd ruoyi-ui/ && npm install --registry=https://registry.npm.taobao.org'sh 'cd ruoyi-ui/ && ls -al && npm run build:prod'sh 'cd ruoyi-ui/ && ls -al'}}}stage('构建镜像') {agent nonesteps {container('nodejs') {sh 'ls'sh 'docker build -t ruoyi-ui:latest -f ruoyi-ui/Dockerfile  ./ruoyi-ui'}}}stage('推送镜像') {agent nonesteps {container('nodejs') {withCredentials([usernamePassword(credentialsId : 'aliyu-ruoyi' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'sh 'docker tag ruoyi-ui:latest $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-ui:SNAPSHOT-$BUILD_NUMBER'sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-ui:SNAPSHOT-$BUILD_NUMBER'}}}}stage('部署到dev环境') {agent nonesteps {kubernetesDeploy(configs: 'ruoyi-ui/deploy/**', enableConfigSubstitution: true, kubeconfigId: 'demo-kubeconfig')}}}environment {DOCKER_CREDENTIAL_ID = 'dockerhub-id'GITHUB_CREDENTIAL_ID = 'github-id'KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'REGISTRY = 'registry.cn-zhangjiakou.aliyuncs.com'DOCKERHUB_NAMESPACE = 'kgf-ruoyi'ALIYUNHUB_NAMESPACE = 'kgf-ruoyi'GITHUB_ACCOUNT = 'kubesphere'APP_NAME = 'devops-java-sample'}
}

3.3、Dockerfile文件

内容如下:

# 基础镜像
FROM nginx
# author
MAINTAINER ruoyi# 挂载目录
VOLUME /home/ruoyi/projects/ruoyi-ui
# 创建目录
RUN mkdir -p /home/ruoyi/projects/ruoyi-ui
# 指定路径
WORKDIR /home/ruoyi/projects/ruoyi-ui
# 复制conf文件到路径
COPY ./nginx/conf/nginx.conf /etc/nginx/nginx.conf
# 复制html文件到路径
COPY ./dist /home/ruoyi/projects/ruoyi-ui

3.4、nginx.conf文件

内容如下:

worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  _;location / {root   /home/ruoyi/projects/ruoyi-ui;try_files $uri $uri/ /index.html;index  index.html index.htm;}location /prod-api/{proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://ruoyi-gateway-svc.ormis:8080/;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}# requirepass 123456

云原生KubeSphere DevOps流水线部署RuoyiCloud相关推荐

  1. 云原生Java架构师——KubeSphere DevOps流水线部署RuoyiCloud

    目录 一.简介 二.代码 三.monitor监控服务流水线(先推送一个服务把整个流程走完) 3.1 创建流水线 3.2 拉取代码 3.3 项目编译 3.4 构建镜像 3.5 推送镜像仓库 3.6 mo ...

  2. KubeSphere DevOps流水线部署

    文章目录 一. 安装 1.1 下载yaml 1.2 设置默认StorageClass 1.3 安装 1.4 配置 1.5 查看 1.6 页面 二. 流水线部署 2.1 开启流水线设置 2.1.1 未安 ...

  3. 一键部署dns服务_OpenShift : 通往云原生、DevOps、微服务和Serverless的大门

    新书速递 查尔斯·狄更斯的<双城记>中有句耳熟能详的名言:"这是一个最好的时代,也是一个最坏的时代."作为技术从业者,在这个数字化浪潮和技术变革接连发生的时代,我对这句 ...

  4. 云原生思想 — 云原生的 DevOps

    目录 文章目录 目录 DevOps DevOps 平台 云原生的 DevOps 特征 DevOps DevOps 是一组用于促进开发.测试以及运维人员之间协作的过程.方法和系统的统称. 开发:研发部门 ...

  5. Spinnaker:云原生多云环境持续部署的未来这样玩!

    Gartner的报告指出,到2020年,将有50%的传统老旧应用会以云原生的方式被改造,到2022年,云原生和容器化的普及率将达到75%. 随着2020 KubeCon线上大会的结束,我们发现企业拥抱 ...

  6. 云原生之使用docker部署centos系统测试环境

    云原生之使用docker部署centos系统测试环境 一.检查本地服务器系统版本 二.检查docker版本 三.检查docker状态 四.下载centos镜像 五.创建centos容器 1.运行cne ...

  7. 云原生之使用docker部署qbittorrent

    云原生之使用docker部署qbittorrent 一.qbittorrent介绍 二.检查本地docker状态 三.下载qbittorrent 四.部署qbittorrent 1.创建数据目录 2. ...

  8. 云原生时代的流水线框架 Argo

    作者 | FogDong(才云) 来源 | K8sMeetup社区 头图 | 下载于视觉中国 流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术.本 ...

  9. 云原生之使用Docker部署Dashdot服务器仪表盘

    云原生之使用Docker部署Dashdot服务器仪表盘 一.Dashdot介绍 二.检查本地系统环境 1.检查本地系统版本 2.检查docker状态 3.检查docker版本 三.下载Dashdot镜 ...

  10. 云原生之使用Docker部署webssh工具sshwifty

    云原生之使用Docker部署webssh工具sshwifty 一.sshwifty介绍 1.sshwifty简介 2.shwifty 特点 二.检查本地docker环境 1.检查docker版本 2. ...

最新文章

  1. KPI与OKR的区别
  2. 网络通信:单播、广播、组播
  3. 两年前搭建的网狐系统
  4. Confluence 6 在 Apache 或者系统级别阻止垃圾
  5. C语言编程快速入门黎明,何用C语言模拟键盘输入?
  6. 线性存储(链表存储)
  7. LVS类型的介绍以及LVS的调度方法
  8. 文章自动采集重新组合工具
  9. 亚马逊平板刷机Linux系统,亚马逊平板刷机步骤是什么样的?
  10. 多线程获取豆瓣网页的网络爬虫(Python实现)
  11. js模板引擎template.js的使用
  12. LaTeX错误“Unable to read an entire line---bufsize=200000. Please increase buf_size in texmf.cnf.”
  13. 共享经济开始崩溃,区块链能否再续共享经济神话?
  14. 每单外卖利润不足2毛钱 强行降佣只是饮鸩止渴?
  15. showdown ( markdown解析)
  16. has leaked window com.android.internal.policy.impl.PhoneWindow解决(Dialog.cancel、dismiss、hide区别)
  17. win10浏览器加载很慢_Win10系统打开网页速度很慢的解决办法
  18. One-Stage Visual Grounding之一种快速准确的单阶段视觉定位
  19. SSH密钥登录系统报错Permissions 0644 for ‘xxx‘ re too open
  20. [RK3288][Android6.0] 调试笔记 --- 调试串口的更换

热门文章

  1. 软件测试最容易陷入的28个误区
  2. Docker参数 -i -t 的作用
  3. 青春期发育阶段的测量
  4. Go语言%d,%p,%v等占位符
  5. 考研数学一二重积分常见解题思路
  6. docker的搭建和简单应用
  7. 【蓝凌系统】公式定义:根据某值控制审核人员会审
  8. 美术基础——角色设计
  9. Leetcode面试题22. 链表中倒数第k个节点
  10. 【基于canvas实现雪花飘落】