一、环境版本
组件 | 版本 |
---|---|
Ubuntu | 20.04 |
JDK | openjdk 1.8.0_292 |
Maven | 3.6.3 |
Git | 2.25.1 |
BitBucket |
二、Maven
安装Maven
# maven 默认安装位置:/usr/share/maven/bin/mvn
sudo apt-get update
sudo apt-get install maven
# 验证安装
mvn -v
# 安装成功显示
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 1.8.0_292, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-81-generic", arch: "amd64", family: "unix"
Jenkins配置
主面板->全局工具配置
三、Jenkins插件
主面板->Manage Jenkins->Manage Plugins->可选插件
1、安装Maven插件
Maven Integration
Pipeline Maven Integration
四、从BitBucket上拉取代码进行编译
1、BitBucket 新应用密码
记录生成的密钥
2、Jenkins Maven 项目
主面板->新建任务
General
源码管理
添加BitBucket上源码地址
构建触发器
(1)触发远程构建
提供接口+令牌方式触发构建,适用于公司后台调用构建
(2)其他工程构建后触发(Build after other projects are build)
项目间有构建顺序和依赖时使用
(3)定时构建(Build periodically)
每天下班前定时统一构建一次,失败的提交要请大家吃零食
(4)轮询SCM(Poll SCM)
BitBucket无法访问内网时使用,定时扫码Git库,查看是否有提交
#教程
第一颗*表示分钟minute:取值0-59,第几分钟执行
第二颗*表示小时hour:取值0-23,第几小时执行
第三颗*表示日day:取值1-31,第几日执行
第四颗*表示月month:取值1-12,第几月执行
第五颗*表示星期week:取值0-7,每周第几天执行
# 示例
# 每半小时构建一次OR每半小时检查一次远程代码分支,有更新则构建
H/30 * * * *
# 每两小时构建一次OR每两小时检查一次远程代码分支,有更新则构建
H H/2 * * *
# 每天凌晨两点定时构建
H 2 * * *
# 每月15号执行构建
H H 15 * *
# 工作日,上午9点整执行
H 9 * * 1-5
# 每周1,3,5,从8:30开始,截止19:30,每4小时30分构建一次
H/30 8-20/4 * * 1,3,5
(5)WebHook触发构建
BitBucket访问内网Jenkins,主动触发构建
构建环境
Build
# Root POM
pom.xml
# Goals and options
clean install -Dmaven.skip.test=true
Post Steps
# 切换jenkins编译目录
cd /var/lib/jenkins/workspace/hello/target/
# 复制文件到新的位置
cp Hello-0.0.1-SNAPSHOT.jar /usr/local/maven/jar/hello/
cd /usr/local/maven/jar/hello/
# 杀死原来的进程,启动新的进程,参数为restart重启
BUILD_ID=dontKillMe sh hello.sh restart
shell脚本 hello.sh
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=Hello-0.0.1-SNAPSHOT.jar
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh demo.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist() {
pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
echo "starting..."
#nohup java -jar $APP_NAME > /dev/null 2>&1 &
java -jar $APP_NAME &
fi
}
#停止方法
stop() {
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is not running."
fi
}
#重启
restart() {
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
如果要把APP_NAME也当做参数传入,则可$1为操作start、stop等,$2为APP_NAME
执行
# 杀死原来的进程,启动新的进程,参数为restart重启
BUILD_ID=dontKillMe sh hello.sh restart Hello-0.0.1-SNAPSHOT.jar
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=$2
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh demo.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist() {
pid=`ps -ef | grep $APP_NAME | grep -v -e grep -e $0| awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
echo "starting..."
java -jar $APP_NAME &
fi
}
#停止方法
stop() {
is_exist
if [ $? -eq "0" ]; then
kill -15 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is not running."
fi
}
#重启
restart() {
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac