目录
一、简介二、代码三、monitor监控服务流水线(先推送一个服务把整个流程走完)3.1 创建流水线3.2 拉取代码3.3 项目编译3.4 构建镜像3.5 推送镜像仓库3.6 monitor部署k8s3.7 邮件通知四、monitor监控服务部署成功五、部署所有微服务构建镜像推送镜像部署k8s六、前端项目流水线代码修改deployDockerfile附录前端项目Jenkinsfilemonitor服务Jenkinsfile文件所有微服务Jenkinsfiel文件deploy.yml k8s部署文件一、简介
在前面的学习中,我们已经通过手动的打包、制作镜像、推送镜像仓库、部署k8s的形式完成了对RuoYICloud项目的部署:/DreamsArchitects/article/details/121121109
但是这种方式过于复杂繁琐。现在我们来学习一下通过流水线来自动化部署RuoYICloud项目。
前提需要部署好MySQL、Nacos、Redis 服务。
Nacos 上云部署
完整流程:
拉取代码项目编译制作镜像推送镜像仓库k8s部署邮件通知
二、代码
三、monitor监控服务流水线(先推送一个服务把整个流程走完)
先推送一个服务把整个流程走完
3.1 创建流水线
3.2 拉取代码
3.3 项目编译
3.4 构建镜像
3.5 推送镜像仓库
需要创建镜像仓库凭证
3.6 monitor部署k8s
需要指定Kubeconfig
3.7 邮件通知
以QQ邮箱为例:
点击 如何设置:http://service./cgi-bin/help?subtype=1&&id=28&&no=369
为 KubeSphere 流水线设置电子邮件服务器:
编辑配置文件:
收到的邮件没有动态取值$BUILD_NUMBER
。
我们需要修改body:
将单引号修改为双引号:
四、monitor监控服务部署成功
查看容器运行日志:
五、部署所有微服务
需要在构建镜像、推送镜像、部署k8s时候添加并行阶段
。
构建镜像
推送镜像
部署k8s
六、前端项目流水线
流程与后端微服务部署是一样的:
拉取代码项目编译构建镜像推送镜像部署k8s邮件通知
注意 在前端项目执行流水线时我们需要指定nodejs
容器,不是maven
容器。
KubeSphere 的 内置四种容器模板
代码修改
deploy
在ruoyi-ui
目录下创建deploy
目录,创建deploy.yml
文件
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: ruoyi-uiname: ruoyi-uinamespace: ruoyi #一定要写名称空间spec:progressDeadlineSeconds: 600replicas: 1selector:matchLabels:app: ruoyi-uistrategy:rollingUpdate:maxSurge: 50%maxUnavailable: 50%type: RollingUpdatetemplate:metadata:labels:app: ruoyi-uispec:imagePullSecrets:- name: aliyun-docker-hub #提前在项目下配置访问阿里云的账号密码containers:- image: $REGISTRY/$ALIYUNHUB_NAMESPACE/ruoyi-ui:SNAPSHOT-$BUILD_NUMBER# readinessProbe:# httpGet:# path: /actuator/health# port: 8080# timeoutSeconds: 10# failureThreshold: 30# periodSeconds: 5imagePullPolicy: Alwaysname: app# 前端的端口为80 不是8080ports:- containerPort: 80protocol: TCPresources:limits:cpu: 300mmemory: 600MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysterminationGracePeriodSeconds: 30---apiVersion: v1kind: Servicemetadata:labels:app: ruoyi-uiname: ruoyi-uinamespace: ruoyispec:ports:- name: http# Service 暴露 80 端口port: 80protocol: TCPtargetPort: 80nodePort: 32248selector:app: ruoyi-uisessionAffinity: Nonetype: NodePort
Dockerfile
在ruoyi-ui
目录下创建Dockerfile
文件。
Dockerfile
文件的内容是基于nginx
镜像 复制编译后的dist
文件夹下的文件到容器内的/usr/share/nginx/html/
目录,最后暴露80
端口。
FROM nginx#将dist目录内容复制到nginx容器html内部COPY dist /usr/share/nginx/html/EXPOSE 80
附录
前端项目Jenkinsfile
pipeline {agent {node {label 'nodejs'}}stages {stage('拉取代码') {agent nonesteps {container('nodejs') {git(url: '/L1692312138/RuoYi-Cloud.git', credentialsId: 'gitee-lsh', branch: 'master', changelog: true, poll: false)sh 'ls -al ruoyi-ui/'}}}stage('项目编译') {agent nonesteps {container('nodejs') {sh 'npm i node-sass --sass_binary_site=/mirrors/node-sass/'sh 'npm install --registry=https://registry.'sh 'cd ruoyi-ui/'sh 'npm run build 'sh '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 : 'aliyun-docker-registry' ,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')}}stage('邮件确认') {agent nonesteps {mail(to: 'liushihao1210@', subject: 'RuoyiCloud流水线执行结果', body: 'RuoyiCloud UI DevOps流水线 第 "$BUILD_NUMBER" 次 执行成功! ', cc: '827875054@')}}}environment {DOCKER_CREDENTIAL_ID = 'dockerhub-id'GITHUB_CREDENTIAL_ID = 'github-id'KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'REGISTRY = '-'DOCKERHUB_NAMESPACE = 'lsh_k8s_repository'ALIYUNHUB_NAMESPACE = 'lsh_k8s_repository'GITHUB_ACCOUNT = 'kubesphere'APP_NAME = 'devops-java-sample'}}
monitor服务Jenkinsfile文件
pipeline {agent {node {label 'maven'}}stages {stage('拉取代码') {agent nonesteps {container('maven') {git(url: '/L1692312138/RuoYi-Cloud.git', credentialsId: 'gitee-lsh-monitor', branch: 'master', changelog: true, poll: false)sh 'ls -al'}}}stage('项目编译') {agent nonesteps {container('maven') {sh 'mvn clean package -Dmaven.test.skip=true'sh 'ls -al'}}}stage('构建monitor镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-visual/ruoyi-monitor/target/'sh 'docker build -t ruoyi-monitor:latest -f ruoyi-visual/ruoyi-monitor/Dockerfile ./ruoyi-visual/ruoyi-monitor/'}}}stage('推送monitor镜像') {agent nonesteps {container('maven') {withCredentials([usernamePassword(credentialsId : 'aliyun-repository' ,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-monitor:latest $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-monitor:SNAPSHOT-$BUILD_NUMBER'sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-monitor:SNAPSHOT-$BUILD_NUMBER'}}}}stage('monitor部署k8s') {agent nonesteps {kubernetesDeploy(enableConfigSubstitution: true, deleteResource: false, kubeconfigId: 'demo-kubeconfig', configs: 'ruoyi-visual/ruoyi-monitor/deploy/**')}}stage('邮件确认') {agent nonesteps {mail(to: 'liushihao1210@', subject: 'RuoyiCloud流水线执行结果', body: "RuoyiCloud Monitor服务 DevOps流水线 第 $BUILD_NUMBER 次 执行成功!", cc: '827875054@')}}}environment {DOCKER_CREDENTIAL_ID = 'dockerhub-id'GITHUB_CREDENTIAL_ID = 'github-id'KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'REGISTRY = '-'DOCKERHUB_NAMESPACE = 'lsh_k8s_repository'ALIYUNHUB_NAMESPACE = 'lsh_k8s_repository'GITHUB_ACCOUNT = 'kubesphere'APP_NAME = 'devops-java-sample'}parameters {string(name: 'TAG_NAME', defaultValue: '', description: '')}}
所有微服务Jenkinsfiel文件
pipeline {agent {node {label 'maven'}}stages {stage('拉取代码') {agent nonesteps {container('maven') {git(url: '/L1692312138/RuoYi-Cloud.git', credentialsId: 'gitee-lsh-monitor', branch: 'master', changelog: true, poll: false)sh 'ls -al'}}}stage('项目编译') {agent nonesteps {container('maven') {sh 'mvn clean package -Dmaven.test.skip=true'sh 'ls -al'}}}stage('构建monitor镜像') {agent nonesteps {container('maven') {sh 'ls -l ruoyi-visual/ruoyi-monitor/target/'sh 'docker build -t ruoyi-monitor:latest -f ruoyi-visual/ruoyi-monitor/Dockerfile ./ruoyi-visual/ruoyi-monitor/'}}}stage('推送monitor镜像') {agent nonesteps {container('maven') {withCredentials([usernamePassword(credentialsId : 'aliyun-repository' ,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-monitor:latest $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-monitor:SNAPSHOT-$BUILD_NUMBER'sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/ruoyi-monitor:SNAPSHOT-$BUILD_NUMBER'}}}}stage('monitor部署k8s') {agent nonesteps {kubernetesDeploy(enableConfigSubstitution: true, deleteResource: false, kubeconfigId: 'demo-kubeconfig', configs: 'ruoyi-visual/ruoyi-monitor/deploy/**')}}stage('邮件确认') {agent nonesteps {mail(to: 'liushihao1210@', subject: 'RuoyiCloud流水线执行结果', body: "RuoyiCloud Monitor服务 DevOps流水线 第 $BUILD_NUMBER 次 执行成功!", cc: '827875054@')}}}environment {DOCKER_CREDENTIAL_ID = 'dockerhub-id'GITHUB_CREDENTIAL_ID = 'github-id'KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'REGISTRY = '-'DOCKERHUB_NAMESPACE = 'lsh_k8s_repository'ALIYUNHUB_NAMESPACE = 'lsh_k8s_repository'GITHUB_ACCOUNT = 'kubesphere'APP_NAME = 'devops-java-sample'}parameters {string(name: 'TAG_NAME', defaultValue: '', description: '')}}
deploy.yml k8s部署文件
注意创建名称空间
,及修改app、name及拉取的镜像名称。
还需要注意拉取镜像时候使用的镜像仓库的凭证imagePullSecrets
。
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: ruoyi-monitorname: ruoyi-monitornamespace: ruoyi #一定要写名称空间spec:progressDeadlineSeconds: 600replicas: 1selector:matchLabels:app: ruoyi-monitorstrategy:rollingUpdate:maxSurge: 50%maxUnavailable: 50%type: RollingUpdatetemplate:metadata:labels:app: ruoyi-monitorspec:imagePullSecrets:- name: aliyun-docker-hub #提前在项目下配置访问阿里云的账号密码containers:- image: $REGISTRY/$ALIYUNHUB_NAMESPACE/ruoyi-monitor:SNAPSHOT-$BUILD_NUMBER# readinessProbe:# httpGet:# path: /actuator/health# port: 8080# timeoutSeconds: 10# failureThreshold: 30# periodSeconds: 5imagePullPolicy: Alwaysname: appports:- containerPort: 8080protocol: TCPresources:limits:cpu: 300mmemory: 600MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysterminationGracePeriodSeconds: 30---apiVersion: v1kind: Servicemetadata:labels:app: ruoyi-monitorname: ruoyi-monitornamespace: ruoyispec:ports:- name: httpport: 8080protocol: TCPtargetPort: 8080#使用NodePort方式暴露端口 固定端口#nodePort: 30887selector:app: ruoyi-monitorsessionAffinity: Nonetype: ClusterIP# type: NodePort
如果觉得《云原生Java架构师——KubeSphere DevOps流水线部署RuoyiCloud》对你有帮助,请点赞、收藏,并留下你的观点哦!