团队一直在用Jenkins做自动化部署,今天邀请了团队的小伙伴 @null(dingmingyang),分享下他的经验。

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,主要用于持续、自动地构建或测试软件项目、监控外部任务的运行。使用Java语言编写,可在Tomcat等流行的Servlet容器中运行,本文示例是把Jenkins部署在Tomcat容器中。

目标:

把一个前后端分离项目(SpringBoot + Vue),自动部署到服务器上。

一、安装启动

1.下载源码

将官网(https://www.jenkins.io/download/)下载好的war包,放入`tomcat`的`webapp`目录下启动项目。

2.访问项目

访问:http://ip:8080/jenkins/

提示需要输入管理员密码,输入目录cat /var/jenkins_home/secrets/initialAdminPassword中的存储的密码,点击继续,会初始化一小段时间。

image.png

3.安装插件

如果服务器可以联网先安装推荐插件,后期再根据需求下载安装。如果没有联网,可以去官网下载插件后离线安装。

image.png

3.1 建议安装插件

简单介绍用到的插件,方便后期配置与部署

  • Maven Integration maven构建项目插件 ,用于构建Maven 2/3作业;
  • Git client git客户端插件为Jenkins插件提供了git应用程序编程接口(API);
  • Git git插件为Jenkins项目提供了基本的git操作;
  • SSH 该插件来自非常酷的scp插件(https://wiki.jenkins.io/display/JENKINS/SCP+plugin),可以使用SSH插件通过ssh在远程计算机上运行shell命令;
  • Publish Over SSH 也是一款scp插件;
  • FTP publisher 该插件可用于将项目工件和整个目录上载到ftp服务器;
  • NodeJS Plugin 为NodeJS和npm软件包提供Jenkins集成;
  • Role-based Authorization Strategy 为Jenkins提供角色管理;
  • Git Parameter 这个插件允许在构建中分配git分支,标签
  • Workspace Cleanup Plugin 工作空间清理插件;
  • localization-zh-cn 中文插件;
  • Pipeline: Declarative 构建发布流水线。

注意: 离线安装插件时可能会报错,根据提示信息先按照其他依赖插件。要使用Git插件前先在服务器上安装Git客户端。

4.创建用户

安装完毕后,会创建管理员用户,输入用户名,密码,电子邮箱,点击保存并完成

image.png

5.配置url

提示配置jenkins URL,这里保持默认即可,继续点击保存并完成,提示jenkins已经就绪,开始使用jenkins。

image.png

二、配置Jenkins配置

点击左侧菜单manage Jenkins管理Jenkins,进入管理页面,再点击 Global Tool Configuration 全局工具配置。

1. JDK配置

找到下图配置点,添加别名:这个随便填。JAVA_HOME:这个填写Jenkins服务器上的jdk安装目录。

image.png

2. Git配置

找到下图配置点,添加 Name:这个随便填。Path to Git executable:填写Jenkins服务器上的Git安装可执行路径。

image.png

3. Maven配置

  • 找到下图配置点,添加Name:这个随便填。MAVEN_HOME:填写Jenkins服务器上的Maven安装目录。

image.png

  • 填写完Maven安装目录后,填写Mavensettings.xml文件路径,这样就可以进行Maven私服地址、本地仓库的配置了。

image.png

4. NodeJs配置

找到下图NodeJS配置,选择自动安装即可

image.png

5. Publish Over SSH配置

  • 配置ssh远程发布配置。因为Jenkins的安装服务器和业务运行的服务器可能不是在同一服务器这时候就需要使用scp传输文件,前文提到的Publish Over SSH插件就是文件传输。通过ssh将工作空间的文件传输到相关目录;
  • Publish Over SSH 提供2种方式连接一种是秘钥,还有个是账号密码;
  • 如下图提供装密码方式配置仅供参考,配置完成后点击Test Configuration进行连接测试 出现Success字样表示连接成功。

image.png

三、使用Jenkins构建SpringBoot项目

1. 新建Item

点击新建Item新建一个Item,如下图选择构建一个Maven项目。

image.png

2.各项配置概述

image.png

上图是构建任务设置界面,可以看到上方的几个选项”General”, “源码管理”, “构建触发器”,”构建环境”, “构建”, “构建后操作”等一些选项。下面逐一介绍。

2.1 General

General是构建任务的一些基本配置。名称,描述之类的。

  • 项目名称: 是刚才创建构建任务步骤设置的,当然在这里也可以更改。
  • 描述: 对构建任务的描述。
  • 丢弃旧的构建(Discard old builds): 服务器资源是有限的,有时候保存了太多的历史构建,会导致Jenkins速度变慢,并且服务器硬盘资源也会被占满。当然下方的保持构建天数和保持构建的最大个数是可以自定义的,需要根据实际情况确定一个合理的值。

image.png

  • 参数配置: 在General中还可以配置构建参数如分支参数和构建完成后不杀死进程参数。

image.png

2.2 源码管理

源码管理就是配置你代码的存放位置。

  • Git 支持主流的github和gitlab代码仓库。因我们的研发团队使用的是gitlab,所以下面我只会对该项进行介绍。
  • Repository URL:仓库地址
  • Credentials:凭证。可以使用HTTP方式的用户名密码,也可以是RSA文件。 但要通过后面的”ADD”按钮添加凭证。
  • Branches to build:构建的分支。*/master表示master分支,也可以设置为其他分支,下图用的是前面设置的分支参数。

image.png

2.3 构建触发器

构建触发器,顾名思义,就是满足某些条件后构建任务。

  • Build whenever a SNAPSHOT dependency is built: 可以设置当某些上游任务没有成功构建时调度构建;
  • 触发远程构建(例如,使用脚本): 该选项会提供一个接口,可以用来在代码层面触发构建。这里不做介绍。
  • Build after other projects are built: 该选项意思是”在其他projects构建后构建”。
  • Build periodically: 周期性的构建。很好理解,就是每隔一段时间进行构建。日程表类似linux crontab书写格式。如下图的设置,表示每天的12点和23点进行一次构建。
  • Poll SCM:该选项是配合上面这个选项使用的。当代码仓库发生改动,jenkins并不知道。需要配置这个选项,周期性的去检查代码仓库是否发生改动。

image.png

2.4 构建环境

构建环境就是构建之前的一些准备工作,如指定构建工具。下图中是勾选Send files or execute commands over SSH before the build starts,运行构建后将文件传输到相关服务器执行shell命令。

image.png

  1. 源目录:aml-server/target/aml-server.jar
  2. 删除文件前缀:aml-server/target/
  3. 目标服务路径:/aml
  4. #五天之前的文件夹
  5. time=$(date -d"5 day ago" +"%Y%m%d")
  6. #删除五天之前的文件夹
  7. rm -rf /aml/apps-amls-back/dev/"$time"
  8. #20200623
  9. newDay=$(date +"%Y%m%d")
  10. #20200623_11_48_41
  11. now=$(date +"%Y-%m-%d-%H:%M:%S")
  12. #创建备份目录
  13. mkdir -p /aml/apps-amls-back/dev/"$newDay"
  14. #将jar包备份
  15. mv /aml/apps/aml-server.jar /aml/apps-amls-back/dev/"$newDay"/aml-server-"$now".jar
  16. #将jar包拷贝至项目目录
  17. mv /aml/aml-server.jar /aml/apps/aml-server.jar
  18. #启动项目
  19. sh /aml/apps/amls.sh restart aml

2.5 构建

因为创建是一个Maven的Item,所以选择根pom.xml,填入打包命令。

  • Post Steps: 构建后的步骤:构建成功时执行;构建失败时执行;无论构建结果如何都是执行。

image.png

四、使用Jenkins构建vue项目

1. 创建vue job item

点击新建item,选择 Freestyle project,输入job名称。如下图

image.png

点击确认后进入编辑页面,跟前面的构建maven项目一样 可以看到上方的几个选项”General”, “源码管理”, “构建触发器”,”构建环境”, “构建”, “构建后操作”。

image.png

2. 填写基本信息配置项

与构建maven项目一样有描述,需要填写描述,Discard old builds,参数,源码管理。

  • 描述,Discard old builds

image.png

  • 参数

image.png

  • 源码管理

image.png

3. 构建环境

如下图 Provide Node & npm bin/ folder to PATH 选择下图配置,选择vue构建环境。

image.png

4. 构建

选择完了构建环境即可进行vue打包命令配置书写如下图,因为Publish Over SSH传输文件夹不方便所有将文件夹打包成tar包。打包前将之前工作空间中的dist删除。
image.png

echo $PATH
#删除之前的包
rm -rf dist
#rm -rf dist.tar
#检查node版本
node -v
#检查npm版本
npm -v
#重新指定镜像下载路径,需要提前在Jenkins服务器上登录私服
 npm config set http://172.28.30.78:8081/repository/aml-web
#安装项目依赖
npm install
#执行打包
npm run build:prod
#进入dist
cd dist
#删除包
rm -rf vue.tar.gz
#将工作区dist文件打包
tar -zcvf vue.tar.gz *

其中指定了私服的镜像路径,也可指定淘宝镜像(https://registry.npm.taobao.org)。

5.构建后操作

利用Publish Over SSH,传输文件执行命令

image.png

源文件:dist/*.tar.gz
删除文件前缀:dist/
目标服务器路径:/opt/aml/docker/nginx/html

#20200623
newDay=$(date +"%Y%m%d")
#20200623_11_48_41
now=$(date +"%Y-%m-%d-%H:%M:%S")
#创建备份目录
mkdir /opt/aml/docker/nginx/html/back/guoxin80/"$newDay" -p
#原目录备份
mv /opt/aml/docker/nginx/html/guoxin80 /opt/aml/docker/nginx/html/back/guoxin80/"$newDay"/"$now"
#创建guoxin80
#cd /opt/aml/docker/nginx/html 
#mkdir guoxin80
mkdir /opt/aml/docker/nginx/html/guoxin80 -p
#解压文件到指定目录
tar -zxvf /opt/aml/docker/nginx/html/vue.tar.gz -C /opt/aml/docker/nginx/html/guoxin80/
#删除gz包
rm /opt/aml/docker/nginx/html/vue.tar.gz
#五天之前的文件夹
time=$(date -d"5 day ago" +"%Y%m%d")
#删除五天之前的文件夹
rm -rf /opt/aml/docker/nginx/html/back/guoxin80/"$time"

注意: 在编写shell脚本时或者其他情况下尽量使用绝对路径,避免出现不必要的麻烦。

🍏最后

这样我们就能把SpringBoot + Vue项目自动部署服务器了。解放你的双手,再也不用每天重复执行执行 打包-上传-重启 了!

各位客官且慢,原创不易,点个赞再走呗。关注公众号【读钓的YY】可以白嫖😘,别下次一定了,就这次🤣
扫码_搜索联合传播样式-标准色版.png