Jenkins是现在最流行的持续集成工具,可以帮助我们更方便更规范的发布项目。详细的介绍可以参考
官网
。
本文详细的介绍了Jenkins从安装到配置使用的详细流程,希望可以给大家带来一些帮助。
1. 环境准备
因为在该机器上需要做的步骤有:从gitlab拉取代码,使用maven编译项目,所以需要安装以下环境
- Jenkins
- git
- maven
1.1 安装Jenkins
yum的repo中默认没有Jenkins,需要先将Jenkins存储库添加到yum repos,执行下面的命令:
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
然后执行下面的命令:
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
然后 安装Jenkins
yum install -y jenkins
使用yum安装的方式,Jenkins的配置文件在
/etc/sysconfig
目录下,我们需要对它做些修改。
Jenkins默认端口是8080,容易与其他服务冲突,最好修改下,我这里修改成9503
vi /etc/sysconfig/jenkins
找到端口部分,修改如下
然后启动服务
service jenkins start
启动成功后访问地址:
http://10.7.121.30:9503/
打开主页后,根据提示走就行了,注意一点他会推荐很多插件安装,最好都安装下,后面都有用到。
注意
:后面如果文章中有的输入栏或选项你的Jenkins中没有出现,说明你没有安装对应的插件
其他:
查看初始化密码:
less /var/lib/jenkins/secrets/initialAdminPassword
1.2 安装git
git 安装比较简单
yum install git-core
安装完成后,执行
git
查看是否安装成功
1.2 安装maven
下载maven安装包
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
解压maven安装包
tar -zxvf apache-maven-3.5.4-bin.tar.gz
配置maven环境变量
vi /etc/profile
在底部加入(如果已经有jdk环境变量,注意将PATH合并成一个)
export MAVEN_HOME=/opt/apache-maven-3.5.4
export PATH=$MAVEN_HOME/bin:$PATH
配置文件生效
source /etc/profile
查看maven是否安装成功
mvn -version
2. 配置Jenkins
做完上面的准备工作,下面开始对Jenkins进行配置,
不同的项目架构,配置的方式是不一样的。
如果是简单的单体项目,则只需要配置一个流程就够了:
- 从版本管理拉取最新代码
- 编译
- 上传到服务器
- 执行运行脚本
如果是复杂一点的多模块则需要额外的处理,比如示例项目是一个微服务架构,里面有多个module,使用一个parent module将多个子module联合起来
我这里处理的步骤是分成两个流程:
1. 打包
- 执行parent的mvn package
2. 上传各个服务的jar包及运行启动脚本
先看看配置好的效果,流程分两个步骤,第一个就是打包,第二个就是上传运行发布。
下面的示例主要以这种方式来操作。
2.1 配置parent的打包流程
首先在 “系统管理”-“系统设置” 中找到全局属性这栏,选择环境变量,这里需要配置jdk和maven的环境变量,否则在下面执行maven打包的步骤时会出现(即使在服务器上已经配置过了环境变量,这里还需要配置一下)
mvn: command not found
配置完成,回到首页, 新建一个任务, 输入任务名称,选择“构建一个自由风格的软件项目”,然后点击ok
[外链图片转存失败(img-8JcxDne8-1568714635840)(https://raw.githubusercontent.com/strivezheng/image/master/blog/image.go3kqd4jx2.png)]
进入到了流程的配置页面,第一步
配置项目代码的git地址(svn同理,选择下面的选项输入svn的项目地址),并在“Credentials”点击添加-点击Jenkins
这里认证类型有多种选项,选择最简单用户名密码方式,输入你gitlab的用户名和密码,点击添加
然后在下拉框中选择已经保存过的认证(这一步可能要等一会儿,下拉框才会显示出你添加的认证选项)
这一步配置完了,下面配置编译项目的流程。下拉到底部构建一栏,选择“执行shell”
输入打包命令
mvn package -Dmaven.test.skip=true
点击保存,以上就配置好了编译的流程
回到工程页面,点击“立即构建”,在左下角构建历史中可以看到构建的结果,点击下拉框-控制台输出,可以看到此次运行过程和结果
通过输出可以看到具体的执行过程和结果了。
注意输出结果的第三行的workspace,后面的步骤会用到这个路径,生成的jar包在这个路径下
[外链图片转存失败(img-KadfGCOn-1568714635856)(https://raw.githubusercontent.com/strivezheng/image/master/blog/image.7lzj0euq1fo.png)]
2.2 配置各个服务的上传jar包及启动
在第一个流程执行完成后,已经生成了每个module的可执行jar包文件,这一步的主要操作就是将jar包推送到需要发布的目录,然后执行启动脚本。
这里分两种情况:
-
Jenkins和你要发布的项目
在
同一个服务器 -
Jenkins和你要发布的项目
不在
同一个服务器
两个唯一的区别就是在同一个服务器的话,直接将编译好的jar包通过cp命令复制到要发布的目录下,
不在同一个服务器就需要使用ssh插件将jar包上传到发布服务器的发布目录下
2.2.1 Jenkins和你要发布的项目在同一个服务器
这里主要运行的步骤是:
- 将刚刚编译好的jar包复制到发布环境目录下
- 启动项目
新建任务-选择“构建一个自由风格的软件项目”
下拉到底部构建一栏,选择“执行shell”
输入复制jar包命令
cp /var/lib/jenkins/workspace/aps-parent-compile-test/aps-provider-algorithm/target/algorithm.jar /usr/local/tomcat/aps-provider-algorithm-8082/
输入启动脚本命令,
这里要根据你具体的情况来了,如果你的启动脚本不带有杀掉原进程功能,则还要加一个杀进程的步骤。
同样如果是生产环境,还需要添加备份原jar包的命令,这些脚本都放在下面提供参考。
bash /usr/local/tomcat/aps-provider-algorithm-8082/start8082.sh
注意
Jenkins复制jar包的时候报错
cp: cannot create regular file ‘/usr/local/tomcat/aps-provider-algorithm-8082/algorithm.jar’: Permission denied
这是因为 /usr/local/tomcat 目录权限的问题,这里修改下改目录权限
chmod 777 tomcat -R
点击“保存”-“立即构建”,可以在控制台上看到此次运行结果。
其他服务模块步骤同理,依次创建。
因为创建后面“上传运行”流程与第一个基本类似,后面创建其他流程的时候,可以使用
复制
功能
2.2.2 Jenkins和你要发布的项目不在同一个服务器
这里需要用到插件,可以在“系统管理”-“插件管理”-“可选插件”进行筛选
输入“publish over ”,将这两个都装上
在 “系统管理”-“系统设置”-“Publish over SSH” 配置需要上传的目标服务器配置
:用户名、密码
下面正式开始配置
新建任务-选择“构建一个自由风格的软件项目” ,点击ok
在“构建”栏,新增一个通过ssh发送文件的步骤
这里需要配置三个地方,
- 第一个“name”就是刚刚在全局设置里配置的
- 第二个是需要上传的源文件
- 第三个是需要上传到目标服务器的目录
[外链图片转存失败(img-jDkbUdzI-1568714635886)(https://raw.githubusercontent.com/strivezheng/image/master/blog/image.5i28tv38eka.png)]
继续在“构建”一栏,选择“执行shell”
输入启动脚本命令,
这里要根据你具体的情况来了,如果你的启动脚本不带有杀掉原进程功能,则还要加一个杀进程的步骤。
同样如果是生产环境,还需要添加备份原jar包的命令,这些脚本都放在下面提供参考。
bash /usr/local/tomcat/aps-provider-capacity-8083/start8083.sh
点击-“保存”,回到主界面“立即构建”,查看输出结果
其他
这里贴上我常用的脚本文件
backup.sh
# 备份jar包到jar包所在目录的backup目录下,以当前时间戳重命名
cp -rf capacity.jar backup/capacity_backup_`date '+%Y%m%d_%H.%M.%S'`.jar
start8083.sh
这里指定了jar包运行的端口、应用名、运行环境
#!/bin/sh
source /etc/profile
## 应用选项
CUR_DIR=$(pwd)
APP_DIR=/usr/local/tomcat/aps-provider-capacity-8083
APP_NAME=capacity
APP_PORT=8083
## 环境
APP_PROFILES=dev
JVM_OPTIONS="-Xms256m -Xmx256m"
JAR_NAME=$APP_NAME\.jar
cd $APP_DIR
## 检查进程是否存在
PID=$(ps -ef | grep -w "$APP_NAME" | grep -w "java"| grep -w "$APP_PORT" | grep -v "grep" | awk '{print $2}')
if [ "$PID" == "" ]; then
echo "应用:$APP_NAME 端口:$APP_PORT 进程不存在。"
else
echo "应用:$APP_NAME 端口:$APP_PORT 存在进程:$PID"
kill -15 $PID
sleep 3
## 如果仍然存在则强行停止
CHECK_PID=$(ps -ef | grep -w "$APP_NAME" | grep -w "java"| grep -w "$APP_PORT" | grep -v "grep" | awk '{print $2}')
if [ "$CHECK_PID" == "" ]; then
echo "应用:$APP_NAME 端口:$APP_PORT 进程:$PID 停止成功。"
else
echo "应用:$APP_NAME 端口:$APP_PORT 进程:$PID 强行停止!"
kill -9 $PID
fi
fi
sleep 1
echo "应用:$APP_NAME 端口:$APP_PORT 正在启动..."
nohup java $JVM_OPTIONS -jar -Dspring.profiles.active=$APP_PROFILES $APP_DIR/$JAR_NAME --server.port=$APP_PORT >/dev/null >> nohup.out 2>&1 &
echo "应用启动命令已执行,稍候请检查服务是否可用。"
cd $CUR_DIR
exit 0
stop8083.sh
#!/bin/sh
## 应用选项
APP_NAME=capacity
APP_PORT=8083
## 检查进程是否存在
PID=$(ps -ef | grep -w "$APP_NAME" | grep -w "java"| grep -w "$APP_PORT" | grep -v "grep" | awk '{print $2}')
if [ "$PID" == "" ]; then
echo "应用:$APP_NAME 端口:$APP_PORT 进程不存在。"
else
echo "应用:$APP_NAME 端口:$APP_PORT 存在进程:$PID"
kill -15 $PID
sleep 3
## 如果仍然存在则强行停止
CHECK_PID=$(ps -ef | grep -w "$APP_NAME" | grep -w "java"| grep -w "$APP_PORT" | grep -v "grep" | awk '{print $2}')
if [ "$CHECK_PID" == "" ]; then
echo "应用:$APP_NAME 端口:$APP_PORT 进程:$PID 停止成功。"
else
echo "应用:$APP_NAME 端口:$APP_PORT 进程:$PID 强行停止!"
kill -9 $PID
fi
fi
exit 0
其他错误
:
如果你使用自己的启动脚本,可能遇到Jenkins提示脚本执行成功,但实际上程序没有起来的问题,(直接连接服务器手动运行脚本是可以起来的,说明脚本是没有问题的)
查看日志发现如下提示
nohup: failed to run command ‘java’: No such file or directory
原因是nohup命令没有找到java环境变量(手动执行又是可以找到的,不知道什么鬼)
参考:https://blog.csdn.net/loveli178/article/details/68069361
在sh脚本中加入一句话
source /etc/profile
手动指定环境变量文件,就ok了