docker jenkins+maven+webhook安装及自动化部署记录
使用docker安装Jenkins,利用maven插件及webhook实现代码推送到指定分支自动部署
一、Jenkins安装
docker安装Jenkins
系统:Ubuntu 20,其他系统对应修改下安装软件的命令即可
docker search jenkins
使用第二个安装
#下载镜像
sudo docker pull jenkins/jenkins
#下载完成后创建文件夹 dock启动 -v 挂载使用(按需创建)
mkdir -p /home/zhaopin/docker/jenkins
#加权限
chmod 777 /home/zhaopin/docker/jenkins
#启动容器
docker run -d -uroot -p 8000:8080 -p 50000:50000 --name jenkins -v /home/zhaopin/docker/jenkins:/var/jenkins_home -v /etc/localtime:/etc/localtime jenkins/jenkins
#日志查看- 找初始密码(Please use the following password to proceed to installation 下面)
docker logs jenkins
目前用的阿里云的ecs服务器,端口映射的宿主机的8000端口,那需要对应安全组加上相关配置开放8000端口访问
Jenkins访问及初始化
为了插件可以快速正常安装,访问前修改hudson.model.UpdateCenter.xml文件 site url地址为国内地址: https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json(清华大学官方镜像)
#重启容器
sudo docker restart jenkins
- 访问 http://IP:8000 进入页面,输入上述记录的初始化密码
ps:也可以用root用户,到挂载的宿主机对应文件查看 /home/zhaopin/docker/jenkins/secrets/initialAdminPassword
- 进入安装插件页面:
- 创建管理账户
按需创建完成后就可以进入了,下一步的地址不用修改。
二、安装Jenkins插件
maven部署需要安装插件,插件安装位置下图:
搜索安装, Maven Integration plugin、SSH plugin(提示不安全,后续可以换其他用秘钥的插件)、Gitee Plugin(webhook使用)。
安装后重启,重启可能失败,可以sudo docker ps查看,也可以按需设置挂掉后自动重启。
sudo docker update --restart=always 容器名称
三、Jenkins容器安装maven
#进入容器
sudo docker exec -it 容器ID /bin/bash
apt update
#安装vim及wget工具
apt install vim
apt install wget
cd /usr/local/
#下载maven包
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
tar -zxvf apache-maven-3.3.9-bin.tar.gz
rm apache-maven-3.3.9-bin.tar.gz
#设置maven环境变量
vi /etc/profile
/etc/profile文件末尾增加如下配置:
#set Maven environment
export MAVEN_HOME=/usr/local/apache-maven-3.3.9
export PATH=$MAVEN_HOME/bin:$PATH
source /etc/profile
#查看是否版本可以正常打出
mvn -v
修改Jenkins全局工具配置中Maven配置:
页面底部的maven配置也对应加上
四、创建Maven项目
- 创建任务名
- 按需设置丢弃旧的构建
- 源码管理设置:
Credentials可以点击下方的添加按钮添加对应Repository url git项目账号密码
- 构建触发器
推送到指定分支的时候触发构建
- Build 设置
按需填写maven build命令
- 编译完成后的设置Post Steps
执行指定脚本
如上设置好后,代码推送到deploy分支,Jenkins对应任务就会自动触发构建及部署,实现推送代码到指定分支即自动完成部署的操作。
附脚本
startup.sh 代码记录:
#!/bin/bash
JARNAME=interview-server.jar
#!编译好的 jar存放地址 Jenkins编译后的地址
SOURCE_DIR=/home/zhaopin/docker/jenkins_home/workspace/zhaopin/interview-server-web/target
#! jar 存放地址
CURR_DIR=/home/zhaopin/interview-server
#! jar 备份地址
BACK_DIR=/home/zhaopin/interview-server/backup
if [ -f "$CURR_DIR/$JARNAME" ];then
mv $CURR_DIR/$JARNAME $BACK_DIR/$JARNAME.`date +%Y%m%d%H%M%S`
fi
#停止原项目
$CURR_DIR/launch/launch.sh stop
#拷贝Jenkins最新编译后的jar文件到指定目录
cp $SOURCE_DIR/$JARNAME $CURR_DIR
#!删除老旧的备份项目
cd $BACK_DIR
ls -lt | awk 'NR>5{print $NF}' | xargs rm -rf
#启动最新编译的项目
$CURR_DIR/launch/launch.sh start
echo "******************启动成功******************"
launch脚本:(项目文件下创建一个目录存放)
#!/bin/bash
source /etc/profile
DT=`date "+%Y%m%d%H%M%S"`
APP_PATH=$(cd `dirname $0`; cd ..; pwd)
[ -z "$APP_NAME" ] && APP_NAME=$(basename $APP_PATH)
[ -z "$MEM_HEAP" ] && MEM_HEAP=2048
[ -z "$JAVA_HOME" ] && JAVA_HOME=//usr/lib/jvm/java-8-openjdk-arm64
if [[ ! -d "$JAVA_HOME" ]]; then
echo "JAVA_HOME NOT EXISTS!"
exit -1
fi
JAVA_OPTS="-server -Xmx${MEM_HEAP}m -Xms${MEM_HEAP}m -XX:NewRatio=3 -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=3 -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSFullGCsBeforeCompaction=5 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintClassHistogram -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError -DappName=${APP_NAME} -Xbootclasspath/a:${APP_PATH}"
jar_path=${app_dir}/${jar_name}
# 停止脚本
stop(){
echo "正在停止服务..."
tid=`ps aux|grep "$APP_NAME.jar"|grep -v grep|awk '{print $2}' `
if [ "$tid" != "" ]; then
echo "kill -15 $tid"
kill -15 $tid
for i in {1..15}
do
tid=`ps aux|grep "$APP_NAME.jar"|grep -v grep|awk '{print $2}' `
if [[ "$tid" == "" ]]; then
echo "程序已停止。"
return 0
fi
sleep 1
done
tid=`ps aux|grep "$APP_NAME.jar"|grep -v grep|awk '{print $2}' `
if [[ "$tid" != "" ]]; then
echo "[$APP_NAME]PID[$tid]force kill : kill -9 $tid"
kill -9 $tid
fi
fi
}
#启动脚本
start(){
pid=`ps aux|grep "$APP_NAME.jar"|grep -v grep|awk '{print $2}' `
echo $pid
if [ -z "${pid}" ]; then
nohup $JAVA_HOME/bin/java $JAVA_OPTS $SGM_OPTS -jar $APP_PATH/$APP_NAME.jar >> start.log 2>&1 &
echo "${APP_NAME} started"
else
echo "${APP_NAME} 已启动。 pid:${pid} ."
fi
}
restart(){
stop
start
}
case $1 in
"start")
start
;;
"stop")
stop
;;
"restart")
restart
;;
*)
echo "Usage: launch [start | stop | restart] "
;;
esac