实现自动化构建与集成:Jenkins与SVN整合的指南

打印 上一主题 下一主题

主题 1010|帖子 1010|积分 3030


媒介(非必须):配置Jenkins的CSRF

   在使用Jenkins的时间总是保存很慢,前端报错,错误关键词:Found invalid crumb 。和CSRF验证有关联,有说使用Strict Crumb Issue插件来解决。
    第一步:Strict Crumb Issuer插件安装
  进入Jenkins插件管理,Available选项,搜索Strict Crumb插件安装Strict Crumb Issuer插件,然后进入jenkins->体系设置->全局安全设置->跨站请求伪造掩护,把下拉选项改成Strict Crumb Issue,点开右下高级设置,去除掉Check the session ID选项选中,固然我这样设置了貌似没有见效。
   第二步:配置Jenkins-Authentication
  体系设置–>全局安全配置–>Authentication

1、新建任务



2、 配置SVN



直接保存,然后点击左侧的:立刻构建按钮,看是否能把源码下下来

3、配置Maven:进行编译打包


检察是否打包成功

4.1、发布到WEB容器(第一种:将项目放在webapps下)


保存后,然后实行立刻构建,就可以看到war包已经成功到我们的WEB服务器上面了

访问地址即可看到我们代码中的内容
http://182.92.209.212:8080/apple/index.jsp

4.2、发布到WEB容器(第二种:将项目名称修改为ROOT)

在第一种摆设Tomcat的方式上,在webapps下的项目必须要加上项目名称。
该怎样设置不通过项目名就能访问到项目呢?可以将Jenkins项目标配置-Context-Path设置为ROOT
由于Tomcat默认就是将应用放在了$CATALINA_HOME/ROOT下,可以将Tomcat自带的ROOT目录删除。
这样我们再通过Jenkins进行打包发布访问的时间就不需要加上项目名称了。

4.3、第三种:通过SSH+Shell脚本

   在4.2的时间对4.1的摆设方式进行了一些优化,但是感觉还是不太够,由于摆设在webapps下的方式不能够重启tomcat、假如遇到修改项目配置文件等的操纵
    需要重启tomcat,那么就显得有些不敷了。
  本方式采用SSH+Shell脚本进行摆设项目,并重启Tomcat,SSH(为了将Maven的war包上传到服务器),Shell(实行脚本关闭/启动Tomcat)
   1、Jenkins配置SSH
  安装SSH上传插件:Publish Over SSHVersion,配置SSH步调如下:体系管理-体系配置-Publish over SSH

   2、配置项目:添加构建后操纵
  将之前摆设Tomcat的步调(Deploy war/ear to a container)删除,添加Send build artifacts over SSH

shell脚本如下,创建文件后还需要给文件添加实行权限:chmod 777 tomcat-restart.sh
  1. #!/bin/bash
  2. export JAVA_HOME=/usr/local/java/jdk1.8.0_144
  3. # jdk-jar位置(解压war包)
  4. jar_home=/usr/local/java/jdk1.8.0_144/bin/jar
  5. # tomcat的位置(关闭/启动tomcat)
  6. tomcat_home=/usr/local/tomcat8/apache-tomcat-8.5.51
  7. # WEb应用放置的位置(自定义应用存放位置,与Remote Directory一致)
  8. application_path=/opt/application
  9. #【1】 停止tomcat变量
  10. SHUTDOWN=$tomcat_home/bin/shutdown.sh
  11. #【2】 启动tomcat变量
  12. STARTTOMCAT=$tomcat_home/bin/startup.sh
  13. #【3】解压war包
  14. cd $application_path;$jar_home -xvf $application_path/*.war;
  15. echo " ==================start【`date +"%Y-%m-%d %H:%M:%S"`】==================" >> ./tomcat-restart.log
  16. #【4】关闭进程
  17. PID=`ps -ef |grep $tomcat_home/conf |grep -v grep | awk '{print $2}'`
  18. if [ ! "$PID" ];then # 这里判断TOMCAT进程是否存在
  19.     echo "进程不存在" >> ./tomcat-restart.log
  20. else
  21.     echo "进程存在,关闭Tomcat" >> ./tomcat-restart.log
  22.     kill -9 $PID
  23. fi
  24. #【5】启动项目
  25. $STARTTOMCAT  
  26. echo "启动项目" >> ./tomcat-restart.log
  27. echo " ==================end【`date +"%Y-%m-%d %H:%M:%S"`】====================" >> ./tomcat-restart.log
复制代码
  3、修改tomcat配置文件
  需要修改两个地方:


  • 1、去除Host标签的appBase="webapps"属性,同时可以删除webapps目录,不会对应用造成影响由于不是通过tomcat的用户进行登录传输war包了
  • 2、添加标签

然后进行Jenkins构建即可,SSH会将构建完成的war包放到你指定的目录下,然后实行你的脚本文件
5、Maven多模块项目打包发布

   1、项目打war包
  项目打war包需要添加maven插件,参考:https://www.cnblogs.com/zhangzhixi/p/17010235.html
确保war包放在当地tomcat的webapps下能够正常访问项目
   2、配置项目SVN地址
  上面有进行配置的操纵,这里就不再赘述

   3、maven打包
  

这样就会在项目标target下生成war包了

   4、通过SSH,将war包传输到web发布服务器
  第一步:配置web发布服务器地址,参考上面的:https://www.cnblogs.com/zhangzhixi/p/17015148.html#_label2_6
第二步:配置项目中的参数:

   5、编写shell脚本:手动更改变量的值
  1. #!/bin/bash
  2. export JAVA_HOME=/mixky/software/jdk/jdk1.7.0_80
  3. # jar命令的位置(解压war包)
  4. jar_cmd="/mixky/software/jdk/jdk1.7.0_80/bin/jar"
  5. # tomcat的位置(关闭/启动tomcat)
  6. tomcat_home=/mixky/software/tomcat/tomcat-rfwm
  7. tomcat_log=${tomcat_home}/logs/catalina.out
  8. # 项目目录的位置
  9. project_dir="/mixky/project/rfwm-cicd-dev"
  10. #【1、解压war包】
  11. cd "$project_dir"
  12. echo " ==================start【$(date +"%Y-%m-%d %H:%M:%S")】==================" >>./tomcat-restart.log
  13. # 在项目目录及其子目录中查找所有以 .war 为后缀的文件。
  14. find "$project_dir" -name "*.war" | while read war_file; do
  15.   dir_name="$(basename "${war_file%.*}")"
  16.   if [ -d "$dir_name" ]; then
  17.     # 清空目录里的内容
  18.     rm -rf "$dir_name"/*
  19.   else
  20.     mkdir "$dir_name"
  21.   fi
  22.   cd "$dir_name"
  23.   # 解压
  24.   "$jar_cmd" -xf "$war_file"
  25.   cd ..
  26. done
  27. #【2、关闭tomcat进程】
  28. PID=$(ps -ef | grep $tomcat_home/conf | grep -v grep | awk '{print $2}')
  29. if [ ! "$PID" ]; then # 这里判断TOMCAT进程是否存在
  30.   echo "进程不存在" >>./tomcat-restart.log
  31. else
  32.   echo "进程存在,关闭Tomcat" >>./tomcat-restart.log
  33.   kill -9 $PID
  34. fi
  35. #【3】启动项目
  36. ${tomcat_home}/bin/startup.sh >${tomcat_log} 2>&1 &
  37. echo "启动项目" >>./tomcat-restart.log
  38. echo " ==================end【$(date +"%Y-%m-%d %H:%M:%S")】====================" >>./tomcat-restart.log
复制代码
然后实行构建即可!
   end:通过Maven整合SonarQube
  1. clean
  2. install
  3. -Dmaven.test.skip=true
  4. sonar:sonar
  5. -Dsonar.host.url=http://202.85.222.14:9000
  6. -Dsonar.login=d49cd67c5a4d2375a1cc405ef69febc07b4d5928
  7. -Dsonar.projectKey=${JOB_NAME}
  8. -Dsonar.projectName=${JOB_NAME}
  9. -Dsonar.ws.timeout=300000
复制代码
6、[构建触发器]

   远程触发的基本原理是 SVN 服务器给 Jenkins 项目特定的 URL 地址发送请求,但必须以请求参数的形式携带一个特定值,这个特定值就是这里的“身份验证令牌”。
  地址访问规则是:JENKINS_URL/job/apple/build?token=TOKEN_NAME
好比我们这个项目标地址触发地址是:http://110.43.204.225/jenkins/job/apple/build?token=APPLE


7、[SVN钩子程序]

体现在提交接码后,SVN会去做什么变乱,这里演示的功能是:
   Begin:禁用 Jenkins 中的 CSRF
  必须要禁用这个,不然无法通过curl命令发送触发器会出现403
详细配置路径是:体系管理–>命令行脚本–>写入–>运行脚本
  1. hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
复制代码

运行脚本

   Linux下通过curl 命令用来发送 HTTP 请求
    这样我们就可以在SVN服务器上面通过实行curl命令,来到达第五步的通过浏览器访问然后实行构建的功能了。
  admin:123456,是Jenkins登录时的用户名和暗码
  1. curl -X post -v -u admin:123456 http: //110.43.204.225/jenkins/job/apple/build?token=APPLE
复制代码

   编辑SVN钩子程序
  在SVN配置文件下有这样一个文件:/usr/local/svn/svnrepos/project/hooks/post-commit.tmpl,体现在实行commit之后,SVN会做什么变乱。
我们复制一份这个文件,并修改为:post-commit,这样才能够被SVN识别到。
  1. cd /usr/local/svn/svnrepos/project/hooks/
  2. cp post-commit.tmpl post-commit
复制代码
编辑这个文件: vim post-commit

给文件权限: chmod 755 post-commit
   测试钩子程序
  

提交后发现确实是Jenkins自动实行了构建

访问项目,检察摆设成功:

8、[SVN钩子程序之多项目Jenkins触发脚本]

   在Jenkins上面不止是管理一个项目,在SVN上面也不但是管理一个项目
  我们多个项目标时间,上传某一个项目代码到SVN,怎样实现只更新摆设提交的项目,而对其他的项目没有影响,这就要用到脚本文件
很简朴,只需要修改一下两处即可,多个项目配置多个:

  1. #!/bin/sh
  2. export LANG=en_US.UTF-8
  3. # 仓库的路径
  4. REPOS="$1"
  5. # 新提交的版本号
  6. REV="$2"
  7. # 钩子脚本的日志
  8. LOGFILE=/var/log/svn.log
  9. # 脚本的标准输出和标准错误输出都打印到日志文件里
  10. exec 1>>"$LOGFILE"
  11. exec 2>&1
  12. SVNLOOK=/usr/bin/svnlook
  13. TIME=$(date "+%Y-%m-%d %H:%M:%S")
  14. # 提交作者
  15. AUTHOR=$($SVNLOOK author -r "$REV" "$REPOS")
  16. # 修改的目录集合
  17. CHANGEDDIRS=$($SVNLOOK dirs-changed "$REPOS")
  18. # 提交时的备注信息,不建议用中文
  19. MESSAGE=$($SVNLOOK log -r "$REV" "$REPOS")
  20. # CHANGEDDIRS里的主目录
  21. MASTERDIR=$(echo "$CHANGEDDIRS" | head -1)
  22. PROJECT=$(echo "$MASTERDIR" | awk -F/ '{print $1}')
  23. # 根据项目名称决定使用哪个 token
  24. if [ "$PROJECT" == "中铁现场焊接管理系统" ]
  25. then
  26.     curl -X POST -v -u admin:123456 http://xxx/jenkins/job/rfwm-cicd-dev/build?token=rfwm-cicd-dev
  27. elif [  "$PROJECT" ==  "demo" ]
  28. then
  29.     curl -X post -v -u admin:123456 http://xxx/jenkins/job/demo/build ?token=DEMO
  30. else
  31.     echo "Input Is Error."
  32.     echo "项目名称:$PROJECT"
  33. fi
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表