jenkins+svn自动发布和回滚

jenkins回滚思路

  1. 当选择版本时,还原归档版本 ${BUILD_NUMBER} # 获取当前build的版本
  2. 还原上一版的操作
  1. 获取要还原版本的war包 在jenkins工作目录/jobs/project_name/某个archive下
  2. 将还原的版本文件替换为当前打包的版本
  3. 将还原的版本替换 jenkins工作目录/workspace/project_name/target/xx.war包
  4. 获取这个还原的war,在进行后续操作
    /xx/jobs/${JOB_NAME}/modules/\*\*/\*\*/\*\*\/\${release_Id}/archive/\*\*/\*\*/\*\*-.war
  1. 配置文件可以通过回归服务器的上一版本.config
  2. 只回滚代码, 没有执行远端

创建-示例

  1. 创建一个maven项目
  2. jenkins 版本回退上个版本 jenkins版本发布与回滚_回滚

  3. 配置保存天数
  4. jenkins 版本回退上个版本 jenkins版本发布与回滚_war包_02

  5. 构建选参
  6. jenkins 版本回退上个版本 jenkins版本发布与回滚_回滚_03

  7. 源码管理
  8. jenkins 版本回退上个版本 jenkins版本发布与回滚_jenkins 版本回退上个版本_04

  9. 构建时选参

clean compile install -Dmaven.test.skip=true

jenkins 版本回退上个版本 jenkins版本发布与回滚_jenkins 版本回退上个版本_05


6. 最后执行

jenkins 版本回退上个版本 jenkins版本发布与回滚_jenkins 版本回退上个版本_06


脚本就是 回滚思路的具体说明

  1. 脚本内容
# 后续只需改release_id传递id
jenkins_release_id=${release_Id}
date_time=`date +%Y%m%d%H%M%S`

# target 路径
project_name_target="${WORKSPACE}/target"

# job归档war包 固定路径
jobs_dir=/${JENKINS_HOME}/jobs/${JOB_NAME}/modules/com*/builds
# 现有存档war包
now_war=${jobs_dir}/${BUILD_NUMBER}/archive/com*/**/**/*.war

# 获取war包,如果等于零 说明没有,直接退出
get_war_num=`/usr/bin/find ${project_name_target} -name *.war | wc -l` 
[ ${get_war_num} -lt 1 ] && exit 10 && echo "war包过多,请重新打包" 

replaceWar() {
    archive_war=${jobs_dir}/${jenkins_release_id}/archive/com*/**/**/*.war
#    unalias cp
    cp -rf ${archive_war} ${now_war}   # 强制覆盖原war包
    get_war_num=`/usr/bin/find ${project_name_target} -name *.war`
    cp -rf ${archive_war} ${project_name_target}/`basename ${get_war_num}`
}

# 不为空就执行,
if [ -n "${jenkins_release_id}" ];then
	# 查找输入的对应版本,如果没有循环直到最后,当有这个 就退出脚本
    for i in `find ${jobs_dir} -maxdepth 1 -type d `;do
        if [ ${jenkins_release_id} == `basename $i` ];then
            replaceWar 
            echo $i 
            # 如果jenkins跟项目在同一机器  在这里在写一个脚本 bash /xx/xx
            # 如果不在可以执行 ansible或 ssh推送对应war包,然后调用远端脚本
            exit 0   # 正常退出
        fi
    done
fi

echo "不知道你输入的是啥,同步主干中"
  1. 测试
test-maven]# pwd
# jenkins工作目录/workspace/projectName
/root/.jenkins/workspace/test-maven

test-maven]# cp target/gHttpDataShare.war /tmp/test/gHttp/
test-maven]# cd !$

gHttp]# ls
gHttpDataShare.war  trunk

gHttp]# unzip gHttpDataShare.war 

]# ls WEB-INF/
404.jsp  classes  common  jsp  lib  test.txt  web.xml
[root@cat2 gHttp]# cat test.
cat: test.: 没有那个文件或目录
[root@cat2 gHttp]# cat WEB-INF/test.txt 
用于测试-jenkins打包 回滚    # 注意,当前项目有test.txt文件,我们在svn中将它删除, 版本 44

jenkins 版本回退上个版本 jenkins版本发布与回滚_jenkins 版本回退上个版本_07

  1. 构建测试

不需要输入就是主干,构建之后,在执行第8步,测试war包是否还包含test.txt

jenkins 版本回退上个版本 jenkins版本发布与回滚_war包_08

]# ls WEB-INF/
404.jsp  classes  common  jsp  lib  web.xml
  1. 回滚测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6TXYv3cH-1595216540473)(C:\Users\xiong\AppData\Roaming\Typora\typora-user-images\image-20200716091216612.png)]
  1. 回滚-效果检查
```bash
# 依旧在执行第8步的脚本
]# ls WEB-INF/    # 回滚上一版,成功, 但是如果数据库改动过大的话就会有一些奇怪的问题
404.jsp  classes  common  jsp  lib  test.txt  web.xml
```

可以通过over-ssh推送,也可以通过ansible或其它工具
未完待续(ansible)。