云服务器使用jenkins+nacos自动化构建部署springcloud项目

一.环境

系统Ubuntu Server 24.04 LTS 64bit

jdk11,

maven3.9.5,  

mysql

nacos2.3.0

二.安装

1.安装jdk

更新包列表

sudo apt-get update

查看jdk列表

apt-cache search openjdk

下载jdk11

sudo apt-get install openjdk-11-jdk

中间会提示是否继续,输入y进行下一步:

输入java -version查看jdk是否正确安装,以下是成功安装示例:

2.安装maven

这里不指定特定的maven版本,如果需要指定特定版本,可以自行查询对应方法:

sudo apt-get install maven

同样中间输入y继续安装

查看版本mvn -version,验证安装

3.安装mysql

安装mysql

sudo apt install mysql-server

检查mysql状态

sudo systemctl status mysql

以root用户登录

sudo mysql -u root

设置密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

创建数据库

CREATE DATABASE database;

刷新权限

FLUSH PRIVILEGES;

退出mysql

EXIT;

使用密码登录(需要注意的是ubuntu系统下界面不会显示你输入的密码,看起来像是没有输入,但实际上有)

sudo mysql -u root -p

打开配置文件

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

修改配置 bind-address = 0.0.0.0

给指定远程IP配置权限

sudo mysql -u root -p

SELECT User, Host FROM mysql.user;(查看用户)

CREATE USER '用户名'@'允许访问的远程IP' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'允许访问的远程IP' WITH GRANT OPTION;

ALTER USER '用户名'@'允许访问的远程IP' IDENTIFIED WITH mysql_native_password BY '密码';(mysql8.0之后手动设置验证方式,避免报错Public Key Retrieval is not allowed)

刷新权限

FLUSH PRIVILEGES;

退出mysql

EXIT;

重启mysql

sudo systemctl restart mysql

修改SSH配置允许使用密码验证

sudo nano /etc/ssh/sshd_config

确保PasswordAuthentication yes

重启SSH

sudo systemctl restart ssh

测试远程连接(记得防火墙放开3306端口)

4.安装nacos

wget -c https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.tar.gz(-c允许断点续传)

解压

tar -xzvf nacos-server-{version}.tar.gz

进入nacos目录,启动nacos

cd nacos/bin

./startup.sh -m standalone

防火墙放行nacos端口8848

登录查看并配置相关服务,可以查看到nacos页面即可

ip:8848/nacos

5.配置jenkins

(安装过程以及gitee配置同上篇文章)

服务器上创建部署的文件夹

sudo mkdir -p /NewFolder/subfolder1

Groovy脚本

pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                // 检出源代码
                git credentialsId: '凭证ID', url: 'git地址'
            }
        }
        
        stage('Build') {
            steps {
                // 执行Maven构建
                script {
                    sh 'mvn clean'
                    sh 'mvn package -DskipTests'
                }
            }
        }
        
        stage('Deploy') {
            steps {
                script {
                     // 定义部署目录和你的服务列表
                    def deployDir = '/部署文件的目录'
                    def services = ['service1','service2'] // 你的服务列表
                    // 确保部署目录存在
                    //sh "mkdir -p ${deployDir}"
                    
                    // 遍历服务并部署
                    for (service in services) {
                        //jenkins打包的位置
                        def servicePath = "/var/lib/jenkins/workspace/${service}/target/${service}.jar"
                        def deployServiceDir = "${deployDir}"
                        def javaCmd = "java -jar ${deployServiceDir}/${service}.jar"
                        
                        //检查服务并中止
                        def servicePid = sh(returnStdout: true, script: "jps -l | grep '${service}.jar' | awk '{print \$1}'").trim()
                        if (servicePid) {
                        sh "kill -TERM ${servicePid}"
                        sh "sleep 5" // 等待服务优雅关闭
                        if (sh(returnStdout: true, script: "jps -l | grep '${service}.jar'").trim()) {
                            echo "Service did not stop."
                        } else {
                            echo "Service stopped successfully."
                        }
                    } else {
                        echo "Service is not running."
                    }

                        // 复制构建产物到部署目录
                        //jar包是单文件,直接cp就可以
                        sh "cp ${servicePath} ${deployServiceDir}/"

                        // 检查文件是否存在并启动服务
                        if (fileExists("${deployServiceDir}/${service}.jar")) {
                            // 使用nohup在后台启动服务,并将输出重定向到日志文件
                            //设置环境变量,防止jenkins自动终止命令
                            withEnv(['JENKINS_NODE_COOKIE=dontKillMe']){
                                // 使用nohup在后台启动服务,并将输出重定向到日志文件
                                sh "BUILD_ID=DONTKILLME nohup ${javaCmd} > ${service}.log 2>&1 &"
                                //设置等待一段时间             
                                sh "sleep 20"
                            }
                            echo "Service ${service} started."
                        } else {
                            echo "Deployment failed: JAR for ${service} not found."
                        }
                    }
                }
            }
        }
    }
    post {
        success {
            echo 'Deployment successful!'
        }
        failure {
            echo 'Deployment failed!'
        }
    }
}

需要注意打包文件类型,有jar和war两种,pom.xml里有产物名和文件类型

文件类型:

<packaging>jar</packaging>

文件名如下(spring-boot-maven-plugin是必需的,否则会报错no main manifest attribute):

<build>
    <finalName>文件名</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

*如果Jenkins在运行时报错找不到文件,可以查看jenkins的输出信息,查看jenkins打包之后产物在哪里

*如果jenkins报错权限不足,需要适当修改目标文件夹的所有者以及权限

*需要注意的是,这里nohup java -jar启动报错的话,并不一定会在jenkins显示,所有建议手动在服务器上启动一次看看是否正常

java -jar /project/yourProject.jar

如果可以正常启动,可以进一步尝试nohup java -jar /project/yourProject.jar > yourProject.log 2>&1 &

之后 查看端口情况sudo netstat -tulnp,确保jar包可以正常运行

接口测试

 curl http://接口路径

三.结语

spring boot内嵌了tomcat,所以服务器可以省略安装tomcat以及相关的配置,所有环境都由spring boot本身集成

Jenkins是一款开源的持续集成工具,它可以帮助开发团队自动化构建、测试和部署软件项目。在Jenkins中配置Docker插件后,我们可以结合Docker技术来进行自动化部署。Docker是一种轻量级的容器化技术,它可以将应用程序和其依赖的环境打包成一个可移植的容器,方便在不同的环境中部署和运行。 而Kubernetes(简称K8s)是一个开源的容器编排平台,它可以管理和调度Docker容器集群。通过在K8s中创建Pod、Service等资源对象,我们可以实现Spring Cloud项目自动化部署。 首先,我们可以使用Jenkins的Pipeline功能来编写自动化部署的流水线脚本。流水线脚本可以定义一系列的步骤,包括构建、测试和部署等。在流水线脚本中,我们可以使用Docker插件来创建Docker镜像,并将其推送到Docker仓库。接着,我们可以使用K8s插件来在Kubernetes集群中创建相关的资源对象,如Deployment和Service等。 在自动化部署过程中,我们可以将Spring Cloud项目的源代码与Dockerfile放在一个Git仓库中,并通过Jenkins的Webhook功能来触发自动化部署流水线。当有新的代码提交时,Jenkins会自动拉取最新的代码,并执行流水线脚本。在流水线脚本中,我们可以使用Maven或Gradle等工具来构建和打包Spring Cloud项目。然后,通过Docker插件创建可运行的Docker镜像,并将其推送到Docker仓库。 最后,使用K8s插件在Kubernetes集群中创建相关的资源对象,如Deployment和Service等。通过创建Deployment对象,我们可以定义应用程序的副本数和容器的镜像。通过创建Service对象,我们可以定义应用程序可以访问的网络端口和负载均衡规则。 通过Jenkins、Docker和Kubernetes的自动化部署,我们可以实现Spring Cloud项目的快速、可靠和可重复部署。这种自动化部署的方式可以提高开发效率和部署质量,同时也降低了运维成本和风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值