1. 简介
Jenkins是一个独立的开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。前身是Hudson是一个可扩展的持续集成引擎。可用于自动化各种任务,如构建,测试和部署软件。
官网:https://www.jenkins.io/zh/
- 主要用于:
- 持续、自动地构建/测试软件项目,如CruiseControl与DamageControl;
- 监控一些定时执行的任务。
- 特点:
- 开源免费;
- 跨平台,支持所有的平台;
- master/slave支持分布式的build;
- web形式的可视化的管理页面;
- 安装配置超级简单;
- tips及时快速的帮助;
- 已有的200多个插件。
2. 安装前需要准备
序号 | 名称 | 参考博客 |
---|---|---|
1 | Jdk1.8 | Linux安装Jdk1.8并配置环境变量 |
2 | Maven | Linux安装Maven并配置环境变量 |
3 | Git | Linux安装git |
3. 安装Jenkins
- 添加Jenkins源
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
# 如果之前导入过Jenkins密钥,则此步骤报错,请忽略
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
- yum源安装Jenkins
yum -y install jenkins
- 安装完成后重点目录说明
路径 | 说明 |
---|---|
/usr/lib/jenkins/jenkins.war | War包位置 |
/etc/sysconfig/jenkins | Jenkins配置文件 |
/var/lib/jenkins/ | 默认的Jenkins Home目录 |
/var/log/jenkins/jenkins.log | Jenkins日志文件 |
- 修改端口(可选)
# 因为Jenkins默认端口为8080,容易和Tomcat冲突,因此需要修改为:8010
vim /etc/sysconfig/jenkins
# 修改参数
JENKINS_PORT="8010"
- 启动Jenkins
service jenkins start
- 异常处理
- 报错
因为Jenkins的配置信息中没有Java命令,如果没有安装JDK,则可参考博客:Linux安装Jdk1.8并配置环境变量# 报错信息: Starting jenkins (via systemctl): Job for jenkins.service failed because the control process.service" and "journalctl -xe" for details.
如果通过yum源安装,则Java命令路径为:/usr/bin/java,无需额外配置;如果为介质安装,需要手动添加Java命令路径:/usr/local/java/jdk1.8.0_291/bin/java。建议通过介质安装JDK1.8。vim /etc/init.d/jenkins # 在属性candidates中添加java命令路径 /usr/local/java/jdk1.8.0_291/bin/java
- 警告
提示Jenkins服务在磁盘上已经修改,建议执行# 警告信息: Warning: jenkins.service changed on disk. Run 'systemctl daemon-reload' to reload units.
systemctl daemon-reload
命令。可以执行,也可忽略。- 处理后重新启动Jenkins
service jenkins start
4. 初始化配置
- 浏览器访问:http://{ip}:8010
Jenkins的初始化admin的密码存放在:/var/lib/jenkins/secrets/initialAdminPassword下。
cat /var/lib/jenkins/secrets/initialAdminPassword
- 安装推荐插件
推荐安装Jenkins社区推荐的插件。 - 创建账号
可以创建管理员账号,也可以使用admin账号。这里,点击使用admin账号继续
按钮。 - 实例配置
配置Jenkins实例,点击保存并完成
即可。
5. 开始使用
- 修改admin密码(可选)
如果已经创建了管理员账号,可以使用自己创建的账号。如果继续使用admin账号,为了安全考虑,建议修改admin账号的密码。修改后重新登录即可。
- 如果发现Jenkins的汉化并不是很完整,建议重启
service jenkins restart
- 安装插件
因为目前大部分项目都是Maven项目,因此,需要安装Maven插件。安装选项建议勾选“安装完成后重启Jenkins(空闲时)”。
因为需要将项目远程部署到另外一台服务器,因此需要SSH插件。安装选项建议勾选“安装完成后重启Jenkins(空闲时)”。
- 全局工具配置
- JDK配置
需要配置名称,和JAVA_HOME,并取消“自动安装”选项。
# 如果是yum源安装的jdk1.8,则JAVA_HOME路径查询方法为: which java # 返回 /usr/bin/java # ls -l命令 ls -l /usr/bin/java # 返回 lrwxrwxrwx 1 root root 22 Nov 13 14:37 /usr/bin/java -> /etc/alternatives/java # ls -l命令 ls -l /etc/alternatives/java # 返回 lrwxrwxrwx 1 root root 73 Nov 13 14:37 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el7_9.x86_64/jre/bin/java # 则JAVA_HOME路径为:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el7_9.x86_64 # 如果是介质方式安装,则通过环境变量查询JAVA_HOME echo $JAVA_HOME
- Git配置
需要配置名称,和git命令的路径,并取消“自动安装”选项。
which git
- Maven配置
需要配置名称,和MAVEN_HOME路径,并取消“自动安装”选项。
# Maven建议介质方式安装,可以参考博客:https://www.cnblogs.com/cao-lei/p/14768835.html # 根据环境变量查询MAVEN_HOME路径 echo $MAVEN_HOME
- JDK配置
- 系统配置
- 如果需要部署到远程服务器,需要配置SSH相关信息。
配置服务器密码,新增SSH,配置名称、主机名、用户名称和远程路径(建议设置为“/”),点击高级设置,可以设置连接端口等信息。设置完成后可以点击“Test Configuration”按钮测试连接。
- 如果需要部署到远程服务器,需要配置SSH相关信息。
6. 构建任务并发布到远程服务器
填写任务名称,选择“构建一个maven项目”,点击“确定”按钮。
可以填写任务描述。
根据实际情况,可以配置“丢弃旧的构建”。
选择“Git”,填写仓库URL。第一次构建需要设置git账号和密码,以后可以选择之前设置的用户名和密码或者填写新的账号信息。
点击“Credentials”下的添加按钮,在弹出的页面填写用户名和密码,点击“添加”按钮,然后在左侧选择刚刚添加的账号信息即可。
默认指定分支为master分支,可以根据需要修改。
如果项目需要固定的时间构建,则可以配置定时构建。
定时构建的日程表规则如下:
# 语法
* * * * *
# 第一个*表示分钟,取值0~59
# 第二个*表示小时,取值0~23
# 第三个*表示一个月的第几天,取值1~31
# 第四个*表示第几月,取值1~12
# 第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
# 举例
# 每5分钟构建一次
H/5 * * * *
# 每两小时构建一次
H H/2 * * *
# 每天12点构建一次
H 12 * * *
# 每天18点构建一次
H 18 * * *
# 在每前半个小时内的每10分钟构建一次
H(0-29)/10 * * * *
# 每周一到周五的9点至18点之间,每两小时构建一次
H 9-18/2 * * 1-5
建议勾选“Add timestamps to the Console Output”,勾选后在构建的日志信息中会有时间戳。
本次示例中不需要配置。
配置pom.xml的相对位置,一般pom.xml在项目的根路径,因此不需要改动。
配置Maven打包命令:clean install -Dmaven.test.skip=true
。
勾选“Run only if build succeeds”仅在构建成功后运行。
选择“Send build artifacts over SSH”,将构建后的包发送到远程服务器。选择在全局配置中配置的服务器信息,填写迁移包相关信息。
属性 | 说明 | 示例 |
---|---|---|
Source files | 项目生成包的相对路径 | target/*.jar |
Remove prefix | 包路径前缀 | target |
Remote directory | 远程服务器的路径,注意此处为全局配置远程路径(“/”)的相对路径 | /data/app/jar |
Exec command | 指定命令 | sh /data/app/startup.sh |
在/data/app下创建文件startup.sh:
# 创建文件
cd /data/app
touch startup.sh
# 编辑内容
DIR=//data/app/jar/
JARFILE=web-0.0.1-SNAPSHOT.jar
cd $DIR
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9
java -jar $JARFILE > out.log &
if [ $? = 0 ];then
sleep 10
tail -n 100 out.log
fi
# 退出并保存,如果在全局配置的SSH用户不是root用户,请给该用户授权
如果配置了定时构建,可以等下一次执行时间自动构建。当然,点击左侧“立即构建”或者回到首页,点击后边的“构建”按钮即可。
在构建过程中,可以在左侧底部点击进度条查看控制台日志。
7. 构建任务并发布到同一服务器
- 新建任务(点击此处参考上述)
- 配置general(可选,点击此处参考上述)
- 源码管理(点击此处参考上述)
- 构建触发器(可选,点击此处参考上述)
- 构建环境(可选,点击此处参考上述)
- Pre Steps(可选,点击此处参考上述)
- Build(点击此处参考上述)
勾选“Run only if build succeeds”仅在构建成功后运行。
点击“Add post-build step”按钮选择“执行shell”,填写下面脚本:
sh /data/app/jar2/stop.sh
sh /data/app/jar2/startup.sh
- 构建后操作(无需配置)
- 创建脚本
cd /data/app
mkdir jar2
# 创建停止脚本
touch stop.sh
# 编辑内容
#!/bin/bash
echo "start stop SpringBoot Application"
pid=`ps -ef | grep web-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
kill -9 $pid
fi
rm -rf /data/app/jar2/*.jar
echo "end stop SpringBoot Application"
# 保存并退出
# 创建启动脚本
touch startup.sh
# 编辑内容
# export BUILD_ID=dontKillMe为必须。因为默认Jenkins执行完后会kill自己的进程,因此也会将启动的进程kill。
#!/bin/bash
export BUILD_ID=dontKillMe
echo "start startup SpringBoot Application"
cp /usr/local/maven/repository/com/c3stones/web/0.0.1-SNAPSHOT/web-0.0.1-SNAPSHOT.jar /data/app/jar2
cd /data/app/jar2/
nohup java -jar web-0.0.1-SNAPSHOT.jar &
echo "end startup SpringBoot Application"
# 保存并退出
- 特别注意
因为Jenkins使用的默认用户为jenkins,因此在配置完成后,执行构建操作会提示没有权限。
+ sh /data/app/jar2/stop.sh
start stop SpringBoot Application
/data/app/jar2/stop.sh: line 6: kill: (28812) - Operation not permitted
end stop SpringBoot Application
+ sh /data/app/jar2/startup.sh
start startup SpringBoot Application
cp: cannot create regular file ‘/data/app/jar2/web-0.0.1-SNAPSHOT.jar’: Permission denied
end startup SpringBoot Application
Error: Unable to access jarfile web-0.0.1-SNAPSHOT.jar
有两种解决方案:
(1)修改Jenkins默认用户为root,快速但不安全;
vim /etc/sysconfig/jenkins
# 修改JENKINS_USER="jenkins"为root
JENKINS_USER="root"
# 退出并保存
# 重启Jenkins
service jenkins restart
(2)给Jenkins用户授权,安全推荐使用;
此示例使用第一种方案。
- 构建(点击此处参考上述)
8. 扩展
可以将上述Post Steps执行两种脚本合并为一个脚本即可:
# 在执行shell只改为
sh sh /data/app/jar2/restart.sh
# 创建重启脚本
cd /data/app/jar2
touch restart.sh
# 编辑内容
#!/bin/bash
# stop
echo "start stop SpringBoot Application"
pid=`ps -ef | grep web-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
kill -9 $pid
fi
rm -rf /data/app/jar2/*.jar
echo "end stop SpringBoot Application"
# start
export BUILD_ID=dontKillMe
echo "start startup SpringBoot Application"
cp /usr/local/maven/repository/com/c3stones/web/0.0.1-SNAPSHOT/web-0.0.1-SNAPSHOT.jar /data/app/jar2
cd /data/app/jar2/
nohup java -jar web-0.0.1-SNAPSHOT.jar &
echo "end startup SpringBoot Application"