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



    在这里插入图片描述

    前言(非必须):配置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

    img

    1、新建任务

    img

    img

    2、 配置SVN

    img

    img

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

    img

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

    img

    查看是否打包成功

    img

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

    img

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

    img

    访问地址即可看到我们代码中的内容

    http://182.92.209.212:8080/apple/index.jsp

    img

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

    在第一种部署Tomcat的方式上,在webapps下的项目必须要加上项目名称。

    该如何设置不通过项目名就能访问到项目呢?可以将Jenkins项目的配置-Context-Path设置为ROOT

    因为Tomcat默认就是将应用放在了$CATALINA_HOME/ROOT下,可以将Tomcat自带的ROOT目录删除。

    这样我们再通过Jenkins进行打包发布访问的时候就不需要加上项目名称了。

    img

    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

    img

    2、配置项目:添加构建后操作

    将之前部署Tomcat的步骤(Deploy war/ear to a container)删除,添加Send build artifacts over SSH

    img

    shell脚本如下,创建文件后还需要给文件添加执行权限:chmod 777 tomcat-restart.sh

    #!/bin/bash
    
    export JAVA_HOME=/usr/local/java/jdk1.8.0_144
    
    # jdk-jar位置(解压war包)
    jar_home=/usr/local/java/jdk1.8.0_144/bin/jar
    # tomcat的位置(关闭/启动tomcat)
    tomcat_home=/usr/local/tomcat8/apache-tomcat-8.5.51
    # WEb应用放置的位置(自定义应用存放位置,与Remote Directory一致)
    application_path=/opt/application
    
    #【1】 停止tomcat变量
    SHUTDOWN=$tomcat_home/bin/shutdown.sh
    #【2】 启动tomcat变量
    STARTTOMCAT=$tomcat_home/bin/startup.sh
    #【3】解压war包
    cd $application_path;$jar_home -xvf $application_path/*.war;
    
    echo " ==================start【`date +"%Y-%m-%d %H:%M:%S"`】==================" >> ./tomcat-restart.log
    #【4】关闭进程
    PID=`ps -ef |grep $tomcat_home/conf |grep -v grep | awk '{print $2}'`
    if [ ! "$PID" ];then # 这里判断TOMCAT进程是否存在
        echo "进程不存在" >> ./tomcat-restart.log
    else
        echo "进程存在,关闭Tomcat" >> ./tomcat-restart.log
        kill -9 $PID
    fi
    #【5】启动项目
    $STARTTOMCAT  
    echo "启动项目" >> ./tomcat-restart.log
    echo " ==================end【`date +"%Y-%m-%d %H:%M:%S"`】====================" >> ./tomcat-restart.log
    
    • 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

    3、修改tomcat配置文件

    需要修改两个地方:

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

    img

    然后进行Jenkins构建即可,SSH会将构建完成的war包放到你指定的目录下,然后执行你的脚本文件

    5、Maven多模块项目打包发布

    1、项目打war包

    项目打war包需要添加maven插件,参考:https://www.cnblogs.com/zhangzhixi/p/17010235.html

    确保war包放在本地tomcat的webapps下能够正常访问项目

    2、配置项目SVN地址

    上面有进行配置的操作,这里就不再赘述

    img

    3、maven打包

    img

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

    img

    4、通过SSH,将war包传输到web发布服务器

    第一步:配置web发布服务器地址,参考上面的:https://www.cnblogs.com/zhangzhixi/p/17015148.html#_label2_6

    第二步:配置项目中的参数:

    img

    5、编写shell脚本:手动更改变量的值

    #!/bin/bash
    export JAVA_HOME=/mixky/software/jdk/jdk1.7.0_80
    # jar命令的位置(解压war包)
    jar_cmd="/mixky/software/jdk/jdk1.7.0_80/bin/jar"
    # tomcat的位置(关闭/启动tomcat)
    tomcat_home=/mixky/software/tomcat/tomcat-rfwm
    tomcat_log=${tomcat_home}/logs/catalina.out
    # 项目目录的位置
    project_dir="/mixky/project/rfwm-cicd-dev"
    
    #【1、解压war包】
    cd "$project_dir"
    echo " ==================start【$(date +"%Y-%m-%d %H:%M:%S")】==================" >>./tomcat-restart.log
    # 在项目目录及其子目录中查找所有以 .war 为后缀的文件。
    find "$project_dir" -name "*.war" | while read war_file; do
      dir_name="$(basename "${war_file%.*}")"
      if [ -d "$dir_name" ]; then
        # 清空目录里的内容
        rm -rf "$dir_name"/*
      else
        mkdir "$dir_name"
      fi
      cd "$dir_name"
      # 解压
      "$jar_cmd" -xf "$war_file"
      cd ..
    done
    
    #【2、关闭tomcat进程】
    PID=$(ps -ef | grep $tomcat_home/conf | grep -v grep | awk '{print $2}')
    if [ ! "$PID" ]; then # 这里判断TOMCAT进程是否存在
      echo "进程不存在" >>./tomcat-restart.log
    else
      echo "进程存在,关闭Tomcat" >>./tomcat-restart.log
      kill -9 $PID
    fi
    
    #【3】启动项目
    ${tomcat_home}/bin/startup.sh >${tomcat_log} 2>&1 &
    echo "启动项目" >>./tomcat-restart.log
    echo " ==================end【$(date +"%Y-%m-%d %H:%M:%S")】====================" >>./tomcat-restart.log
    
    • 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

    然后执行构建即可!

    end:通过Maven整合SonarQube

    clean
    install
    -Dmaven.test.skip=true
    sonar:sonar
    -Dsonar.host.url=http://202.85.222.14:9000
    -Dsonar.login=d49cd67c5a4d2375a1cc405ef69febc07b4d5928
    -Dsonar.projectKey=${JOB_NAME}
    -Dsonar.projectName=${JOB_NAME}
    -Dsonar.ws.timeout=300000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    6、[构建触发器]

    远程触发的基本原理是 SVN 服务器给 Jenkins 项目特定的 URL 地址发送请求,但必须以请求参数的形式携带一个特定值,这个特定值就是这里的“身份验证令牌”。

    地址访问规则是:JENKINS_URL/job/apple/build?token=TOKEN_NAME

    比如我们这个项目的地址触发地址是:http://110.43.204.225/jenkins/job/apple/build?token=APPLE

    img

    img

    7、[SVN钩子程序]

    表示在提交代码后,SVN会去做什么事情,这里演示的功能是:

    Begin:禁用 Jenkins 中的 CSRF

    必须要禁用这个,不然无法通过curl命令发送触发器会出现403

    具体配置路径是:系统管理–>命令行脚本–>写入–>运行脚本

    hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
    
    • 1

    img

    运行脚本

    img

    Linux下通过curl 命令用来发送 HTTP 请求

    这样我们就可以在SVN服务器上面通过执行curl命令,来达到第五步的通过浏览器访问然后执行构建的功能了。

    admin:123456,是Jenkins登录时的用户名和密码

    curl -X post -v -u admin:123456 http: //110.43.204.225/jenkins/job/apple/build?token=APPLE
    
    • 1

    img

    编辑SVN钩子程序

    在SVN配置文件下有这样一个文件:/usr/local/svn/svnrepos/project/hooks/post-commit.tmpl,表示在执行commit之后,SVN会做什么事情。

    我们复制一份这个文件,并修改为:post-commit,这样才能够被SVN识别到。

    cd /usr/local/svn/svnrepos/project/hooks/
    cp post-commit.tmpl post-commit
    
    • 1
    • 2

    编辑这个文件: vim post-commit

    img

    给文件权限: chmod 755 post-commit

    测试钩子程序

    img

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

    img

    访问项目,查看部署成功:

    img

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

    在Jenkins上面不止是管理一个项目,在SVN上面也不只是管理一个项目

    我们多个项目的时候,上传某一个项目代码到SVN,怎样实现只更新部署提交的项目,而对其他的项目没有影响,这就要用到脚本文件
    很简单,只需要修改一下两处即可,多个项目配置多个:
    img

    #!/bin/sh
    
    export LANG=en_US.UTF-8
    # 仓库的路径
    REPOS="$1"
    # 新提交的版本号
    REV="$2"
    # 钩子脚本的日志
    LOGFILE=/var/log/svn.log
    # 脚本的标准输出和标准错误输出都打印到日志文件里
    exec 1>>"$LOGFILE"
    exec 2>&1
    
    SVNLOOK=/usr/bin/svnlook
    
    TIME=$(date "+%Y-%m-%d %H:%M:%S")
    # 提交作者
    AUTHOR=$($SVNLOOK author -r "$REV" "$REPOS")
    # 修改的目录集合
    CHANGEDDIRS=$($SVNLOOK dirs-changed "$REPOS")
    # 提交时的备注信息,不建议用中文
    MESSAGE=$($SVNLOOK log -r "$REV" "$REPOS")
    
    # CHANGEDDIRS里的主目录
    MASTERDIR=$(echo "$CHANGEDDIRS" | head -1)
    PROJECT=$(echo "$MASTERDIR" | awk -F/ '{print $1}')
    
    # 根据项目名称决定使用哪个 token
    if [ "$PROJECT" == "中铁现场焊接管理系统" ]
    then
        curl -X POST -v -u admin:123456 http://xxx/jenkins/job/rfwm-cicd-dev/build?token=rfwm-cicd-dev
    elif [  "$PROJECT" ==  "demo" ]
    then
        curl -X post -v -u admin:123456 http://xxx/jenkins/job/demo/build ?token=DEMO
    else
        echo "Input Is Error."
        echo "项目名称:$PROJECT"
    fi
    
    • 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
  • 相关阅读:
    ApplicationContext接口解读
    算法入门(六):归并排序
    【AI赋能医学】基于深度学习和HRV特征的多类别心电图分类
    MachineLearning 11. 机器学习之随机森林生存分析(randomForestSRC)
    完全背包问题--找零钱
    给运行中的docker容器挂载目录——筑梦之路
    手把手教你自己搭建getwayWorker聊天服务器
    Android开发-Mac Android开发环境搭建(Android Studio Mac环境详细安装教程,适合新手)...
    微信小程序实现堆叠式轮播
    【python】使用python操作XML文件及JSON与XML互转
  • 原文地址:https://blog.csdn.net/qq_54796785/article/details/133899251