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