Jenkins是基于Java开发的一种持续集成工具,是一个开放易用的软件平台。
- 持续的软件版本发布/测试项目。
- 监控外部调用执行的工作。
安装
Jenkins有多种安装方式,包括Linux、Max OS、Window等,这里我只介绍最简单的方式,使用war包,通过java启动。
下载地址:https://jenkins.io/download
java -jar jenkins.war --httpPort=8081
- httpPort 用于指定启动的端口号,如果不加此参数,默认为8080
启动后,就可以通过http://localhost:8081
访问了
从提示的路径/root/.jenkins/secrets/initialAdminPassword
中获取解决密码
选择Select plugins to install
,自己根据需求选择要安装的插件
点击上面的【None】,不选择任何插件
jenkins-customize-plugins创建管理用户
jenkins-create-userJenkins首页
jenkins-home基础配置
依次进入【系统管理】 -> 【Global Tool Configuration】
分别新增【JDK】、【Maven】,并保存
jenkins-global-tool-configuration安装插件
依次进入【系统管理】 -> 【插件管理】 -> 【可选插件】
可以直接通过Ctrl + F
在浏览器上搜索,快速找出指定插件
-
Folders Plugin
创建任务分组,方便管理 -
Git plugin
从Git中获取源码 -
Publish Over SSH
把本地文件发布到远程,还可以发送一些命令到远程机器上执行 -
Multiple SCMs Plugin
一个项目中同时多不同的Git源获取代码
坑:安装过程中如果有失败的,可以把失败的插件记下来,回到【可选插件】重新安装,或者【已安装】中卸载后重新安装。如果还不行,或者有莫名其妙的错误提示,可以重启Jenkins服务试试
系统设置
依次进入【系统管理】 -> 【系统设置】
设置Publish Over SSH
插件的远程机器的连接账号
翻到【Publish over SSH】新增【SSH Servers】,可以点【Test Configuration】测试连接是否成功
jenkins-publish-over-ssh-configuration坑:无法保存【Remote Directory】、【Passphrase / Password】,导致之后的使用过程中无法正常连接。最后我是使用浏览器的【无痕】模式打开页面,才保存成功了
创建任务
依次进入【新建】,名称spring-boot-example
,类型Floder
点击【New Item】,名称deploy
,类型构建一个自由风格的软件项目
选择【构建】页,添加两个【Execute shell】,添加两个【Send files or execute commands over SSH】
不使用【源码管理】页中的Git,使用本地Git,编译后再复制到Job工作目录下,这样可以更灵活的处理源码
spring-boot-example 示例:GitHub
坑:Jenkins的【源码管理】每次更新代码的时候,都会把已有的修改重置,但是我需要对源码做特殊的修改,就选择了这么处理
# 1. 更新Git
# 2. 编码源码
cd /usr/conanli-repository/spring-boot-example && git pull
mvn -f /root/conanli-repository/spring-boot-example/spring-boot-example-admin-server clean install -Dmaven.test.skip=true
# 1. 清空Job工作目录
# 2. 把自己封装的脚本,以及打包后的jar包复制到Job工作目录下
rm -f $WORKSPACE/*
cp -f /root/conanli-repository/conan.sh $WORKSPACE
cp -f /root/conanli-repository/spring-boot-example/spring-boot-example-admin-server/target/spring-boot-example-admin-server-*.jar $WORKSPACE
选择我们刚新增的SSH Server 192.168.198.161
把脚本conan.sh
(文章未附具体内容)上传到/conanli-workspace
,并执行
坑:上传的远程目录Remote directory
是相对目录,相对于我们新建SSH Server
时的/root
目录,所以文件最后会上传到/root/conanli-workspace
下
坑:上传的脚本是不可执行的,需要使用sh conan.sh
的形式执行
坑:脚本内没有引入自定义的PATH
环境,例如我的JDK是解压安装的,在脚本内有使用java
命令,那么我需要在脚本中添加export PATH=$PATH:/usr/jdk8/bin
# 对旧的jar包进行备份,关闭,删除
cd /root/conanli-workspace
sh conan.sh -f spring-boot-example-admin-server-*.jar -D backup backup stop remove
把jar包spring-boot-example-admin-server-*.jar
上传到/conanli-workspace
,并执行
# 启动新的jar包
cd /root/conanli-workspace
sh conan.sh -f spring-boot-example-admin-server-*.jar -l spring-boot-example-admin-server.log start
jenkins-job-deploy
执行任务
保存编辑,点击【立即构建】
在【Build History】中选择相应的记录,在【Console Output】可以看到部分执行记录
jenkins-execute-job jenkins-build-historyconan.sh脚本
#!/bin/bash
export PATH=$PATH:/usr/jdk8/bin
project=
server_port=8080
log=
backup_dir=
help() {
echo "usage: $0 -f PROJECT -p SERVER_PORT -l LOG -D BACKUP_DIR backup|stop|remove|start"
echo "-------------------------"
echo "多个命令可以按顺序执行,例如:$0 -f PROJECT -l LOG stop start"
echo "PROJECT 项目路径"
echo "SERVER_PORT 启动端口号,默认:8080"
echo "LOG 日志路径"
echo "BACKUP_DIR 备份目录"
echo "-------------------------"
}
backup() {
if [ ! $project ]
then
echo "项目路径不能为空"
return
fi
if [ ! $backup_dir ]
then
echo "备份目录不能为空"
return
fi
suffix=$(date +%Y%m%d%H%M%S);
backup_name=${project##*/}.$suffix
backup=$backup_dir/$backup_name
echo "原项目 $project"
echo "备份到 $backup"
echo " 脚本 cp $project $backup"
cp $project $backup
}
stop() {
if [ ! $project ]
then
echo "项目路径不能为空"
return
fi
project_name=${project##*/}
pid=$(ps -ef | grep "$project_name" | grep -v grep | grep -v conan.sh | awk '{print $2}')
if [ $pid ]
then
echo " 关闭 $project_name"
echo " 进程 $(ps -ef | grep "$project_name" | grep -v grep)"
echo " 脚本 kill $pid"
kill $pid
fi
}
remove() {
if [ ! $project ]
then
echo "项目路径不能为空"
return
fi
echo " 删除 $project"
echo " 脚本 rm -f $project"
rm -f $project
}
start() {
if [ ! $project ]
then
echo "项目路径不能为空"
return
fi
if [ ! $log ]
then
echo "日志路径不能为空"
return
fi
project_name=${project##*/}
pid=$(ps -ef | grep "$project_name" | grep -v grep | grep -v conan.sh | awk '{print $2}')
if [ ! $pid ]
then
script="java -jar $project --server.port=$server_port"
echo " 启动 $project"
echo " 脚本 nohup $script > $log 2>&1 &"
nohup $script > $log 2>&1 &
fi
}
while getopts "f: p: l: D:" opt
do
case $opt in
f)
project=$(ls $OPTARG)
;;
p)
server_port=$OPTARG
;;
l)
log=$OPTARG
;;
D)
backup_dir=$OPTARG
;;
?)
;;
esac
done
shift $(($OPTIND - 1))
echo "按顺序执行 $@"
for act in $@
do
case $act in
backup)
backup
;;
stop)
stop
;;
remove)
remove
;;
start)
start
;;
*)
echo "unknow argument"
;;
esac
done
PS:本文使用的是jenkins-2.46.3
网友评论