一、简介

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. 与AMD合并后,赛灵思与英特尔、英伟达在数据中心市场呈“三足鼎立”之势
  2. 设计一款编程语言有多难?
  3. 动漫人物VS编程语言
  4. c++连连看游戏_用Python玩连连看是什么效果?
  5. 实事求实来看综合布线网络
  6. 【c++算法】变动性算法
  7. 895计算机专业基础,2017北京工业大学895计算机学科专业基础考研入学考试大纲...
  8. Fantastical 2如何编辑事件?
  9. 架构-LAMP特级学习(网站加速解决方案)
  10. save与persist差别
  11. JSTL迭代操作--c:forEach,c:forTokens
  12. 动易CMS - 模板的一些常用标签
  13. 高等数学学习笔记——第十讲——子数列与聚点原理(1. 数列收敛的归并性)
  14. FinalData使用方法
  15. 深入了解 Squid 代理服务器及应用
  16. 佳能无线打印机服务器,佳能LBP6018W打印机WIFI无线打印心得分享
  17. Go学习笔记 -- 异常处理
  18. 乡村振兴公益基金启动暨古茶树非遗保护公益行发布
  19. Python——图片与视频互转(亲测有效)
  20. 傻瓜式使用SpringSecurity完成前后端分离+JWT+登录认证+权限控制

热门文章

  1. 如何在PC中升级和安装新的图形卡
  2. Java虚拟机(JVM)的类加载机制LLI
  3. K8S部署DevOps
  4. java日期计算天数_用Java计算两个日期之间的天数
  5. 蓝凌OA系统任意文件读取
  6. 实习--广东电信有限公司汕头市分公司讲座
  7. Solr之Facet与FacetPivot的使用和区别
  8. SpatialTE:从空间转录组数据集分析转座因子表达的工具
  9. Volatility3安装
  10. python 录屏_python实现录制全屏和选择区域录屏功能