• 作者:老汪软件技巧
  • 发表时间:2024-08-23 11:01
  • 浏览量:

各位小伙伴们大家好呀,我是小金,本篇文章我们将介绍如何使用Pipeline流水线部署我们自己的微服务项目,之前没怎么搞过部署相关的,以至于构建流水线的过程中中也遇到了很多自己以前没有考虑过的问题,特写此篇,用于个人记录与分享。

一 、基础插件安装1.1 安装与配置Maven插件安装Maven 插件。

搜索 maven,选中Maven Integration进行安装。

配置maven工具

安装完成后,需要配置Maven工具,我们的自动化构建任务是使用 Maven 构建的,需要告知Jenkins Maven的安装位置。

1.2 安装与配置ndoe插件安装NodeJS插件

配置NodeJS工具

1.3 安装与配置ssh插件安装ssh插件

这个插件的作用就是将 Jenkins 构建的 SpringBoot 项目的 jar 包发布的业务服务器上。

配置业务服务器

找到系统配置

拉到最下面找到Publish over SSH,安装完 SSH 插件才有这个选项。

Server是可以有多个的,新增一个 SSH Server。

在最下面有个测试的按钮,可以测试一下配置有没有问题,没有问题,保存配置。

二 、构建微服务项目流水线2.1 创建构建任务

编写流水线脚本,依照需求实现不同的步骤,这里贴出博主的一个配置仅供参考

2.2 shell脚本

1、jenkins脚本命令,这里博主的服务器和jenkins是在一台服务器上,所以在jar发送阶段直接使用的shell命令,如果不在一台服务器上则使用ssh插件,这里不在赘述

pipeline {
    agent any
    tools {
        maven 'maven3'
    }
    stages {
        stage('拉取代码') {
            steps {
                git branch: 'dev', credentialsId: '20250730-853d-40dc-be30-xxxxxxxx', url: 'https://gitee.com/xxx/xxx.git'
                echo '拉取代码完成!'
            }
        }
        
        stage('执行构建') {
            steps {
                dir('kingoffice-auth') {
                    sh """
                    mvn --version
                    mvn clean package -DskipTests
                    """
                    echo '执行构建成功!'
                }
            }
        }
        
        stage('执行更新安装包文件进程') {
            steps {
                script {
                    def currentTime = new Date().format("yyyyMMddHHmmss")
                    def jarFile = 'kingoffice-auth/target/kingoffice-auth.jar'
                    def targetDir = '/kim/project/auth/'
                    def targetFile = "${targetDir}kingoffice-auth.jar"
                    def dockerFile = 'docker/kim/auth/Dockerfile'
                    def deployScript = 'docker/kim/auth/deploy.sh'
                    // 检查并创建目标目录
                    sh "sudo mkdir -p ${targetDir}"
                    // 检查目标目录是否存在同名 JAR 文件
                    if (fileExists(targetFile)) {
                        // 重命名 JAR 文件
                        def newTargetFile = "${targetDir}kingoffice-auth-${currentTime}.jar"
                        sh "sudo mv ${targetFile} ${newTargetFile}"
                        echo "已重命名文件为: ${newTargetFile}"
                    }
                    // 复制新生成的 JAR 文件
                    sh "sudo cp ${jarFile} ${targetDir}"
                    echo '发送 JAR 文件成功!'
                    // 删除目标目录下的同名 Dockerfile 和 deploy.sh 文件
                    sh "sudo rm -f ${targetDir}Dockerfile"
                    sh "sudo rm -f ${targetDir}deploy.sh"
                    // 复制新的 Dockerfile 和 deploy.sh 文件
                    sh "sudo cp ${dockerFile} ${targetDir}"
                    sh "sudo cp ${deployScript} ${targetDir}"
                    echo '发送 Dockerfile 和 deploy.sh 成功!'
                }
            }
        }
        
        stage('构建并启动容器') {
            steps {
                script {
                    def targetDir = '/kim/project/auth/'
                    def deployScriptPath = "${targetDir}deploy.sh"
                    // 确保 deploy.sh 脚本具有执行权限
                    sh "sudo chmod +x ${deployScriptPath}"
                    // 执行 deploy.sh 脚本
                    sh "sudo ${deployScriptPath}"
                    echo '执行启动容器完成!'
                }
            }
        }
    }
}

2.3 部署脚本 deploy.sh


#!/bin/bash
# 项目名称
projectName=kingoffice-auth
# 年月日时分的时间戳
timestamp=$(date +%Y%m%d%H%M)
# 新镜像的名称
newImageName=$projectName:$timestamp
# 切换到包含Dockerfile的目录
echo "切换到包含Dockerfile的目录 /kim/project/auth/"
cd /kim/project/auth/ || { echo "切换目录失败,退出脚本"; exit 1; }
echo "开始构建新镜像: $newImageName"
# 1.首先使用Dockerfile打镜像
docker build -t $newImageName .
if [ $? -ne 0 ]; then
echo "构建新镜像失败"
exit 1
else
echo "构建新镜像成功"
fi
echo "正在停止并删除之前运行的容器..."
# 2.停止并删除之前运行的容器
runningContainerId=$(docker ps | grep "$projectName" | awk '{print $1}')
if [ -n "$runningContainerId" ]; then
docker stop "$runningContainerId" && echo "容器已停止: $runningContainerId"
docker rm "$runningContainerId" && echo "容器已删除: $runningContainerId"
fi
echo "正在删除旧镜像..."
# 删除除最新外的所有旧镜像
oldImageTags=$(docker images | grep "$projectName" | awk '{print $2}' | grep -v "$timestamp" | sort | uniq)
for tag in $oldImageTags; do
    docker rmi "${projectName}:${tag}" && echo "旧镜像已删除: ${projectName}:${tag}";
done
echo "创建日志目录..."
# 在宿主机上创建logs目录,用于容器挂载,这样查看日志可以直接在宿主机查看,比较方便
mkdir -p ~/kim/project/auth/logs
echo "正在运行新的镜像..."
# 3.运行新的镜像
docker run -d -p 9200:9200 --restart=always -v ~/kim/project/auth/logs:/kim/logs $newImageName
if [ $? -eq 0 ]; then
echo "新容器运行成功"
else
echo "新容器运行失败"
exit 1
fi

2.4 使用沙盒生成命令

上述配置完毕后,点击生成流水线脚本,即生成对应的脚本语言,复制到脚本文件中即可。

流水线创建完成后,就可以进行第一次构建尝试了。

三 、部署vue项目3.1 创建构建任务创建任务

选择构建一个自由风格的软件项目

3.2 源码管理

与上述添加远程仓库步骤一致。

3.3构建环境

勾选Provider Node & npm bin/folder to PATH。

3.4 构建步骤:

执行构建的时候,执行 npm 命令进行构建就可以了,所以在 Build Step 选择执行 shell:

3.5 shell命令

# 安装依赖
npm install --registry=https://registry.npmmirror.com
# 构建项目
npm run build:prod
# 将构建结果打包
zip -r dist.zip dist
echo "打包成功"
# 检查/kim/nginx/html/目录下是否存在dist.zip文件,并进行重命名处理
if [ -f "/kim/nginx/html/dist.zip" ]; then
   sudo mv /kim/nginx/html/dist.zip "/kim/nginx/html/dist_$(date +%Y%m%d%H%M%S).zip"
fi
# 将dist.zip文件移动到/kim/nginx/html/目录下
sudo mv dist.zip /kim/nginx/html/
# 删除/kim/nginx/html/目录下的dist文件夹
sudo rm -rf /kim/nginx/html/dist
# 解压dist.zip至/kim/nginx/html/目录,完成部署
sudo unzip /kim/nginx/html/dist.zip -d /kim/nginx/html/
echo "部署成功"

四 、问题总结4.1 构建时间 相差八个小时

系统管理->脚本命令行->运行下面代码

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai')

4.2 构建过程报错 找不到maven

查看构建脚本 是否有此命令,此命令是告知jenkins使用哪个maven进行构建,博主使用的版本,不输此命令,会报mvn找不到的错误。

 tools {
        maven 'maven3'
    }

4.3 微服务私有jar找不到

博主最初maven使用的是阿里云的公开镜像,但是在微服务中有些依赖使我们项目生成的关系依赖jar,这在公共平台是不可能找到的,博主想到的办法是搭建个人私服仓库,但是这个成本过大,于是就使用了阿里云免费提供的私人云效仓库。创建过程不再赘述,这里只讲重点遇到的问题。1、maven配置文件,直接使用阿里settings文件即可,或者按需配置。

2、第一次推送成功,第二次推送取失败1、私有jar上传前改一下版本号

2、开启允许覆盖指令。

4.4 执行shell命令脚本权限不够

jenkins使用的用户一般默认是jenkins,有两种解决方案

1、将jenkins改成root 一般配置文件是在这个目录下 /etc/sysconfig/jenkins2、赋予jenkins用户权限编辑/etc/sudoers文件,在文件最下为 Jenkins 用户赋予无密码执行sudo的权限

jenkins ALL=(ALL) NOPASSWD:ALL