目录

  1. 前言
  2. 前置准备
    1. 更新yum
    2. 安装JDK(8或11)
    3. 安装高版本JDK
    4. 安装Maven
    5. 安装Git
    6. 关闭防火墙
  3. Jenkins下载安装并启动
    1. 下载
    2. war包放入服务器中
    3. 启动war
  4. Jenkins页面介绍
    1. 页面功能
    2. 页面配置
  5. 使用Maven插件创建任务(SSH)启动
    1. 安装插件
    2. 新建任务
    3. 编辑任务配置(重要)
    4. 问题
    5. 解决问题
    6. 优化:Docker外挂运行
    7. 再优化:Docker内部运行
  6. 使用流水线(Pipeline)创建任务(推荐)
    1. Web UI编写脚本
    2. Jenkinsfile编写脚本
  7. 多分支流水线(推荐的推荐)
    1. 不同分支执行相同流水线
    2. 不同分支执行不同流水线
  8. 构建前端Node项目流水线
    1. 准备
    2. Jenkins新建任务
    3. Jenkinsfile文件
    4. 优化(压缩dist目录发送至部署服务器)
  9. 任务触发方式
    1. 其他工程构建后触发
    2. 定时构建
    3. 触发远程构建(Git仓库的WebHook触发)
    4. 轮询SCM(不推荐)
  10. 任务执行完成后发送邮件
    1. 准备
    2. 配置
    3. 优化邮件模板
  11. Jenkins集群(高级)
    1. 主节点新增集群配置
    2. 任务配置
    3. 测试
  12. 总结
  13. 其他功能及配置演示
    1. IDEA Jenkins插件
    2. 优化Vite项目打包日志
  14. 插件使用以及坑
    1. sshPublisher插件
    2. Maven插件
    3. NodeJS插件

前言

  • 本文以SpringBoot项目进行演示。。。
  • 使用前和使用后对比:
    • 以前的打包流程:本地修改代码->提交Git仓库->等待发布时->拉取代码->在本地使用Maven打成Jar包->先把服务器的jar包停止启动->将本地jar包上传上去->启动新jar包,总共大致8个步骤。
    • 使用Jenkins(CI/CD)后:本地修改代码->提交Git仓库->打开Jenkins页面->选择流水线并执行,总共大致4个步骤
  • 从上面步骤对比来看,使用能大大提高我们的打包速度,并且减少了很多错误发生的可能。我们只需要前提配置一下流水线步骤,后面只要点击执行按钮,就会按照配置好的步骤自动的一步一步的执行
  • 目前也有一些大公司提供了CI/CD的工具,但一般免费的都会有总共执行时长的限制。所以我们需要使用开源的Jenkins来搭建属于我们自己公司的CI/CD工具

前置准备

共需提前把如下步骤准备好

  1. 两台服务器,一台启动Jenkins服务器,一台用于部署所有应用的服务器。也可以都在同一个服务器中。下面演示基于两台服务器演示
  2. 应用服务器需要安装JRE 或 JDK,启动Jar
  3. Jenkins服务器共需要安装JDK(Jenkins、Maven需要)、Maven(编译代码打包)、Git(仓库拉取代码)
  4. 创建一个基本的SpringBoot项目,编写一个简单的接口,并提交到Git仓库,后面基于这个项目演示

1、更新yum

  • 如果在国内,默认的镜像源地址一般是无法访问的,需要配置为国内其他大厂公开的镜像源地址即可正常使用yum install安装
# 备份原配置
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 下载新的 repo 文件
# 阿里云镜像源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 或清华大学镜像源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.tuna.tsinghua.edu.cn/help/centos/

# 清除缓存并生成新缓存
sudo yum clean all
sudo yum makecache

2、安装JDK(8或11)

  • 如果Jenkins是单独安装一个服务器的话,那么建议先查询最新版Jenkins支持的JDK版本,然后安装
  • 如果Jenkins和代码都放在同一个服务器,并且最新版Jenkins所需JDK版本和代码所需版本一致,那么更好,省去后面jenkins初始化下载插件的问题了
# 镜像源仓库目前只有8和11的,可以使用 yum search java|grep jdk查看
# 如果部署服务器用到8,或者11,可以使用如下命令快速安装
# 安装Java 8
sudo yum install -y java-1.8.0-openjdk-devel

# 或安装Java 11
#sudo yum install -y java-11-openjdk-devel

# 最后使用java -version查看

在这里插入图片描述

卸载JDK

为了防止上面安装错误,这里提供下使用yum命令卸载JDK的方式

# 注意修改包名为上面安装的名称
yum remove java-xxx-openjdk-devel

# 查询其他原装的java包
rpm -qa | grep java

# 根据查询出来的包,删除,自行替换版本名称
yum remove -y java-xxx-openjdk*

# 最后再执行如下命令查看是否还有残留
java -version

3、安装高版本JDK

3.1、官网下载

  • 高版本JDK可以在官网下载压缩包,然后上传到服务器解压,我这里安装最新版Jenkins所需版本:JDK17,下面安装Jenkins会教你怎么查看所需JDK版本
  • Java Downloads | Oracle,找到对应Linux的JDK版本安装

在这里插入图片描述

3.2、上传服务器

在这里插入图片描述

3.3、解压

# 创建解压后的目录
mkdir /usr/local/java

tar -zxvf jdk-17.0.15_linux-x64_bin.tar.gz -C /usr/local/java

3.4、配置环境变量

# 编辑配置文件(根据 Shell 类型选择,如 ~/.bashrc 或 ~/.zshrc)
vi ~/.bashrc

# 添加内容(需根据实际安装路径修改)
export JAVA_HOME=/usr/local/java/jdk-17.0.15
export PATH=$JAVA_HOME/bin:$PATH

# 使配置生效
source ~/.bashrc

# 验证
java -version

在这里插入图片描述

在这里插入图片描述

4、安装Maven

4.1、下载Maven

# 安装到opt目录
cd /opt

# 安装支持机器上的JDK版本的即可,我这里支持JDK8的即可
sudo wget https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz

# 将下好的文件解压
sudo tar xzvf apache-maven-3.8.1-bin.tar.gz

# 修改下文件夹名称
sudo mv apache-maven-3.8.1 maven

# 最后执行命令验证
/opt/maven/bin/mvn -v

在这里插入图片描述

4.2、配置conf目录中的Settings.xml文件的镜像源

sudo vi /opt/maven/conf/settings.xml

<mirrors> 标签内添加阿里云镜像,本地仓库地址可配可不配,默认为/path/to/local/repo

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

在这里插入图片描述

5、安装Git

sudo yum install -y git

# 验证
git --version

在这里插入图片描述

6、关闭防火墙

  • 为了演示方便,我这里两个服务器都关闭防火墙,根据实际情况
# 永久关闭开机自启
sudo systemctl disable firewalld

# 关闭防火墙
sudo systemctl stop firewalld

Jenkins下载安装并启动

  • 官网:Jenkins
  • 前提
    • 机器要求:
      • 256 MB 内存,建议大于 512 MB
      • 10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)
    • 需要安装以下软件:
      • Java ( JRE 或者 JDK 都可以,具体版本根据下载的Jenkins所需版本安装)
  • 下面,我将会使用VMware+CentOS 7演示下载并安装

1、下载

  • 去官网下载即可:下载和部署,下载对应JDK版本的war包即可
  • 尽量下载最新版Jenkins,并且安装对应的JDK版本
  • 注意:
    • 不同版本的Jenkins启动是有不同的JDK版本要求的,具体可以参考Java 支持策略
    • 如果安装的Jenkins比较旧,那么后续安装插件将会比较麻烦,插件会对Jenkins版本有要求的
  • 我的版本:
    • Jenkins:2.346.3 LTS
    • JDK:17

在这里插入图片描述

2、将war包放入服务器中

在这里插入图片描述

3、启动war

  1. app.log
    作用:将标准输出(STDOUT,编号 1)重定向到 app.log 文件。
    效果:Jenkins 的正常运行日志会写入 app.log。
  2. 2>&1
    作用:将标准错误(STDERR,编号 2)重定向到与标准输出相同的目标(即 app.log)。
    效果:错误日志和正常日志会合并到同一个文件。
  3. &
    作用:将命令放入后台执行,让出当前终端控制权。
    效果:命令执行后不会阻塞终端,可继续输入其他命令。
nohup java -jar jenkins.war --httpPort=8080 > app.log 2>&1 &

在这里插入图片描述

Jenkins页面介绍

  • 上面操作完成后,我们页面访问服务器ip+:8080即可访问Jenkins页面了
  • 刚进页面会显示一行英文字母,在初始化,等耐心等待一会即可

1、页面功能

1.1、账号和密码

  • 跳转页面后,会显示管理员密码存放在哪个目录中,执行命令即可查看
  • 或者打开启动日志,最底下也会输出初始密码
cat /root/.jenkins/secrets/initialAdminPassword

在这里插入图片描述

在这里插入图片描述

1.2、初始化

  • 进入后,会让我们选择插件的初始化安装,我们这里选安装推荐的插件即可,然后会帮我们安装如下插件,耐心等待全部安装完成
  • 如果很多个插件安装报错,可以使用cat app.log查看日志,是否是插件所需的Jenkins版本不够(安装老版本可能会出现),那么就需要取消安装所有插件,然后去官网下载插件,在Jenkins页面中一个一个上传上去,比较麻烦

在这里插入图片描述

1.3.创建管理员账号

在这里插入图片描述

1.4、实例配置

自动生成,一般不用改

在这里插入图片描述

2、页面配置

  • 进入页面后,点击左侧系统管理->右侧全局工具配置,配置我们的JDKMaven地址,后面配置流水线会用到

    在这里插入图片描述

  • JAVA配置如下,别名随意

    在这里插入图片描述

  • Maven配置如下,名称随意

    在这里插入图片描述

使用Maven插件创建任务(SSH启动)

  • 下面我们演示的流水线执行步骤:拉取代码->通过Maven插件编译打包->停止并删除部署服务器的jar包->将Jar包发送到部署服务器->通过java -jar命令启动
  • 前提准备:
    • 1个部署项目的服务器(需要有Docker)
    • 一个Git仓库,用于将代码提交上去,我这里使用公共的Gitee用来演示
  • 共需要执行如下几步
    1. 安装Maven Integration(使用Maven创建任务)、Publish Over SSH(远程连接其他服务器发送文件或执行命令等操作)插件
    2. 创建Item并选择使用Maven创建
    3. 填写创建表单
      1. 配置拉取代码的Git仓库地址
      2. 配置Maven要执行的命令
      3. 将编译完成的jar包发送到部署的服务器
      4. 在部署的服务器中编写脚本

1、安装插件

1.1、安装Maven Integration

  1. 左侧系统管理->右侧插件管理->左侧Available plugins(可用插件)搜索:Maven Integration

  2. 然后左侧勾选后,右上角点击安装

    在这里插入图片描述

  3. 在跳转的页面最下面,即可看到安装状态

    在这里插入图片描述

  4. 完成后点击下面返回首页即可

1.2、安装Publish Over SSH插件

  • 其余步骤同上,就搜索内容不一样

在这里插入图片描述

  • 下载完成后,我们需要去配置里面,配一下需要用到的服务器
  • 左侧系统管理->右侧系统配置,然后找到SSH Servers配置(一般在最下面)

在这里插入图片描述

2、新建任务

  1. 左侧新建任务

  2. 输入任务名称,并选择构建一个Maven项目(这个选项是安装上面插件后自动出现的)

    在这里插入图片描述

3、编辑任务配置(重要)

  • 这一步我们将配置主要的步骤流程
  • 共有如下几个重要步骤
    1. 配置Git仓库地址
    2. 配置Maven执行命令编译打包
    3. 设置打完包后的步骤(连接部署服务器,发送jar包,启动jar包)

3.1、配置Git仓库地址

  • 我这里使用的是公共仓库,没有账号密码。有需要可以点击添加

在这里插入图片描述

3.2、配置Maven命令

  • 这里执行clean package -DskipTests命令即可够用

在这里插入图片描述

3.3、配置发布步骤

  • 这个是配置在Post Steps中,Add post-build step中选择我们添加的SSH插件提供的功能Send file or execute commands over SSH

    在这里插入图片描述

  • 然后配置如下,执行的命令:nohup java -jar apps/MySpringBoot-0.0.1-SNAPSHOT.jar > app.log 2>&1 &

    在这里插入图片描述

  • 配置完成后,我们点击最下方按钮save即可

3.4、验证

3.4.1、Web页面验证
  • 点击按钮返回后,我们点击左侧菜单立即构建,就可以执行了,然后下面会显示新任务构建的进度条

    在这里插入图片描述

  • 点击下方的构建任务,然后再点击左侧菜单的控制台输出,可以看到构建的每一步日志情况,最下面会展示执行结果

    在这里插入图片描述

3.4.2、服务器验证
  • 连接部署服务器,然后进入/root/apps目录,查看是否有jar
  • 并且执行jps命令,查看是否启动服务了

在这里插入图片描述

3.4.3、服务验证

最后,访问我们代码的测试接口,查看是否正常访问

在这里插入图片描述

4、问题

  • 上面虽然成功了,但是当你重新修改代码->提交->页面执行任务->访问接口,你会发现不生效了
  • 原因:虽然文件传输成功了,会把之前的jar包替换掉,但是之前jar包启动的服务还在运行,后面的启动只会无效,并不会顶替,那么我们在上传文件前,要先把原来启动的服务停掉,最好jar包也删掉
  • 但是问题又来了,每次启动的jar包的进程ID都不一样,即jps查询的ID不一样,那么我们肯定是不能写死了,怎么解决呢?
    • 我们可以提前在部署服务器上编写一个脚本,将所有复杂的命令写进去,我们在网页只需要配置执行这个脚本即可,那么脚本我在第五节会提供

5、解决问题

5.1、脚本

  • 脚本会比较复杂,我尽量注释写的详细点,大家一部分一部分粘贴上去可以先手动执行下看看效果
  • 因为我们上面设置的部署服务器是基于/root目录操作的,所以我下面内容放到/root/auto-start-jar.sh
  • 执行命令./auto-start-jar.sh MySpringBoot,后面参数换成项目服务名即可通用
#!/bin/bash

# 打印传入脚本的参数,并且用appname名称接收
appname="$1"
echo "arg: $appname"

# 判断脚本参数是否有值
if [ -z "$appname" ];
	then
		# 如果没有输入内容,那么打印内容,并退出,返回报错码1
		echo "params [serviceName] is not null"
		exit 1
fi

# 先删除历史 jar 包
rm -rf "apps/${appname}"*.jar

# 获取指定项目正在运行的jar包pid
pid=$(ps -ef | grep "[j]ava -jar .*$appname" | awk '{print $2}')

# 打印下获取的值
echo "检测到 PID: $pid"

# 如果pid为空,提示一下,否则,执行kill命令
# -z代表zero,即0,无值即代表0,表示 if($pid = 0)
if [ -z "$pid" ];
	then
		# 如果无值,那么打印 xxxx 没有启动
    	echo "$appname not started"
    else
    	# 否则kill掉
    	kill -9 "$pid"
    	# 并且打印提示语
    	echo "$appname stoping......"
# 最后使用fi表示结束
fi

5.2、修改任务

注意:是在Pre Steps中新增步骤,原来在Post Step中的不动

  1. 选中任务,点击左侧配置

    在这里插入图片描述

  2. 翻到最下面Pre Steps中,添加文件传送前的操作步骤(执行上面sh脚本)

    在这里插入图片描述

  3. 文件和命令表单,只要填一个就可以

    在这里插入图片描述

  4. 然后保存后,修改代码,提交,重新执行,等待执行我查看接口结果即可

    在这里插入图片描述

6、优化:Docker外挂运行

  • 安装Docker我就不写步骤了,可以参考Docker-初级安装及使用-CSDN博客

  • 具体流程图如下

    在这里插入图片描述

  • 缺点:这种只能针对单个固定Jar文件名称的jar文件挂载,配置比较局限

  • 步骤如下:

    1. 部署服务器先安装Docker
    2. 然后拉取JDK17的镜像
    3. Jenkins配置启动容器命令即可

6.1、Docker服务器拉取镜像

# 我这边代码是17版本写的,所以拉取17的,其他版本修改版本号即可
docker pull openjdk:17

在这里插入图片描述

6.2、准备启动命令

  • 可以自己先把jar包上传到服务器的/root/apps目录中,然后执行命令尝试
docker run -d -p 8888:8888 --name my-spring-boot -v /root/apps/MySpringBoot-0.0.1-SNAPSHOT.jar:/app.jar openjdk:17 java -jar app.jar

6.3、Jenkins页面添加SSH连接

  • 因为我是新加了一个服务器放Docker的,所以有这一步,如果还是用上面的服务器,那么则无需
  • 系统管理->系统配置->SSH Servers

在这里插入图片描述

6.4、编辑/新建任务

  • 直接修改上面的job1或者新增一个job2都可以

  • 要修改的点如下,注意:这里可以先在部署服务器上创建好容器,然后页面上Pre就可以先停止容器docker stop xxxxPost再启动容器即可docker start xxxx,这就外挂的好处,可以更简单点,我这里演示并无需提前创建

    1. Pre Steps先删除文件、停掉并且删除之前的容器

      在这里插入图片描述

    2. Post Steps传送文件,并执行启动命令6.2小节有

      在这里插入图片描述

    3. 最后保存,并且执行,查看结果即可

7、再优化:Docker内部运行

  • 这里根据Dockerfile,将代码打包到镜像中,创建容器直接执行即可
  • Dockerfile要放在代码中,然后在Jenkins把代码中的Dockerfile发送到部署服务器中,然后去build文件即可
  • 这样其他服务就可以共用这一个任务,只需要修改拉取代码的地址即可

7.1、代码中编写Dockerfile

  • 后面将这个文件发送到部署服务器中
FROM openjdk:17

# 暴露端口
EXPOSE 8888

 # 工作目录
WORKDIR /root

# 复制jar包 具体jar包名称根据实际修改
ADD apps/MySpringBoot-*.jar /root/app.jar

# 启动程序
ENTRYPOINT ["java", "-jar",  "/root/app.jar"]

7.2、编辑/新建任务

  • 我这里新建一个,其他的配置都跟之前一样,只Pre 和 Post即可

  • Pre:将代码的Dockerfile发送到部署服务器中,并且删除之前的jar包,停止并删除容器、删除镜像

  • Post:执行docker build构建镜像,并创建容器

  • 创建任务这里也可以选择其他任务进行修改

    在这里插入图片描述

7.2.1、Pre

将拉取下来的代码中的Dockerfile发送到部署服务器中

命令
rm -rf apps/MySpringBoot-*.jar

docker stop my-spring-boot

docker rm -f my-spring-boot

docker rmi myspringboot:latest
配置

在这里插入图片描述

7.2.2、Post
命令
docker build -t myspringboot .

docker run -d -p 8888:8888 --name my-spring-boot myspringboot
配置

在这里插入图片描述

7.2.3、测试
  • 最后清空部署服务器之前的内容(包括容器(关闭的也要删掉)、jar包等)
  • 然后页面执行后,查看是否实现效果

使用流水线(Pipeline)创建任务(推荐)

  • 官方文档:流水线
  • 下面演示其实执行逻辑和上面一样,只是从配置,改为了使用代码配置
  • 为什么推荐使用Pipeline创建呢,好处如下:
    1. 可以自定义步骤分组,并且在页面上也能更好地展示出来。如果有报错,会显示到对应的步骤上,方便调试
    2. 可以从指定的步骤开始执行,跳过之前的步骤
    3. 流水线可以有选择的停止或等待人工输入或批准,然后才能继续运行流水线。
    4. 支持复杂的需求等
  • 流水线有两种分类,下面演示基于声明式流水线:
    1. 声明式流水线:基于结构化语法,强制遵循特定格式,适合标准化流程(如 CI/CD 模板),结构清晰、强制规范,适合快速上手和标准化场景。
    2. 脚本式流水线:基于Groovy 脚本,更灵活自由,适合复杂逻辑(如动态流程、条件判断),灵活强大、适合复杂逻辑,但学习成本较高。
  • Jenkins 流水线的定义被写在一个文本文件中 (成为 Jenkinsfile),分别可以在Web UI、代码根目录的Jenkinsfile中编写
  • Pipeline声明式流水线有几个重要的步骤如下:
    • pipeline { ... }:声明式 Pipeline 的顶层容器,所有内容必须包含在 pipeline 块内。
      • 必选参数:
        • 至少包含 agentstages
    • agent any:指定 Pipeline 执行的节点(Agent)。
      • any:Jenkins 自动选择一个可用的节点。
      • none:不分配全局 Agent,需为每个 stage 单独指定 Agent。
      • 其他选项:如 agent { label 'docker' }(指定标签为 docker 的节点)。
    • stages { ... }:包含多个 stage 的容器,按顺序执行每个阶段。
      • 特点:
        • 阶段是逻辑分组,用于组织相关的 steps(如构建、测试、部署)。
        • 若某个阶段失败,后续阶段默认不会执行。
    • stage('名称') { ... }:定义一个具体的阶段,每个阶段包含多个 steps
    • steps { ... }:包含一系列具体的命令或操作,是实际执行工作的地方。
      • 支持的操作:
        • Shell 脚本(如 sh 'mvn clean package')。
        • Jenkins 内置命令(如 echo 'Hello World')。
        • 插件提供的命令(如 git checkout master)。
  • 流水线定义有两种选择(创建流水线后,配置页面定义下拉框中选择)
    1. Pipeline script:在Web页面编写Pipeline脚本
    2. Pipeline script from SCM:将定义为Jenkinsfile,并放入代码中。Jenkins拉取代码后,自动读取里面脚本

1、Web UI编写脚本

1.1、使用官方写好的演示使用

1.1.1、创建任务,选择流水线

在这里插入图片描述

1.1.2、翻到下面选择案例演示
  • 这里的定义值为Pipeline script代表在下面代码框中编写脚本

在这里插入图片描述

1.1.3、保存后,然后点击执行
  • 当新建一个Pipeline任务首次执行时,可能会报错,说需要管理员审批
  • 这时候需要管理员点击系统管理->In Process Script Approval中审批,审批通过后,再次执行即可成功
  • 当新建、或修改了语法时,首次执行必须都要经过管理员同意后才可后续执行

在这里插入图片描述

在这里插入图片描述

1.2、结果页面功能讲解

  • 当执行完,并且点击左下角执行的任务时,可以跳转到任务的详情页面。
  • 自己查看可以发现和之前使用Maven创建的任务是多了几个菜单的,这是Pipeline模式的专属的信息
  • 我下面讲解的是一些重要的信息
1.2.1、Console Output
  • 这里也和之前一样,显示执行的日志信息,可以查看每一步的日志

在这里插入图片描述

1.2.2、Pipeline Overview
  • 这里展示Pipeline定义的每一步的响应日志信息
  • 并且可以选择从新运行(Return)或者编辑代码并且重新运行这次构建(Replay)或者选中步骤后,从选中的步骤重新执行后面的步骤(Restart from Stage)

在这里插入图片描述

1.2.3、从指定阶段重新运行
  • 不仅从上面页面点击去可以,这个菜单也可以从指定步骤开始运行

在这里插入图片描述

1.2.4、回放
  • 修改并回放一个构建过的流水线,方便调试

在这里插入图片描述

1.2.5、流水线步骤
  • 可以查看每行代码的执行状态,方便调试

在这里插入图片描述

1.3、流水线语法

  • 其实把之前一些配置,变为代码,我们用到一些插件并不知道怎么写对应的代码。Jenkins也给我们提供了生成代码的工具

  • 重新配置写好的流水线,翻到最下面,有一个流水线语法的蓝色字,点击文字即可跳转

    在这里插入图片描述

  • 跳转过后的页面,就是详细介绍流水线使用方式了,我们这里使用左侧的第一个菜单片段生成器即可

  • 然后在右侧示例步骤中选择我们之前用到的插件,比如Git、SSH等配置,填写配置后,点击生成流水线脚本即可。git仓库有账号密码的话,添加凭据并选择即可

    在这里插入图片描述

1.4、编写我们之前的业务逻辑

  • 编写Shell脚本的话,使用sh 'xxxx'即可。如果是多行的话,就是用三个引号包起来,里面可以换行写sh """ xxx """
  • 我这里共分为三个大步骤,和之前的步骤一样
    1. 拉取代码:拉取Git仓库代码
    2. 重置环境:发送Dockerfile文件,停止并删除容器,删除镜像
    3. 构建代码:maven构建
    4. 部署服务:发送jar包,重新构建镜像并启动容器
  • 每次编写完脚本首次执行,如果Jenkins版本和我的一样是2.5.xx以上的,基本都会报错,需要管理员审批。同意后再次执行即可成功
1.4.1、Pipeline脚本
pipeline {
    agent any
    tools {
        // 引用Jenkins全局工具配置中定义的Maven(名称需与配置一致)
        maven 'maven3.9'  // 对应Jenkins全局工具配置中的Maven名称,大小写敏感
    }
    // 所有步骤放这里面
    stages {
        // 定义每个步骤
        stage('拉取代码') {
            // 步骤内的逻辑
            steps {
                // 使用流水线语法生成
                git 'https://gitee.com/tianchencheng/test-jenkins.git'
                // 打印日志
                echo '--------------代码拉取成功!--------------'
            }
        }
        
        stage('重置环境') {
            steps {
                // 需要使用流水线语法生成
                sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''rm -rf apps/MySpringBoot-*.jar
                    docker stop my-spring-boot
                    docker rm -f my-spring-boot
                    docker rmi myspringboot:latest''', 
                    execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '--------------环境重置完成!--------------'
            }
        }
        
        stage('构建代码') {
            steps {
                sh 'mvn clean package -DskipTests'
                echo '--------------构建完成!--------------'
            }
        }
        
        stage('部署服务') {
            steps {
                // 需要使用流水线语法生成
                sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t myspringboot .
                    docker run -d -p 8888:8888 --name my-spring-boot myspringboot''', 
                    execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'apps', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: 'target/MySpringBoot*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '--------------服务部署完成!--------------'
            }
        }
    }
}
1.4.2、Console Output执行结果

在这里插入图片描述

1.4.3、Pipeline Overview效果

在这里插入图片描述

1.5、其他配置

1.5.1、状态菜单展示执行流程及结果
  • 点击Pipeline的状态菜单,可以发现有点空旷,我们可以将Stages里面内容也添加到这里,省得再去点击Stages菜单了
  • 我们可以在系统管理->Appearance菜单勾选:
    • Show pipeline graph on job page:在作业页面上显示管道图
    • Show pipeline graph on build page:在构建页面上显示流水线图
  • 效果如下
任务页面

在这里插入图片描述

任务详情页面

在这里插入图片描述

构建时的详情页面

在这里插入图片描述

1.6、小总结

  • 通过上面演示,我们可以很快的排查到出错的步骤,并且可以清晰的看到每一步的执行时间及结果
  • Pipeline大部分的配置我们都可以使用片段生成器工具生成,剩余一些简单的sh等命令,编写一下即可完成,其实总的来说并不难理解
  • Jenkins新版的Pipeine是有权限审批的,每次创建以及编辑Pipeline代码后,首次执行一定会报错,需要管理员账号去系统管理->In Process Script Approval页面中点击审批通过即可

2、Jenkinsfile编写脚本

  • 与上面的区别就是将Pipeline代码放入服务代码的Jenkinsfile
    • 优点:
      • 单分支下,只需修改代码中的Jenkinsfile文件即可实现修改任务执行逻辑
      • 在多分支情况下,只需修改分支代码中的Jenkinsfile配置,以及修改任务中的Git拉取分支,即可实现不同分支执行不同的任务,比如mster分支编写打包生产的Jenkinsfile,测试分支编写打包测试的Jenkinsfile,执行不同分支的打包时,只需要手动修改任务配置的拉取分支即可
      • 在代码写脚本时,配合IDEA的插件,可以获得很好的语法提示
      • 因为是跟随代码提交到仓库,有文件的历史记录,可以追踪
    • 缺点:
      • 想要将master分支打包测试环境就需要修改代码的Jenkinsfile文件
      • 新建分支时,要注意拷贝分支的Jenkinsfile满不满足新分支打包需求,否则需要修改,避免打错地方
      • 打不同分支包需要先修改Jenkinsfile中拉取代码的分支配置(可以通过下面章节的多分支流水线功能优化,动态选择分支执行任务)
      • 修改代码中的Jenkinsfile,无需管理员账户审批,,无权限管理,可能导致有人恶意修改脚本后执行
  • 这里建议单分支情况下可以使用如下演示的内容。如果多分支,建议只学习使用Jenkinsfile,具体如何搭配任务使用,建议看完下一章节多分支流水线再决定如何配置
  • 我下面只使用单分支进行演示

2.1、代码创建Jenkinsfile文件

  • 记得创建完成提交代码

    在这里插入图片描述

pipeline {
    agent any
    tools {
        // 引用Jenkins全局工具配置中定义的Maven(名称需与配置一致)
        maven 'maven3.9'  // 对应Jenkins全局工具配置中的Maven名称,大小写敏感
    }
    // 所有步骤放这里面
    stages {
        // 定义每个步骤
        stage('Jenkinsfile 拉取代码') {
            // 步骤内的逻辑
            steps {
                // 使用流水线语法生成
                git 'https://gitee.com/tianchencheng/test-jenkins.git'
                // 打印日志
                echo '--------------代码拉取成功!--------------'
            }
        }

        stage('Jenkinsfile 重置环境') {
            steps {
                // 需要使用流水线语法生成
                sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''rm -rf apps/MySpringBoot-*.jar
                    docker stop my-spring-boot
                    docker rm -f my-spring-boot
                    docker rmi myspringboot:latest''',
                    execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '--------------环境重置完成!--------------'
            }
        }

        stage('Jenkinsfile 构建代码') {
            steps {
                sh 'mvn clean package -DskipTests'
                echo '--------------构建完成!--------------'
            }
        }

        stage('Jenkinsfile 部署服务') {
            steps {
                // 需要使用流水线语法生成
                sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t myspringboot .
                    docker run -d -p 8888:8888 --name my-spring-boot myspringboot''',
                    execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'apps', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: 'target/MySpringBoot*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '--------------服务部署完成!--------------'
            }
        }
    }
}

2.2、新建Pipeline任务

  • 定义下拉框中选择Pipeline script from SCM,并且配置git仓库配置,上面的配置根据需要勾选(下面演示无需勾选)

    在这里插入图片描述

2.3、测试

  • 上面配置完成保存返回即可,然后点击左侧立即构建即可

    在这里插入图片描述

多分支流水线(推荐的推荐)

  • 实际开发中,我们肯定不止一个测试分支,可能会test-02-23、test-03-25等,后面加上创建分支的时间,在新分支里面添加改动代码。新分支测试没问题了再合并到主测试分支这样
  • 那么我们不可能每个分支编写一套任务,最好在一个任务中,能有下拉框让我们选择对应打包的分支最好,这样我们可以指定某个分支执行同一个任务了
  • 多分支流水线配置可以分为两种:
    1. 不同分支执行相同流水线:就是在执行同一个流水线的时候选择不同的分支执行
    2. 不同分支执行不同流水线:在一个任务中,按分支分组分为多个子任务,生产分支根据生产代码配置走生产的流水线,测试根据测试代码配置走测试的流水线
  • 下面我这里演示一下怎么配置出来这个分支选择框

1、不同分支执行相同流水线

1.1、方法一(简单/手动配置分支)

如下方法有一个缺点:当代码添加/修改分支名后,对应的任务也要编辑配置的下拉选项

1.1.1、准备
  • 首先我们肯定要有两个分支,并且内容不一致,方便区分验证
1.1.2、编辑Pipeline->General
  • 我们还是使用上面创建的Pipeline进行演示,编辑任务配置,然后勾选参数化构建过程,点击添加参数->选项参数,然后定义参数名称、配置下拉框选项即可
  • 注意:第一个即为默认选项,尽量填写测试分支名称,避免误按

在这里插入图片描述

1.1.3、编辑Pipeline->流水线代码
  • 这里我们要使用到上面定义的参数,可以使用"${params.参数名}"来获取,放到git的配置中
git branch: "${params.branch}", url: 'https://gitee.com/tianchencheng/test-jenkins.git'

在这里插入图片描述

1.1.4、保存并验证
  • 保存后,进入到任务页面,然后左侧菜单Build with Parameters,在页面选择要打包的分支点击Build即可开始

在这里插入图片描述

1.2、方法二(利用插件自动获取分支)

  1. 首先,我们要先去系统管理->插件管理->安装Git Parameter插件

  2. 安装完成后,我这里再新建一个任务,复制Pipeline-1来修改(任务新建页面下面可以输入要复制的任务),只需输入新任务名称即可

  3. 删除原来参数化构建过程里面的配置,重新添加参数,选择Git 参数

    在这里插入图片描述

  4. 表单内容根据我下面红框内填写即可

    在这里插入图片描述

  5. 修改Piepine代码,上面定义的变量使用"${params.branch}"来获取

    在这里插入图片描述

  6. 保存后,点击左侧Build whth Params菜单,可以看到右侧有红色字体,无需理会,直接选择分支后点击Build当然,可能你需要管理员账户审核通过,才能正常执行

    在这里插入图片描述

  7. 构建完毕后,我们再次点击Build whth Params菜单,注意观察下拉框里面,会出现加载loading,这是正在拉取Git仓库的分支信息,当你新增和删除分支后,重新刷新这个页面,分支也会动态更新

  8. 最后你可以新增分支后,刷新页面进行测试!!!

    在这里插入图片描述

优化:你也可以在配置的时候,不输入默认分支,然后下面高级里面勾选Required Parameter必选,这样每次构建的时候,必须选择分支了,否则点击Build会报错

在这里插入图片描述

2、不同分支执行不同流水线

  • 该配置,适用于基本每个分支都有自己单独的流水线配置,都不相同,执行页面如下

    在这里插入图片描述

  • 每次扫描到新分支时,会默认执行一次。

  • 当新增/修改/删除分支时,需要手动点击左侧立刻扫描 多分支流水线即可刷新页面分支。第一次扫描完后,后续如果修改代码中的Jenkinsfile,则无需再扫描,也可以在任务的配置页面配置定时刷新

    在这里插入图片描述

2.1、准备

  • 首先要有两个服务器,一个生产服务器部署master分支,一个测试服务器test分支,记得在系统管理->系统配置->SSH Servers配置服务器

    在这里插入图片描述

  • 代码创建两个分支,并且分别在根目录创建Jenkinsfile文件,并且修改文件内容

    • test分支:拉取test分支的代码、构建步骤标题可以添加test分支等信息区分、远程操作的服务器修改为test服务器

      pipeline {
          agent any
          tools {
              // 引用Jenkins全局工具配置中定义的Maven(名称需与配置一致)
              maven 'maven3.9'  // 对应Jenkins全局工具配置中的Maven名称,大小写敏感
          }
          // 所有步骤放这里面
          stages {
              // 定义每个步骤
              stage('Jenkinsfile test分支 拉取代码') {
                  // 步骤内的逻辑
                  steps {
                      // 使用流水线语法生成
                      git branch: 'test', url: 'https://gitee.com/tianchencheng/test-jenkins.git'
                      // 打印日志
                      echo '--------------代码拉取成功!--------------'
                  }
              }
      
              stage('Jenkinsfile test分支 重置环境') {
                  steps {
                      // 需要使用流水线语法生成
                      sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer-test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''rm -rf apps/MySpringBoot-*.jar
                          docker stop my-spring-boot
                          docker rm -f my-spring-boot
                          docker rmi myspringboot:latest''',
                          execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                      echo '--------------环境重置完成!--------------'
                  }
              }
      
              stage('Jenkinsfile test分支 构建代码') {
                  steps {
                      sh 'mvn clean package -DskipTests'
                      echo '--------------构建完成!--------------'
                  }
              }
      
              stage('Jenkinsfile test分支 部署服务') {
                  steps {
                      // 需要使用流水线语法生成
                      sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer-test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t myspringboot .
                          docker run -d -p 8888:8888 --name my-spring-boot myspringboot''',
                          execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'apps', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: 'target/MySpringBoot*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                      echo '--------------服务部署完成!--------------'
                  }
              }
          }
      }
      
    • master分支:拉取master分支的代码、构建步骤标题可以添加master分支等信息区分、远程操作的服务器修改为prd服务器

      pipeline {
          agent any
          tools {
              // 引用Jenkins全局工具配置中定义的Maven(名称需与配置一致)
              maven 'maven3.9'  // 对应Jenkins全局工具配置中的Maven名称,大小写敏感
          }
          // 所有步骤放这里面
          stages {
              // 定义每个步骤
              stage('Jenkinsfile master分支 拉取代码') {
                  // 步骤内的逻辑
                  steps {
                      // 使用流水线语法生成
                      git 'https://gitee.com/tianchencheng/test-jenkins.git'
                      // 打印日志
                      echo '--------------代码拉取成功!--------------'
                  }
              }
      
              stage('Jenkinsfile master分支 重置环境') {
                  steps {
                      // 需要使用流水线语法生成
                      sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer-prd', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''rm -rf apps/MySpringBoot-*.jar
                          docker stop my-spring-boot
                          docker rm -f my-spring-boot
                          docker rmi myspringboot:latest''',
                          execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                      echo '--------------环境重置完成!--------------'
                  }
              }
      
              stage('Jenkinsfile master分支 构建代码') {
                  steps {
                      sh 'mvn clean package -DskipTests'
                      echo '--------------构建完成!--------------'
                  }
              }
      
              stage('Jenkinsfile master分支 部署服务') {
                  steps {
                      // 需要使用流水线语法生成
                      sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer-prd', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t myspringboot .
                          docker run -d -p 8888:8888 --name my-spring-boot myspringboot''',
                          execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'apps', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: 'target/MySpringBoot*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                      echo '--------------服务部署完成!--------------'
                  }
              }
          }
      }
      

2.2、创建多分支流水线

  1. 创建任务时,勾选多分支流水线任务名称建议为服务名称,一个服务对应多个分支

    在这里插入图片描述

  2. 配置分支源,用于扫描分支和获取Jenkinsfile文件

    在这里插入图片描述

  3. 配置Jenkinsfile文件所在项目地址

    在这里插入图片描述

  4. 可以配置自动扫描分支的时间间隔,或者手动点击菜单扫描。每次扫描出来新分支,会自动执行一次

    在这里插入图片描述

  5. 下面的孤儿项策略可以根据需要配置,其他就不需要修改什么了

    在这里插入图片描述

  6. 配置完成后,就会自动触发扫描多分支流水线,点击左侧的扫描多分支流水线即可查看

    在这里插入图片描述

  7. 等待扫描完成后,点击左侧状态菜单,即可查看到扫描的分支了,如果是首次扫描出来的分支,在左下角也会看到分支正在执行

    在这里插入图片描述

  8. 点击对应分支右侧的开始按钮,即可执行对应分支的流水线了

  9. 可以点击子分支查看任务执行明细

    在这里插入图片描述

    在这里插入图片描述

  10. 测试结果

    在这里插入图片描述

构建前端Node项目流水线

  • 其余演示的都是构建Java后端项目的步骤,其实都大差不差。为了补全前后端,这里也放上前端的打包流程,如果公司需要部署Java后端、Node前端项目,参考这篇文档即可
  • 下面演示使用Docker安装Nginx部署前端项目
  • 大致步骤:拉取代码->清除docker的容器、镜像以及文件->npm/pnpm安装项目依赖构建项目->将构建好的文件以及Dockerfile发送到目标服务器,并构建并运行镜像,其实和部署java项目差不多,只不过构建工具从maven换为node
  • 技术栈:vite:4.x、Vue:3.x、node:16.x、pnpm:9.6.1、
  • 指定vite版本安装(否则最新版不支持node16.x)pnpm create vite@4

1、准备

1.1、创建项目以及Git仓库

  • 使用vite创建v3项目:开始 | Vite 官方中文文档

  • 我这里演示的正式但稍微复杂点,点击按钮调用之前后端写的那个测试接口,将返回值打印在页面上。但是代码我就不写到这了,因为不是重点,相信大家都会搭出来这么一套基本的前后端服务

  • 最后提交Git仓库步骤就不演示了,这里我仓库设置私有,就需要在Jenkins中添加Git凭据了

  • CentOS 7最高只支持node16.x版本,再高就要升CentOS 8。因为7glibc默认2.17版本,但是16+node需要GLIBC_2.27 及以上,而CentOS 8默认的glibc是2.28版本,支持的

    在这里插入图片描述

1.2、代码根目录创建Dockerfile文件

  • 后面我们会把这个文件在Jenkins中通过SSH插件发送到部署服务器中
FROM nginx:1.28.0

# 暴露端口
EXPOSE 80

# 复制jar包
ADD dist/ /usr/share/nginx/html/

# 启动Nginx并保持前台运行
CMD ["nginx", "-g", "daemon off;"]

# 构建命令
# docker build -t my-vue3-web .

# 运行命令
# docker run -d --name my-vue3-web -p 80:80 -v /root/webApps/myVue3Web/nginx-conf/nginx.conf:/etc/nginx/conf.d/default.conf my-vue3-web

1.3、服务器安装node

1.3.1、nvm安装命令
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash

# 激活nvm(重启终端后自动生效)
source ~/.nvm/nvm.sh

# 测试
nvm -v
1.3.2、使用nvm安装Node
# 安装最新LTS版本
nvm install --lts

# 安装指定版本(如16.20.2)
nvm install 16.20.2

# 切换使用版本
nvm use 16.20.2

# 设置默认版本
nvm alias default 16.20.2

# 最后验证
node -v
npm -v

在这里插入图片描述

1.3.3、安装pnpm
  • 一般项目使用什么工具,就一直使用这一个工具,否则安装依赖等操作可能会有问题。比如项目搭建初使用的就是pnpm,那么所有打包这个项目的电脑,尽量都使用pnpm,不要在一个项目中,有的使用npm,有的是用yarn,有的是pnpm
npm i -g pnpm@8.6.2

# 验证安装
pnpm -v
1.3.4、修改镜像源
  • 如果各位觉得执行install命令下载依赖很慢,可以执行如下命令切换镜像源
# 查看当前镜像地址
npm config get registry

# 官方镜像:https://registry.npmjs.org/
# 阿里云镜像:https://registry.npmmirror.com/
# 腾讯云镜像:https://mirrors.cloud.tencent.com/npm/
npm config set registry https://registry.npmmirror.com

1.4、服务器创建目录

  • 要现在服务器上创建好我们前台代码编译好的文件,我这里放在/root/webapps/myVue3Web目录中,并且要先创建好nginx-conf/nginx.conf文件,内容如下

    server {
        listen 80;
        server_name localhost;
        root /usr/share/nginx/html;
        index index.html;
    
        # 处理Vue路由
        location / {
            try_files $uri $uri/ /index.html;
        }
    }
    
  • 我们有关myVue3Web项目的,都会放到这个目录中,包括dist、Dockerfile文件,目录如下,当然,这里只需要提前创建好nginx-conf/nginx.conf文件即可,其余的无需提前创建,后面会通过Jenkins发送过来

    在这里插入图片描述

1.5、安装Node插件

  • Jenkins搜索安装NodeJS插件,然后在全局工具中配置node地址

    在这里插入图片描述

  • 如果使用上面nvm安装的node的话,可以使用nvm which current命令查看node目录,只复制到版本号那里即可

    在这里插入图片描述

2、Jenkins新建任务

  • 下面我们使用Jenkinsfile的方式来配置任务,因为我是比较喜欢并且推荐这种方式的

  • 创建任务页面依旧选择流水线

    在这里插入图片描述

  • 然后配置页面的定义下拉框选择Pipeline script from SCM,然后配置git仓库地址,以及Jenkinsfile地址

    在这里插入图片描述

3、Jenkinsfile文件

然后就是重中之重,在代码跟路径创建Jenkinsfile文件,并且配合代码生成器:http://ip:port/job/web-myVue3Web/pipeline-syntax/编写出来这么个文件,并且提交Git仓库

pipeline {
    agent any

    tools {
        nodejs 'node16'  // 指定 Jenkins 全局工具配置中的 Node.js 版本
    }
    stages {
        stage('拉取代码') {
            steps {
                // 使用流水线语法生成
                git credentialsId: 'ad68df2e-173e-48dc-9094-64d6a3d08150', url: 'https://gitee.com/tianchencheng/my-vue3-web.git'
                echo '--------------代码拉取成功!--------------'
            }
        }

        stage('重置环境') {
            steps {
                // 需要使用流水线语法生成
                sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer-test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand:
                '''cd webApps/myVue3Web
                    rm -rf dist
                    rm -rf Dockerfile
                    docker stop my-vue3-web
                    docker rm -f my-vue3-web
                    docker rmi my-vue3-web''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '--------------环境重置完成!--------------'
            }
        }

        stage('构建代码') {
            steps {
                sh """
                pnpm install
                pnpm build
                """
                echo '--------------构建完成!--------------'
            }
        }

        stage('部署服务') {
            steps {
                // 需要使用流水线语法生成 先发送dist文件,再发送Dockerfile文件,并且执行命令
                sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer-test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'webApps/myVue3Web', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'dist/**/*'), sshTransfer(cleanRemote: false, excludes: '', execCommand:
                    '''cd webApps/myVue3Web
                    docker build -t my-vue3-web .
                    docker run -d --name my-vue3-web -p 80:80 -v /root/webApps/myVue3Web/nginx-conf/nginx.conf:/etc/nginx/conf.d/default.conf my-vue3-web''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'webApps/myVue3Web', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '--------------服务部署完成!--------------'
            }
        }
    }
}

4、坑

  1. sshPublisherRemote directory配置的地址,根目录默认是root(如果系统配置的Remote directory没填的话)
  2. 并且Remote directory配置的地址对下面的Exec command命令执行所在地址不生效,命令还是在/root目录中执行,需要先cd xxxxx目录中
  3. 传输dist目录要使用通配符dist/**/*,不能只写dist
  4. 最好更换一下npm源,否则构建会很慢

5、优化(压缩dist目录发送至部署服务器)

  • 上面是简单版本的,我们直接把dist目录内的所有文件,通过通配符dist/**/*全部传过去
  • 如果项目比较大,打包以后的文件也会达到M级别的的大小。所以可以先压缩,然后将压缩后的文件发送至部署服务器,可以有效增加任务的执行速度
  • 主要修改的地方:
    1. 构建完成后,执行tar -zcvf dist.tar.gz dist命令压缩
    2. 部署时将压缩后的dist.tar.gz文件发送过去,然后使用命令tar -zxvf dist.tar.gz dist && rm -rf dist.tar.gz解压后再再行docker build构建镜像
  • 下面放一下主要的两个步骤的代码
stage('构建代码') {
            steps {
                sh """
                pnpm install
                pnpm build
                tar -zcvf dist.tar.gz dist
                """
                echo '--------------构建完成!--------------'
            }
        }

        stage('部署服务') {
            steps {
                // 需要使用流水线语法生成
                sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerServer-test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'webApps/myVue3Web', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'dist.tar.gz'), sshTransfer(cleanRemote: false, excludes: '', execCommand:
                    '''cd webApps/myVue3Web
                    tar -zxvf dist.tar.gz dist && rm -rf dist.tar.gz
                    docker build -t my-vue3-web .
                    docker run -d --name my-vue3-web -p 80:80 -v /root/webApps/myVue3Web/nginx-conf/nginx.conf:/etc/nginx/conf.d/default.conf my-vue3-web''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'webApps/myVue3Web', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '--------------服务部署完成!--------------'
            }
        }

任务触发方式

  • 在任务的配置中,Triggers里面可以配置任务的多种触发方式

    在这里插入图片描述

  • 下面我演示三种常用的

1、其他工程构建后触发

  • 这种适合依赖其他服务的情况,比如Java中依赖其他模块的代码,被依赖的模块打包后,依赖的服务也都要进行打包(当然,架构要尽量避免这种情况)

在这里插入图片描述

2、定时构建

  • 进入任务的配置页面,勾选定时构建

  • 然后在下面的输入框中输入Cron表达式,来定义任务根据配置好的执行时间来定时执行

    在这里插入图片描述

  • Cron表达式工具:Crontab.guru - The cron schedule expression generator,翻译一下页面即可

    在这里插入图片描述

  • 最后修改完配置,等待3分钟查看任务是否自动构建即可

3、触发远程构建(Git仓库的WebHook触发)

  • 这种可以调用Jenkins服务提供的API,传入对应的参数,即可触发任务的构建功能。
  • 经常和Git仓库的WebHook功能搭配使用,实现当Git仓库进行提交、合并等操作时,自动触发任务的构建
  • 注意:如果你的Jenkins所在服务器是内网环境,那么你必须在内网中搭建一套Git仓库,比如GitLab,否则Git仓库是访问不到你内网服务器IP的,也就调用不了里面的接口了。也就是说,你的Jenkins 和 Git仓库要么都处于内网环境,要么都处于外网环境,必须互相能访问到
  • 如果不会搭建Git仓库的可以参考:GitLab搭建与使用(SSH和Docker)两种方式-CSDN博客
  • 我这里就不演示了,只说步骤

3.1、任务配置页面

  • 进入任务配置页面的Triggers中,勾选触发远程构建,然后填写属于这个任务的Token

    在这里插入图片描述

  • 生成后的地址大概是:http://192.168.71.111:8080/buildWithParameters?token=Pipepine-Jenkinsfile这种

  • 然后打开git仓库(我这里以Gitee演示),并且进入项目->管理中,左侧选中WebHook,然后新增后进行配置

    在这里插入图片描述

  • 点击添加按钮会校验,地址是否能被访问到。如果添加没问题,那么可以提交代码进行测试了。下面是访问不到的情况

    在这里插入图片描述

4、轮询SCM(不推荐)

  • 注意:如果不是必须,尽量不要使用。轮询会发送多次无用请求,占用带宽以及服务器资源。可以使用上面那种方式替代。

  • 上面第三节是被动接收Git仓库的调用,那么这个就是主动调用仓库,查看是否有更新信息

  • 依旧是在Triggers中,勾选轮询SCM,并且填写Cron表达式

    在这里插入图片描述

  • 配置完成后,提交代码,然后等待3分钟后查看任务是否有新增构建记录即可

任务执行完成后发送邮件

  • 首先要有两个邮箱,一个是发送邮件的邮箱,另外一个是接收邮件的邮箱
  • 我这里发送邮件使用163邮箱,接收邮箱使用QQ邮箱演示

1、准备

1.1、163邮箱

  • 官网进入邮箱,并且登录成功后,点击设置,开启POP3/SMTP服务服务

    在这里插入图片描述

  • 开启后,会有弹框,点击继续开启,然后弹框中会有一串授权密码,这个要记下来,否则后面看不到只能重新新增了,后面Jenkins会当做密码使用

    在这里插入图片描述

  • 最后翻到最下面,记一下服务器的SMTP地址:smtp.163.com

1.2、QQ邮箱

  • 官网登录上,等待查看邮件即可

2、配置

2.1、系统配置

2.1.1、Jenkins Location
  • Jenkins页面中,点击系统管理->系统配置,然后先找到Jenkins Location配置,填写内容

    在这里插入图片描述

2.1.2、Extended E-mail Notification
  • 如果没有这个插件,去插件市场安装即可。这是初始化时,选择官方推荐插件安装的

  • 在这里配置的是全局的一个默认配置,后面每个项目中可以单独使用这个插件去用全局的一个配置值,也可以个性化修改每个项目邮件的内容等信息

  • 然后找到Extended E-mail Notification配置,这个配置是个性化,就是可以在任务执行完成、失败后发送的邮件信息配置,这个配置才是重要的

    在这里插入图片描述

  • 然后再往下翻一点,可以看到Default Subject邮件主题,可以使用Jenkins提供的一些变量,作为邮件的主题使用

  • 下面还有配置Default Recipients(默认收件人,多个,分割)、Default Subject(默认主题)Default Content(默认的邮件内容),这里也可以使用变量,可以自定义内容(这里定义的是全局变量的值)

    在这里插入图片描述

  • 再往下,有一个**Default Triggers按钮**,这个是配置发送邮件的触发条件,这里一般选择如下这三个就够用,根据实际情况选择

    • Aborted(终止):如果构建状态为“Aborted”,将发送电子邮件。构建通过 UI 或 API 中止,但通常需要某种用户干预才能发生。中止的构建在执行过程中停止。
    • Always(总是):始终在构建后触发电子邮件,无论构建的状态如何
    • Before Build(构建前):在构建开始时,但在 SCM 轮询完成后,将发送电子邮件。
    • Failure - Any(失败 - 任何):每当构建失败时,都会发送电子邮件。如果配置了“Failure - Still”触发器,并且之前的构建状态为“Failure”,则“Failure - Still”触发器将改为发送电子邮件。
    • Failure - 1st(失败 - 第 1 次):当构建状态从 “Success” 更改为 “Failure” 时,将发送电子邮件。
    • Failure - 2nd(失败 - 第 2 次):当构建成功后,如果构建连续两次失败,将发送电子邮件。
    • Failure - Still:当构建成功后,如果构建连续两次失败,将发送电子邮件。
    • Failure - X(失败 - X):构建成功后,如果构建连续失败 X 次,将发送电子邮件
    • Failure → Unstable (Test Failures)(失败 → 不稳定(测试失败)):每当构建从失败(编译或构建步骤失败)变为不稳定(单元测试失败)时,都会发送电子邮件。这基本上意味着所有构建步骤都成功了,但仍有测试失败。
    • Fixed(固定):当构建状态从 “Failure” 或 “Unstable” 更改为 “Success” 时,将发送电子邮件。
    • Not Built(未构建):如果构建状态为“未构建”,将发送电子邮件。此状态代码用于多阶段构建(如 maven2),其中早期阶段的问题会阻止后期阶段的构建。
    • Script - After Build(脚本 - 构建后):允许用户定义执行该脚本以确定是否应在构建发生后发送电子邮件。脚本的最后一行应解析为 true 以发送电子邮件,或 false 以不发送电子邮件。请参阅下面的 Script Trigger Options(脚本触发器选项),了解脚本可用的参数。
    • Script - Before Build(脚本 - 构建前):允许用户定义一个脚本,该脚本将执行以确定是否应在构建开始之前发送电子邮件。脚本的最后一行应解析为 true 以发送电子邮件,或 false 以不发送电子邮件。请参阅下面的 Script Trigger Options(脚本触发器选项),了解脚本可用的参数。
    • Status Changed(状态已更改):如果构建状态发生变化,将发送电子邮件。
    • Success(成功):如果构建状态为 “Successful”,将发送电子邮件。如果配置了“Fixed”触发器,并且之前的构建状态为“Failure”或“Unstable”,则“Fixed”触发器将改为发送电子邮件。
    • Test Improvement(测试改进):每当有改进时,我们都会发送电子邮件。每当 build 的测试失败次数少于上一个 build 时,即认为该 build 已改进。如果当前失败计数变为 0(不再有测试失败),则此触发器将不会发送电子邮件。
    • Test Regression(测试回归):每当出现回归时,都会发送电子邮件。每当某个构建的失败次数多于上一个构建,或者有新的测试失败时,该构建就会被视为回归。
    • Unstable (Test Failures)(不稳定(测试失败)):每当构建不稳定时,都会发送电子邮件。如果存在测试失败,但所有构建步骤都已成功完成,则构建不稳定。如果配置了“Unstable - Still”触发器,并且之前的构建状态为“Unstable”,则“Unstable - Still”触发器将改为发送电子邮件。
    • Unstable (Test Failures) - 1st(不稳定(测试失败)- 第 1 个):当构建状态从 anything 更改为 “Unstable” 时,将发送电子邮件。
    • Unstable (Test Failures) - Still(不稳定 (测试失败) - 静止):如果连续两个或多个构建的构建状态为“不稳定”,将发送电子邮件。如果存在测试失败,但所有构建步骤都已成功完成,则构建不稳定。
    • Unstable (Test Failures)/Failure → Success(不稳定(测试失败)/失败 → 成功):当构建状态从 “Failure” 或 “Unstable” 更改为 “Success” 时,将发送电子邮件。中间的 “Aborted” 构建将被忽略。

    在这里插入图片描述

  • 上面配置的内容,在后面项目的邮件个性化配置中,可以使用${XXXX}去引用全局的配置,只需要点击配置右边的?即可查看使用什么变量名引用(有一些是没有的,那么大概率如果不配置就会使用系统配置的值,可以自行尝试验证)

    在这里插入图片描述

2.1.3、邮件通知
  • 这个是系统级别的通知,当发生非常严重级别的才会发送通知,配置如下

    在这里插入图片描述

  • 然后回到qq邮箱中,可以发现接收到一封邮件

    在这里插入图片描述

  • 然后就全部配置完成了,保存并退出页面即可

2.2、自由模式的任务配置

  • 进入到任务->配置页面,翻到最下面,找到构建设置,这里只需要配置一下收件人邮箱

    在这里插入图片描述

  • 然后在下面的构建后操作中,增加构建后操作步骤,然后选择Editable Email Notification,可以个性化配置项目的邮件内容等配置

  • 然后找到Advanced Settings点击后,再找到Triggers,设置用户组,然后在失败和成功中都添加Build User,保证包含构建的用户执行构建操作

    在这里插入图片描述

  • 保存后,执行构建任务,并查看控制台输出,我这里构建成功,发送的是成功的邮件

    在这里插入图片描述

2.2.1、构建成功

在这里插入图片描述

  • 并且使用电脑(因为使用的虚拟机,电脑可以访问虚拟机中的服务器)点击邮件中的地址,可以直接跳转到任务明细的信息页面

在这里插入图片描述

2.2.2、构建失败
  • 信息只有一行,并且点击跳转失败,后面会优化模板

在这里插入图片描述

2.3、Pipeline模式任务配置

  • Pipeline就要在Jenkinsfile代码中添加配置了

  • 下面我们会在Pipeline中新增一个属性post:用于定义构建完成后执行的操作(如发送通知、清理资源)。它支持根据不同的构建状态(成功、失败、始终执行等)执行不同的步骤。以下是详细的写法和示例:

    pipeline {
        agent any
        // 其他部分...
    
        post {
            // 不同状态的后置操作
            always {
                // 始终执行
            }
            success {
                // 构建成功时执行
            }
            failure {
                // 构建失败时执行
            }
            unstable {
                // 构建不稳定(如测试失败)时执行
            }
            aborted {
                // 构建被手动终止时执行
            }
        }
    }
    
  • 然后我们依旧使用片段生成器,选择如下插件

    在这里插入图片描述

  • 然后填写需要的配置

    在这里插入图片描述

  • 实际要添加的代码如下,stages同级下面添加

post {
        always {
            echo '构建结束...'
            // 偷懒写法,其实下面三个状态,定义三遍,值一样
            emailext body: '$DEFAULT_CONTENT', postsendScript: '$DEFAULT_POSTSEND_SCRIPT', presendScript: '$DEFAULT_PRESEND_SCRIPT', recipientProviders: [buildUser()], replyTo: '$DEFAULT_REPLYTO', subject: '$DEFAULT_SUBJECT', to: '$DEFAULT_RECIPIENTS'
        }
        success {
            echo '恭喜您,构建成功!!!'
         }
        failure {
            echo '抱歉,构建失败!!!'
        }
        unstable {
            echo '部分失败....'
        }
    }

3、优化邮件模板

  • 上面使用的是默认的模板,很简陋,并且难以观察表达的内容,可以在全局配置中使用如下模板,进行优化

  • 首先,Default Content Type的值要为HTML(text/html)Default Subject值为【构建通知】

    在这里插入图片描述

  • 然后在Default Content中填写如下内容

    <!DOCTYPE html>    
    <html>    
    <head>    
    <meta charset="UTF-8">    
    <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>    
    </head>    
    <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"    
    offset="0">    
        <table width="95%" cellpadding="0" cellspacing="0"  style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">    
        <tr>    
            本邮件由系统自动发出,无需回复!<br/>            
            各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br> 
            <td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>   
        </tr>    
        <tr>    
            <td><br />    
            <b><font color="#0B610B">构建信息</font></b>    
            <hr size="2" width="100%" align="center" /></td>    
        </tr>    
        <tr>    
            <td>    
                <ul>    
                    <li>项目名称 : ${PROJECT_NAME}</li>    
                    <li>项目描述 : ${JOB_DESCRIPTION}</li>    
                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>    
                    <li>触发原因: ${CAUSE}</li>    
                    <li>构建状态: ${BUILD_STATUS}</li>    
                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>    
                    <li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>    
                    <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>    
                    <li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>    
                </ul>    
            </td>    
        </tr>    
        <tr> 
            <td><b><font color="#0B610B">变更集</font></b>
            <hr size="2" width="100%" align="center" /></td>    
        </tr>
            <td>${JELLY_SCRIPT,template="html"}<br/>
                <hr size="2" width="100%" align="center" /></td>    
            </tr>
        </table>    
    </body>    
    </html>
    
  • 然后就是再项目中配置了,分两种项目

    • 自由项目如下配置

      在这里插入图片描述

    • Pipeline项目配置
      在这里插入图片描述

3.1、成功效果

在这里插入图片描述

3.2、不稳定/失败效果

在这里插入图片描述

Jenkins集群(高级)

  • Jenkins集群适合当构建任务比较多,并且同时构建的几率比较大时

  • Jenkins的集群不是一个服务放多个服务器上,一个挂掉了,其他的还能用的概念。而是多个服务一起执行构建任务,这个服务执行这个构建任务,另一个服务执行另一个构建任务,实现并行执行不同的任务,互不影响

  • 当只有一台Jenkins服务,构建任务是串行的,必须一个构建完,才能构建下一个。如果还没构建完,又来了一个构建任务,就回进入构建队列中

    在这里插入图片描述

  • 这样后面的队列就会一直等一直等,直到前面的都完成了,才该它执行,比较耗时。

  • 集群服务要求:

    • 只有主节点服务器需要Jenkins服务,其他服务器无需安装Jenkins服务。集群服务要有主节点服务器执行任务所需要的环境,比如JDK、Maven、Node,并且版本尽量一致!!!,否则可能会导致构建环境不一致报错
  • 配置完集群后,我们需要了解任务配置中的两个概念

    • 并发构建:允许当前任务同时有多个节点执行构建,相当于并发操作同一个任务,一般关闭!!!
    • 限制项目运行节点:限制当前任务可以在那些节点上构建,如果有需要不同的服务器构建,则勾选填写规则。否则默认由Jenkins分配,任意节点都可执行
  • 下面我再开两台服务器用来搭建集群,总共三台

    在这里插入图片描述

1、主节点新增集群配置

  • 点击左侧菜单系统管理->节点和云管理

    在这里插入图片描述

  • 可以看到当前只有一个节点master

    在这里插入图片描述

  • 然后点击右上角New Node新增节点,并且输入节点名称

    在这里插入图片描述

  • 配置如下,选择工作目录一般不要直接/root,可以创个jenkins单独的文件夹,因为主节点会发一些文件到从节点配置的目录中,供构建使用。避免误删

    在这里插入图片描述

  • 保存后,可以点击表格中的节点,然后点击左侧日志,查看连接情况

    在这里插入图片描述

  • 等待连接成功表格中会变成如下模样,没有的话可以点击右上角刷新

    在这里插入图片描述

  • 第三个节点可以复制现有节点,修改标签以及服务器连接配置即可

    在这里插入图片描述

  • 最后节点页面如下

    在这里插入图片描述

  • 返回Dashboard页面后,查看左下角,也可以发现配置的节点

    在这里插入图片描述

最后,我们查看集群服务器的/root目录下,可以发现Jenkins主节点自己会给从节点发送文件并且启动jar包等操作,用于集群使用

在这里插入图片描述

2、任务配置

  • 任务配置分为两种分类

    1. 使用Maven插件创建的任务:需要在任务的配置页面选择是否可以并发构建,或者指定某个节点,并发构建一般关闭!

      在这里插入图片描述

    2. 流水线构建的任务:根据Jenkinsfileagent值判断

      1. 如果为any,则由Jenkins分配,任意节点都可执行

      2. 如果为对象,那么根据label属性值,判断指定某个节点执行

        agent {
            label 'jenkins-02 || jenkins-03'  // 同时满足多个标签的节点
        }
        
      3. agent none:不分配全局节点,需每个 stage 单独指定。

  • 指定节点可以使用标签表达式&&、||等表达式

    在这里插入图片描述

3、测试

注意:为了方便演示,我这里勾选允许并发限制节点,不在乎任务成功或失败了。所以才能看到下面多个节点同时构建同一个任务。实际不要勾选

3.1、不限制节点

在这里插入图片描述

3.2、限制节点

3.2.1、只配置了jenkins-02

在这里插入图片描述

3.2.2、配置了jenkins-02 || jenkins-03

在这里插入图片描述

总结

  • 通过上面的步骤,可以发现,配置其实并不难,并且一次配置,可以长期使用。只需要点点按钮即可,非常方便

  • 上面的演示只是基于一个服务演示,文件夹建的比较简陋。正常公司一般都会有很多服务,最好apps目录下建立对应的服务名文件夹,防止意外执行删除其他服务等操作

  • Jenkins执行任务时,会在本地服务所在目录创建一个.jenkins隐藏文件,所有数据都保留在其中,注意不要误删等操作,使用ls -a可以查看到

    在这里插入图片描述

    • jobs:里面存放的是所有任务的配置数据

    • workspace:里面存放任务执行时的缓存数据,比如从代码仓库拉取下来的文件

      在这里插入图片描述

  • 建议:

    • 建议使用流水线构建任务,这样可以可视化的查看任务执行步骤,并且更快定位问题所在步骤。
    • 构建流水线时,根据需求判断使用Web UI方式编写Pipeline还是使用Jenkinsfile编写,优缺点章节初有描述,建议使用Jenkinsfile方式编写
    • 建议流水线配置邮件发送,这样执行情况可以根据邮件实时观察
    • 构建任务多的话,建议使用集群模式,减少任务排队时间
    • 执行sh脚本时,一定要多多测试,确定命令执行目录地址,确定命令是否可能导致误删等操作
  • 注意:由于Jenkins任务一般都会执行一些重置环境的指令,比如删除容器、镜像等操作。执行的命令或脚本一定要测试的没问题了再用到正式环境!!!,并且不要搞错Jenkins任务中命令执行所在的目录地址。必要时可以一条一条命令的配置,然后执行,查看是否按照预期执行

其他功能及配置演示

1、IDEA Jenkins插件

1.1、安装

  • 打开IDEA,搜索并安装Jenkins Control 插件

    在这里插入图片描述

1.2、配置

1.2.1、生成API Token

我们需要先去Jenkins页面中生成一个tokne,在登录插件需要用到

  1. 点击左侧系统管理->管理用户

    在这里插入图片描述

  2. 点击用户右侧下拉列表的Security

    在这里插入图片描述

  3. 右侧API Token中,点击添加新Token按钮,并输入token名称后,生成

    在这里插入图片描述

  4. 一定要保存这个Token,后续就无法查看了。除非重新生成

1.2.2、IDEA插件配置
  • IDEA插件安装完成后,IDEA软件右侧菜单会有一个Jenkins的菜单,点击后,然后点击三个点再点击Jenkins Server Settings

    在这里插入图片描述

  • 然后填写表单内容,并点击TEST CONNECTION,进行连接测试。最后点击OK保存并退出配置弹框

    在这里插入图片描述

  • 然后右侧Jenkins菜单就有我们的任务列表了,一切操作都在菜单中执行

    在这里插入图片描述

1.3、使用

1.3.1、构建
  • 选中任务,双击或者右击Build on Jenkins即可开始构建

    在这里插入图片描述

1.3.2、查看日志
  • 右侧选中任务,点击上面按钮即可查询当前任务的日志

    在这里插入图片描述

  • 右键下面任务信息,然后点击Show Log即可在下面查看当前执行情况的日志

    在这里插入图片描述

2、优化Vite项目打包日志

  • 当你创建了一个Vite项目的任务时,查看日志会发现,当执行pnpm build时,日志会有乱码信息,这是因为这些输出是 Linux 终端中带有 ANSI 颜色代码和控制字符 的日志,用于美化输出(如颜色、加粗、下划线等)。在终端中会正常显示为带颜色的文本,但直接复制到文本文件或 Jenkins 控制台时会显示为类似 [...m 的乱码。

    在这里插入图片描述

2.1、解决方法

  1. Jenkins安装插件AnsiColor
    在这里插入图片描述
  1. Pipeline中,使用pnpm build的脚本时,外面包上ansiColor('xterm') {sh '...'}

    stage('构建代码') {
        steps {
            ansiColor('xterm') {  // 启用 ANSI 颜色解析
                sh """
                pnpm install
                pnpm build
                tar -zcvf dist.tar.gz dist
                """  // 执行带颜色输出的命令
            }
    
            echo '--------------构建完成!--------------'
        }
    }
    

2.2、重新构建查看日志

在这里插入图片描述

插件使用以及坑

sshPublisher插件

1、Remote directory有全局配置和项目配置

在这里插入图片描述

2、连接不上SSH服务器,最终结果是UNSTABLE而不是FAILURE

在这里插入图片描述

3、Remote directory配置只针对发送文件生效,对执行命令所在目录不生效

  • 即便系统配置中Publish over SSH服务器配置了Remote directory/root/aaa,但是Exec command的命令执行目录还是/root

  • 下图中,虽然Remote directoryapps,也会把MySpringBoot*.jar文件放入这个目录中,但是下面执行Exec command的目录所在地依旧是/root。想要修改目录只能先执行cd xxxx,再执行命令

    在这里插入图片描述

Maven插件

1、Pipelie中使用需要先在tools中定义,并且要和全局配置的名称一致

在这里插入图片描述

在这里插入图片描述

NodeJS插件

1、Pipelie中使用需要先在tools中定义,并且要和全局配置的名称一致

在这里插入图片描述

在这里插入图片描述

Logo

一站式 AI 云服务平台

更多推荐