kubesphere DevOps部署SpringCloud项目

本文详细介绍了如何在Kubesphere环境下,使用Jenkinsfile和Dockerfile进行SpringCloud项目的DevOps部署,包括创建DevOps工程、配置流水线、设置Jenkinsfile中的参数和Dockerfile,以及处理阿里云镜像仓库的账号密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🍑环境说明


🍅部署流程


🧁创建DevOps工程


在这里插入图片描述
在这里插入图片描述

🧁填写流水线信息


在这里插入图片描述
在这里插入图片描述

🧁创建流水线


1 我们编写JenkinsFile
在这里插入图片描述

流水线的部署流程如下图

拉取代码
编译代码
打包镜像
推送镜像
部署应用

🍅部署应用所需脚本


🧁jenkinsfile


因为所有服务都写出来实在太长也不方便观看,故以gateway,admin 两个模块为例,增加其他模块也是亦是相同,复制粘贴即可

pipeline {
    agent {
        node {
            label 'jdk11'
        }

    }
    stages {
        stage('拉取代码') {
            agent none
            steps {
                container('maven') {
                    git(url: '你的代码地址', credentialsId: 'git-code-auth', branch: '代码分支', changelog: true, poll: false)
                    sh 'ls'
                }

            }
        }

        stage('编译代码') {
            agent none
            steps {
                container('maven') {
                    sh '''ls
pwd
java -version'''
                    sh 'mvn clean install -Dmaven.test.skip=true'
                }

            }
        }

        stage('default-2') {
            parallel {
                stage('构建镜像gateway') {
                    agent none
                    steps {
                        container('maven') {
                            sh 'ls $GATEWAY/target'
                            sh 'docker build -t $GATEWAY:latest -f $GATEWAY/Dockerfile ./$GATEWAY/'
                        }

                    }
                }

                stage('构建镜像tingyuan-cloud-api-admin') {
                    agent none
                    steps {
                        container('maven') {
                            sh 'ls $BASE_PATH/$ADMIN/target'
                            sh 'docker build -t $ADMIN:latest -f $BASE_PATH/$ADMIN/Dockerfile ./$BASE_PATH/$ADMIN/'
                        }

                    }
                }

            }
        }

        stage('default-3') {
            parallel {
                stage('推送镜像gateway') {
                    agent none
                    steps {
                        container('maven') {
                            withCredentials([usernamePassword(credentialsId: 'aliyun-docker', passwordVariable: 'DOCKER_PASSWORD_VAR', usernameVariable: 'DOCKER_USER_VAR',)]) {
                                sh 'echo "$DOCKER_PASSWORD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                                sh 'docker tag $GATEWAY:latest $REGISTRY/$DOCKERHUB_NAMESPACE/$GATEWAY:SNAPSHOT-$BUILD_NUMBER'
                                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$GATEWAY:SNAPSHOT-$BUILD_NUMBER'
                            }

                        }

                    }
                }

                stage('推送镜像admin') {
                    agent none
                    steps {
                        container('maven') {
                            withCredentials([usernamePassword(credentialsId: 'aliyun-docker', passwordVariable: 'DOCKER_PASSWORD_VAR', usernameVariable: 'DOCKER_USER_VAR',)]) {
                                sh 'echo "$DOCKER_PASSWORD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                                sh 'docker tag $ADMIN:latest $REGISTRY/$DOCKERHUB_NAMESPACE/$ADMIN:SNAPSHOT-$BUILD_NUMBER'
                                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$ADMIN:SNAPSHOT-$BUILD_NUMBER'
                            }

                        }

                    }
                }

            }
        }

        stage('default-4') {
            parallel {
                stage('deploy gateway to pro') {
                    agent none
                    steps {
                        kubernetesDeploy(configs: '文件所在路径/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
                    }
                }

                stage('deploy admin to pro') {
                    agent none
                    steps {
                        kubernetesDeploy(configs: '文件所在路径/deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
                    }
                }
              

            }
        }

    }
    environment {
        DOCKER_CREDENTIAL_ID = 'dockerhub-id'
        GITHUB_CREDENTIAL_ID = 'github-id'
        KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
        REGISTRY = '镜像仓库地址'
        DOCKERHUB_NAMESPACE = '镜像创库nameSpace'
        GITHUB_ACCOUNT = 'kubesphere'
        BASE_PATH = 'api'
        GATEWAY = 'gateway'
        APP = 'app'
        ADMIN = 'admin'
        GUILD = 'guild'
        LANDPAGE = 'landpage'
        SCHEDULE = 'schedule'
        WS = 'ws'
        DB = 'db'
        SERVICE = 'service'
        FILE = 'file'
    }
    parameters {
        string(name: 'TAG_NAME', defaultValue: '', description: '')
    }
}

🧁Dockerfile


打包镜像文件

FROM openjdk:11
LABEL maintainer=hrd
ENV PARAMS="--server.port=8080 --spring.profiles.active=k8sProd"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
COPY target/*.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar app.jar ${PARAMS}"]

🧁deploy.yaml


应用部署文件

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: 容器名
  name: 容器名
  namespace: 名称空间   #一定要写名称空间
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  selector:
    matchLabels:
      app: 容器名
  strategy:
    rollingUpdate:
      maxSurge: 50%
      maxUnavailable: 50%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: 容器名
    spec:
      imagePullSecrets:
        - name: aliyun-docker  #提前在项目下配置访问阿里云的账号密码 
      containers:
        - image: 推送到镜像仓库的地址
          readinessProbe:
            httpGet:
              path: /actuator/health
              port: 8080
            timeoutSeconds: 10
            failureThreshold: 30
            periodSeconds: 5
          imagePullPolicy: Always
          name: app
          ports:
            - name: http-8080
              containerPort: 8080
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: 容器名
  name: 容器名
  namespace: 名称空间
spec:
  ports:
    - name: http
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    app: 容器名
  sessionAffinity: None
  type: ClusterIP

🍅脚本一些参数如何设置说明

🧁deploy.yaml中的:imagePullSecrets:name属性

imagePullSecrets:
        - name: aliyun-docker  #提前在项目下配置访问阿里云的账号密码 

在这里插入图片描述
在这里插入图片描述
选择刚才添加的,添加凭证设置变量
在这里插入图片描述

🧁jenkinsfile中的kubeconfigId: “$KUBECONFIG_CREDENTIAL_ID”

在这里插入图片描述
在这里插入图片描述

🧁jenkinsfile中的git-code-auth属性

在这里插入图片描述

🧁修改maven的setting.xml文件


在这里插入图片描述

设置Docker推送到镜像仓库账号密码(以阿里云镜像仓库为例)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### Spring Cloud 项目打包与部署最佳实践 #### 使用 Maven 生命周期管理父模块 对于 Spring Cloud 项目的打包,采用 Maven 的生命周期来处理整个过程是一个高效的方法。通过配置父 POM 文件中的 `Lifecycle` 来统一管理和控制所有子模块的构建流程[^1]。 ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> ``` #### 子模块中添加特定插件支持 为了确保每个子模块能够独立被打包成可执行 JAR 文件,在各子模块下的 `pom.xml` 中应加入如下所示的 `spring-boot-maven-plugin` 插件配置: ```xml <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` 此设置允许开发者利用 Maven 命令轻松创建包含应用程序所需依赖项在内的单一文件形式的应用程序镜像[^3]。 #### 构建并发布至 Linux 服务器 完成上述准备工作之后,可以通过命令行工具或 IDE 内置功能触发完整的编译、测试以及最终制品生成操作。一旦获得了目标平台兼容的目标文件(通常是 `.jar`),就可以将其传输到远程主机并通过 SSH 进行安装和服务启动: ```bash scp target/*.jar user@remote:/path/to/deploy/ ssh user@remote 'nohup java -jar /path/to/deploy/your-app.jar --server.port=8080 > app.log &' ``` 以上步骤实现了从本地开发环境向生产环境中迁移应用实例的过程,并且保持了良好的自动化程度和灵活性[^2]。 #### Nacos 注册中心集成注意事项 当涉及到更复杂的分布式系统时,如引入 Nacos 作为服务发现组件,则需要注意合理规划资源分配情况,尤其是在多节点集群环境下要充分考虑到性能瓶颈可能出现的位置。此外,还需关注版本兼容性和网络连通性等问题以保障整体稳定性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值