更新机制是指项目如何进行更新,主要有两种方式:一种是自动推送,另外一种是手动拉取。前者用于开发环境、后者可以用于所有环境
1. 手动拉取 拉取更新流程:
sudo -i 输入密码,进入root目录
上述流程由 deploy.sh 脚本实现:
1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash -e cd "`dirname $0 `" . ./pom.shecho "deploy time: $work_time " mkdir -p war/ war=war/$pom_a -$pom_v .war download_path="$nexus_redirect ?r=$pom_r &g=$pom_g &a=$pom_a &v=$pom_v &e=war" wget $download_path -O $war deploy_war
pom.sh 脚本内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #!/bin/bash -e . ../bin/env-set.sh pom_g=org.example pom_a=test-jenkins pom_v=1.0-SNAPSHOT pom_r=snapshots deploy_war() { target_d=war/${pom_a}-${pom_v}-$work_time target_dir=`pwd`/$target_d if [ ! -f "$war" ]; then echo "war not exist: $war" exit 1 fi unzip -q $war -d $target_dir rm -rf appwar ln -sf $target_d appwar ./tomcat.sh stop target_ln=`pwd`/appwar echo '<?xml version="1.0" encoding="UTF-8" ?> <Context docBase ="'$target_ln'" allowLinking ="true" > </Context > ' > conf/Catalina/localhost/ROOT.xml ./tomcat.sh start }
tomcat.sh 内容:
1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash if [ "`whoami`" != "root" ];then echo "Error: You must be apps to run this command." exit 1fi cd "`dirname $0 `" . ../bin/env-set.sh . ./pom.shexport CATALINA_BASE="`pwd`" tomcat "$1 " "${pom_a} -${pom_v} "
env-set.sh内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 #!/bin/bash -e export now_time=$(date +%Y-%m-%d_%H-%M-%S) [ -z "$work_time " ] && export work_time=$(date +%Y-%m-%d_%H-%M-%S)if [ -z "$g_env_set " ]; then unset JRE_HOME JAVA_HOME CLASSPATH export nexus_redirect="http://localhost:8081/nexus/service/local/artifact/maven/redirect" export data_home="/var/root/svr" export server_home="$data_home /services" export JAVA_HOME="$data_home /jdk" export CATALINA_HOME="$data_home /apache-tomcat" export CATALINA_BASE="$CATALINA_HOME " export PATH=$JAVA_HOME /bin:$PATH export g_env_set=true fi proc_find () { if [ "$# " = 2 ]; then ps -eo pid,cmd|grep -v 'cmd\|grep' |grep "$1 " |grep "$2 " |sed 's/^ *\(.*\) *$/\1/' else ps -eo pid,cmd|grep -v 'cmd\|grep' |grep "$1 " |sed 's/^ *\(.*\) *$/\1/' fi }proc_pid () { proc_find "$@ " | cut -d ' ' -f1 }proc_kill () { grep_args="${@:2} " for ((i=1;i<=$1 ;++i)) do pids=(`proc_pid "$grep_args " `) [ ${#pids[@]} = 0 ] && return 0 echo "n=$i kill ${pids[@]} " kill ${pids[@]} sleep 1s done pids=(`proc_pid "$grep_args " `) [ ${#pids[@]} = 0 ] || kill -9 ${pids[@]} }tomcat_start0 () { [ "$JAVA_OPTS " = "" ] && export JAVA_OPTS="-server -XX:MaxPermSize=128m -Xms512m -Xmx512m" [ "`echo " $JAVA_OPTS "|grep '\-Djava.security.egd='`" = "" ] && export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom" export JAVA_OPTS="-Djava.awt.headless=true $JAVA_OPTS -$grep_server " echo "START $grep_server : JAVA_OPTS=$JAVA_OPTS " "$CATALINA_HOME " /bin/startup.sh }tomcat_stop0 () { proc_kill 3 "$grep_server " }tomcat_status0 () { tmp=`proc_find "$grep_server " ` if [ -z "$tmp " ]; then echo "$grep_server stopped." else echo "$grep_server running: $tmp " fi }tomcat () { if [ "$1 " = "" ]; then printf 'Usage: %s {start|stop|restart|status} ????\n' "$prog " exit 1 fi if [ "$2 " = "" ]; then echo 'java -Dmykey=${mykey} miss: mykey' exit 1 fi if [ "$CATALINA_BASE " = "" ]; then echo 'miss: $CATALINA_BASE=' exit 1 fi cd "$CATALINA_BASE " export grep_server="Dmykey=${2} x" case "$1 " in start) tmp=`proc_find "$grep_server " ` if [ -z "$tmp " ]; then tomcat_start0 else echo "$grep_server already running: $tmp " fi sleep 1s ;; stop) tomcat_stop0 tomcat_status0 ;; status) tomcat_status0 ;; restart) tomcat_stop0 tomcat_start0 sleep 1s tomcat_status0 ;; *) printf 'Usage: %s {start|stop|restart|status} ????\n' "$prog " exit 1 ;; esac }
项目打包完成后,运行deploy.sh
完成更新
代码地址 :pyr9/jenkins-script (github.com)
2 自动推送 自动推送方式采用在 jenkins 构建完成之后,执行远程 sh 脚本用于下载本次构建 WAR 包,在自动部署重启。
1. jenkins 授予可读权限 不配置会403
2. jenkins 配置执行脚本
1 2 3 BUILD_ID=dontKillMeecho $BUILD_ID ssh root@localhost BUILD_URL=$BUILD_URL /var/root/svr/services/test-jenkins-demo/jenkins.sh
jenkins.sh内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/bash -e source /etc/profilecd "`dirname $0 `" . ./pom.shecho "deploy time: $work_time " mkdir -p war/ war=war/$pom_a -$pom_v .warecho "${BUILD_URL} ${pom_g} \$${pom_a} /artifact/$pom_g /$pom_a /$pom_v /$pom_a -$pom_v .war" /opt/homebrew/bin/wget "${BUILD_URL} ${pom_g} \$${pom_a} /artifact/$pom_g /$pom_a /$pom_v /$pom_a -$pom_v .war" -O $war deploy_war
3. ssh设置免密登录 (添加公钥到服务器)SSH免密登录 - 楼上有只喵 (pyr9.github.io)
注意事项⚠️:
上面如果使用wget 而不是/opt/homebrew/bin/wget 会出现 404 Not Found