1、 Jenkins简介
Jenkins是一款开源的持续集成工具,用于自动化构建、测试和部署软件项目。它可以通过插件扩展来支持各种不同的开发语言和工具。Jenkins提供了一个简单易用的Web界面,可以通过界面配置和管理构建任务,也可以通过命令行工具进行操作。
Jenkins的核心功能是构建和测试软件项目。它可以从源代码管理系统(如Git、SVN等)中拉取代码,并根据预先定义的构建脚本进行编译、打包和测试。Jenkins还提供了丰富的插件和集成工具,可以与各种测试框架、部署工具、静态代码分析工具等进行集成,从而实现全自动化的构建和测试流程。
2、实际案例分析
开发测试之后,我们希望在生产上更新代码。关于如何把打包后的代码放到生产环境,有以下两个基本方法。
1.在生产机器上安装代码打包相关的环境,例如git,maven等,重新检出/更新代码,直接在生产机器上打包生成目标代码。(这种方式容易暴露代码,不安全)
2.在本地内网打包,再传送到远程生产环境进行部署。(这种方式可以实现代码本地加密,比较安全)
本文演示如何使用jenkins,在本地代码更新打包代码,然后再发送到远程进行部署。
操作步骤
- jenkins通过绑定源代码仓库,自动检出/更新代码
- 本地打包依赖,生成目标jar包
- 通过ssh部署到远程指定目录
- 远程执行重启脚本
3.案例步骤
3.1、绑定源代码仓库,自动检出/更新代码
进入Jenkins管理工具,新建任务,选择构建自由风格选项,输入相关参数,点击确定
滑动到“源码管理”模块,如果没有这个模块,可以在jenkins插件仓库下载 "Git 插件"
输入项目地址及票据,点击保存。之后jenkins就会在本作业内部的工作目录检出项目代码。
3.2、本地打包代码
使用jenkins进行打包,我们通过增加构建步骤,执行shell来执行。如下图。
jenkins会自动为每个作业生成一个工作目录,如果不熟悉工作目录的生成路径,可以在脚本使用
pwd命令打印下。
通过mvn进行打包,并把生成的jar包及依赖环境拷贝到当前目录(打包脚本依个人项目而异)。
3.3、部署jar包到生成环境
接下来就需要将生成的包部署到远程目标,这一步是关键,也比较麻烦。
3.3.1安装ssh工具
Jenkins 提供了多种 SSH 相关的插件,用于支持 SSH 连接、远程执行任务、传输文件等操作。以下是一些常用的 Jenkins SSH 插件。
-
SSH Plugin (ssh): 这是 Jenkins 的核心插件之一,提供了基本的 SSH 连接和执行远程命令的功能。
-
SSH Build Step / SSH一步构建 (ssh-steps): 允许在构建过程中执行 SSH 命令。
-
SSH Agent Plugin (ssh-agent): 这个插件用于管理 SSH 密钥,可以安全地存储和使用 SSH 私钥。
-
SCP Plugin (scp): 用于通过 SCP 协议在 Jenkins 与远程服务器之间安全地传输文件。
-
SFTP Plugin (sftp): 支持通过 SFTP 协议上传和下载文件到远程服务器。
-
Publish over SSH: 允许你通过SSH协议将构建后的文件传输到远程服务器。
本文选择Publish over SSH工具进行演示。
首先,需要到jenkins插件仓库下载“Publish Over SSH”,下载之后,效果如下。
其次,配置远程ssh私钥
进入jenkins系统设置
配置远程服务器的登录信息(点击高级配置ssh私钥),如下。
配置之后,可以点击右下角的按钮,检查下配置是否生效(显示Success)。
3.3.2.使用ssh工具
返回到作业配置,滑动到SSH模块
选择远程服务器的名称,增加TransferSet
需要注意的是,这里的
source files是相对于Jenkins作业的工作目录而言,如果有多个文件,可以用逗号隔开。
remote directory是远程服务器的目标目录,可以使用绝对路径。
exec command是传送文件之后在远程服务器执行的命令。
这里的传送文件,和执行脚本,至少选择一项。
如果需要先在远程服务器执行脚本,再传送文件,可以配置两个TransferSet。第一个配置执行脚本,第二个再配置传送文件。
具体的说明,可参考:
publish-over-ssh相关说明
3.4、远程执行脚本
在上一节的ransferSet配置传送文件之后,再执行脚本。
脚本的主要内容是:
1.检查服务是否启动,如果是,则先停止;
2.通过定制的jvm参数,重新启动服务器
脚本大致如下:
#!/bin/bash
pid=`jps -lv|grep yourserver|awk '{print $1}'`
if [ -z $pid ]; then
echo "app web stopped"
else
echo "app web is running, prepared to stop"
kill -9 $pid
echo "app web has stopped"
fi
#稍等片刻
sleep 2
JVM_ARGS="-Xms1024m -Xmx1024m "
JVM_ARGS="$JVM_ARGS"" -XX:+UseZGC -XX:+PrintGCDetails"
nohup java $JVM_ARGS -jar yourserver.jar --spring.profiles.active=test > output.file 2>&1 &
sleep 3
pid=`jps -lv|grep yourserver|awk '{print $1}'`
echo “server is running, pid = $pid”
至此,使用Jenkins进行远程部署的案例演示已经结束。通过Jenkins,我们可以非常方便地进行远程部署。但是,这种方式适合部署少量的远程服务,如果需要进行大批量的作业,可能需要结合ansible工具进行批量处理。