Jenkins
Table of Contents
pull jenkins
docker pull jenkins/jenkins
docker-compose.yml
version: "2"
services:
jenkins:
image: jenkins/jenkins
ports:
- 33331:8080
- 50000:50000
dkc up -d 输出密码
************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: c3ee9fde9e6748d883b8359a4a03579c This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* *************************************************************
使用密码进入页面,选择 `install suggested plugins`
- 下载插件需要很长时间
Post Steps
# 保留文件数
RESERVED_NUM=5
# 模块文件夹
FILE_DIR=${WORKSPACE}/${MODULE}
# 备份文件夹
FILE_BAK_DIR=${FILE_DIR}/${PROFILES}/bak
DATE=$(date "+%Y%m%d-%H%M%S")
case ${STATUS} in
Deploy)
echo "发版"
# 创建每次要备份的目录
path="${FILE_BAK_DIR}/${BUILD_NUMBER}"
if [ ! -d ${path} ]
then
mkdir -p ${path}
fi
# 将打包好的war包备份到相应目录,覆盖已存在的目标
cp -f ${FILE_DIR}/target/*.jar ${path}
# 进入备份目录
cd ${FILE_BAK_DIR}
# 当前有几个文件夹,即几个备份,删除多余备份
fileNum=$(ls -l | grep '^d' | wc -l)
while [ ${fileNum} -gt ${RESERVED_NUM} ]
do
# 获取最旧的那个备份文件夹
oldFile=$(ls -rt | head -1)
echo ${DATE} "删除备份文件:"${oldFile}
rm -rf ${FILE_BAK_DIR}/${oldFile}
let "fileNum--"
done
echo "备份完成"
;;
Rollback)
echo "回滚"
echo "VERSION:${VERSION}"
# 如果文件夹不存在或文件夹太小,则判断备份文件不存在,直接返回
if [ ! -d ${FILE_BAK_DIR}/${VERSION} ] || [ $(du -s ${FILE_BAK_DIR}/${VERSION} | awk '{print $1}') -lt 100 ]
then
echo "备份文件不存在"
# 抛出异常,让 Jenkins 构建失败
set -e
# 退出
exit 1
fi
# 进入备份目录
cd ${FILE_BAK_DIR}/${VERSION}
# 将备份拷贝到程序打包目录中,并覆盖之前的war包
cp -f *.jar ${FILE_DIR}/target/
;;
*)
set -e
exit 1
;;
esac
构建后操作
#!/bin/bash
echo "进入服务"
EXPORT BUILD_ID=dontkillme
EXPORT JAVA_HOME PATH CLASSPATH
JAVA_HOME=/data/jdk1.8.0_211
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
FILE_DIR=/runWork
JARFILE=dpb-admin-fms-0.0.1-SNAPSHOT.jar
PROFILE_JAR_FILE=uat_dpb-admin-fms-0.0.1-SNAPSHOT.jar
des_log=$FILE_DIR/uat_dpb-admin-fms.log
# 设置超时时间,如果达到超时时间项目还未启动则退出
TIMEOUT=100
# 根据模块使用响应端口号
if [ ! -d ${FILE_DIR} ]
then
mkdir -p ${FILE_DIR}
fi
cd ${FILE_DIR}
mv ${JARFILE} ${PROFILE_JAR_FILE}
PROCESS_ID=$(ps -ef | grep ${PROFILE_JAR_FILE} | grep -v grep | awk '{print $2}')
# 如果该项目正在运行,就杀死项目进程
if [ ! -z "${PROCESS_ID}" ]
then
echo "停止服务"
kill -9 ${PROCESS_ID}
else
echo "服务未启动"
fi
nohup java -jar ${PROFILE_JAR_FILE} -Xmx${Xmx} -Xms${Xms} --spring.profiles.active=${PROFILES} --server.port=${PORT} > $des_log 2>&1 &
# 如果该项目还未启动,则等启动后再执行下个发布任务,判断项目是否启动要用端口号占用,不能用进程,因为在项目启动的瞬间进程就有了
sleep 2
second=0
lastShellRow=0
echo [INFO] ">>>>>>>>>>> 日志所在位置"$des_log" 开始输出日志<<<<<<<<<<"
# 日志监测部分
while true
do
nowShellRow=`cat $des_log |wc -l`
showRow=$[nowShellRow-lastShellRow]
if [[ $showRow -ge 0 ]]; then
tail -n $showRow $des_log
fi
sum=`cat $des_log |grep '项目初始化完毕!' |wc -l`
sum_jvm=`cat $des_log |grep 'JVM running for' |wc -l`
failed_sign=`cat $des_log |grep 'Application run failed\|Failed to' |wc -l`
if [ $second -ge 800 ];then
echo [ERROR] ">>>>>>>>>> 部署等待时间过长 退出部署 <<<<<<<<<<<"
ps -ux|grep $PROFILE_JAR_FILE|grep "port="$2|grep -v grep|awk '{print $2}'|xargs kill -9
exit 1
break
fi
if [ $sum -gt 0 ] || [ $sum_jvm -gt 0 ];then
echo [INFO] ">>>>>>>>>> 项目启动花费 $second 秒 <<<<<<<<<<"
break
fi
if [[ $failed_sign -gt 0 ]];then
echo [INFO] ">>>>>>>>>> 项目启动花费 $second 秒 <<<<<<<<<<"
echo [ERROR] ">>>>>>>>>>> 项目启动失败 <<<<<<<<<<<"
exit 1
break
fi
second=$((second + 2))
lastShellRow=$nowShellRow
sleep 2
done
plugs
- git.jpi
- git-client.jpi
- git-server.jpi
- git-parameter
- github.jpi
- github-api.jpi
- github-branch-source.jpi
- publish-over.jpi
- publish-over-ssh.jpi