• 对于注定会优秀的人来说,他所需要的,只是时间----博主
  • 手懒得,必受贫穷,手勤的,必得富足----《圣经》
  • 帮助别人,成就自己。愿君在本站能真正有所收获!
  • 如果你在本站中发现任何问题,欢迎留言指正!
  • 宝剑锋从磨砺出,梅花香自苦寒来!
  • 本站开启了防爆破关小黑屋机制,如果您是正常登录但被关进小黑屋,请联系站长解除!

<二十五>Jenkins实战应用–最基础核心的Jenkins功能部署一个java应用

Jenkins eryajf 11个月前 (10-25) 1244°C 已收录 14个评论
本文预计阅读时间 31 分钟

*系列汇总*

这是一个系列文章,大大小小到今天惊然发现竟然已经累计二十篇了,也就不得不做一个小汇总。回想当初写第一篇文章的时候,就已经决心事无巨细,一应认真的走下来,回头遮望,看着皇皇这么多文章,一股强烈的成就感就此油然而生,于是便有了这些汇总整理。在这个过程当中,好像也帮助过不少的人,这是让我尤其开心的事情,同时也结识了一些志同道合的朋友,再没有比这更让人觉得愉悦的事情啦!也希望以后写出更多类似的系列文章。

文章汇总地址如右:Jenkins入门教程。

如果相中哪个,点击进去便是。希望正在读这段话的你能够在这个小系列中获得自信以及喜悦!

有的小伙伴可能刚刚接触Jenkins这个工具,也许已经接触了小有一段时间,可是每当面对Jenkins的安装,配置,使用,插件,脚本,代码,,等等的一堆问题,总是会有一种就算长了三头六臂也不够用的感觉。

其实,这种感觉,我也有过,因为学习Jenkins是我进入到现在任职的这家公司的第一任务,那时候自己莫说是Jenkins,就连其他的java也都是一窍莫通的,于是乎,仅仅在Jenkins的安装以及所谓的插件的安装等问题上,就折腾了一周,其实每天都很煎熬,但是仍旧没见到什么成效,身边的运维大哥在我第二周终于安装成功了之后对我说,你这单是安装就搞了一周呀。这句话更加让原本就敏感的我感觉到阵阵的刺激,这种刺激在当时对自己心里想来好似一种嘲笑,但是现在想来,反而感激,琢磨起来,更像是一种激励了。

不管怎样,好在因为自己的坚持,功不唐捐,也总算是走出来了。这个过程中,也将自己所取得的一点点小小成就与大众分享,希望能够让更多的人受益。其实很多时候看到一些刚接触Jenkins的朋友着急的样子,就会想起自己当初在安装这个问题上卡了一周的经历,又看到有人想要花钱让别人帮忙部署,或者花钱让别人教自己的,其实学习的心情,或者掌握技能的心情,都是一样的,只不过,我总觉得,

所以,一句话,绝知此事要躬行就好了。

今天呢,是想单纯的写一篇Jenkins的入门文章,从安装,到使用,到配置,一路上都是针对新入门的人而言的,包括在这个过程中,会遇到哪些坑,有哪些需要注意的点,我都会尽量尽己所能分享,从而帮助一些新入门的朋友真正的尽量不入坑的将Jenkins构建项目体验一遍。

现在,废话已经够多了,直接进入正题。

1,浅谈项目部署流程。

哎,在进入真正的Jenkins构建学习之前,我还是想多啰嗦几句话,因为有时候思路非常重要,如果没有思路,可能整个操作,都会变得没有方向,或者整个的配置都会让自己变成无头苍蝇,出了问题,也不知道该从哪里排查。

结合我日常工作经验,个人觉得,一个项目能够成型于Jenkins上,大概需要以下几种原料:

原料 说明
Jenkins 这不废话嘛!
maven 如果是java项目,那么maven作为编译工具,必不可少!
jdk 只要与java沾边,就少不了他!
tomcat 如果是常规项目,少不了tomcat!
nexus 企业级私服王者,如果你还不了解他,可以先不用了解!
node 如果是前端的node项目,那么node不可少!
Git 代码集中营!

基本上也就是如上这些组件了。

Jenkins的意义,便是如此。

那么接下来,就正式进入项目部署过程,我这里也是依照上边那段话进行的。

2,手动走一遍。

提前说明,从这里开始,需要准备三台环境干净的主机:

主机地址 功能说明
192.168.112.167 Jenkins主机
192.168.112.182 模拟生产环境的中转机
192.168.112.237 远程跑应用的主机

巧妇难为无米之炊,而这项目地址就是米,是万事可行之源。

我这里选取一个开源的任务管理系统作为演示,大家也都可以很方便的拿这个项目进行构建体验体会琢磨。

1,拿到项目源码。

项目地址:https://github.com/xuxueli/xxl-job

进入项目之后,登陆自己的github账号,然后点击一下Fork将代码Fork到自己的空间,这样方便接下来的构建等操作。

2,先copy到服务器。

如下大部分操作如无特别说明,则都是在Jenkins主机之上操作。

[root@eryajf ~]$yum -y install git rsync

现在任意来到一个目录,clone一下代码。

[root@eryajf opt]$git clone https://github.com/eryajf/xxl-job.git
Cloning into 'xxl-job'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 16031 (delta 4), reused 3 (delta 1), pack-reused 16022
Receiving objects: 100% (16031/16031), 27.43 MiB | 1.15 MiB/s, done.
Resolving deltas: 100% (6249/6249), done.

[root@eryajf opt]$ls
xxl-job

3,进行手动编译。

接下来可以先手动编译一下,不过编译之前,有两个工具需要准备。其实是一个,就是maven打包工具,只不过maven工具依赖jdk环境,所以先来解决这两个工具的安装。

这两个的安装就不细说了,快速的过一下。

  • 1,安装jdk。
  • 首先从官网下载jdk。

    下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    注意这里只能通过浏览器点击下载,而不能通过服务器上wget或者复制链接到迅雷下载,因为下载的时候需要选中一下接受许可协议,然后找到对应版本进行下载。

    安装步骤是:解压—-移动到对应目录下—-写入环境变量—–加载一下—-验证。

    [root@eryajf src]$tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local/
    [root@eryajf src]$cd ..
    [root@eryajf local]$ls
    bin  etc  games  include  jdk1.8.0_191  lib  lib64  libexec  sbin  share  src
    [root@eryajf local]$echo 'JAVA_HOME=/usr/local/jdk1.8.0_191' >> /etc/profile
    [root@eryajf local]$echo 'PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile
    [root@eryajf local]$echo 'export PATH' >> /etc/profile
    [root@eryajf local]$source /etc/profile
    [root@eryajf local]$java -version
    java version "1.8.0_191"
    Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
    
  • 2,安装maven。
  • 下载地址:https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.3.9/

    这个不管是wget还是通过迅雷下载都可以,总之哪个快选择哪个,不过好在文件不是特别大。

    [root@eryajf local]$wget https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.tar.gz
    

    下载完成之后,接下来开始安装:

    [root@eryajf src]$tar xf apache-maven-3.3.9-bin.tar.gz -C ../
    
    [root@eryajf src]$cd ..
    
    [root@eryajf local]$ls
    apache-maven-3.3.9  bin  etc  games  include  jdk1.8.0_191  lib  lib64  libexec  sbin  share  src
    
    [root@eryajf local]$mv apache-maven-3.3.9/ maven
    
    [root@eryajf local]$echo 'MAVEN_HOME=/usr/local/maven' >> /etc/profile
    [root@eryajf local]$echo 'PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin' >> /etc/profile
    
    [root@eryajf local]$source /etc/profile
    
    [root@eryajf local]$mvn -v
    Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
    Maven home: /usr/local/maven
    Java version: 1.8.0_191, vendor: Oracle Corporation
    Java home: /usr/local/jdk1.8.0_191/jre
    Default locale: en_US, platform encoding: UTF-8
    OS name: "linux", version: "3.10.0-514.el7.x86_64", arch: "amd64", family: "unix"
    

    如此安装完成之后,就可以去刚才的项目目录当中进行构建了。

    4,手动构建。

    [root@eryajf xxl-job]$mvn  clean install -DskipTests=true
    

    这个过程可能需要一段时间,因为一个新项目在机器上第一次开始编译,有很多项目依赖的包都需要从远程下载,因此只需耐心等待即可。

    如果编译过程中有报错,只要不是找不到mvn这条命令,那么大可直接去找开发同学,或者直接把报错的地方截图发给他,让他解决,当然,如果自己有能力解决的,也可以自行解决。

    因为这个项目依赖都在远程,没有特别偏僻的依赖包,所以基本上都是可以编译通过的。只要是环境配置没有问题的话。

    当这个地方编译完成之后,基本上就可以去Jenkins上进行操作了,因为剩下的事情无非就是将包传到远程服务器,然后看服务启动的问题而已了!

    3,套入Jenkins。

    1,安装。

    这里tomcat的下载安装就省略了。

    [root@eryajf tomcat]$mv jenkins.war /usr/local/tomcat/webapps/ROOT.war
    
    [root@eryajf tomcat]$./bin/startup.sh
    Using CATALINA_BASE:   /usr/local/tomcat
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/temp
    Using JRE_HOME:        /usr/local/jdk1.8.0_191
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    Tomcat started.
    

    然后监听一下日志,稍候会看到admin的密码出来。

    Oct 25, 2018 9:52:02 PM jenkins.install.SetupWizard init
    INFO:
    
    *************************************************************
    *************************************************************
    *************************************************************
    
    Jenkins initial setup is required. An admin user has been created and a password generated.
    Please use the following password to proceed to installation:
    
    e282c05e3bb54106929bc82e7f5d9b4d
    
    This may also be found at: /root/.jenkins/secrets/initialAdminPassword
    
    *************************************************************
    *************************************************************
    *************************************************************
    

    然后到浏览器访问Jenkins。
    将刚开看到的密码复制进去。

    安装系统推荐的插件。如果主机网络不好,也可能会导致安装失败,可以重试一下。

    使用admin继续配置。

    一路往前,Jenkins就已经安装好了,就可以正式进入到我们的项目构建当中了。

    2,新建项目。

    新建一个项目。

    这里随便定义一个名称,然后选择构建一个自由风格的项目。

    点击确定之后,进入到正式的配置环节,注意,这个地方,一定要做到心无旁骛,其他的再花哨的功能,再丰富的操作,都先放在一边,跟随我的步伐,先把刚刚手动操作过的项目,套入到Jenkins上来。

  • 参数化构建:添加两条参数。
      • branch:默认master分支。通过这条参数实现发布代码的不同分支。
      • mode:有两个选项deploy/rollback。通过这条参数传递下去,实现部署以及回滚的功能。
  • 配置Git源码:将自己刚刚clone项目的地址复制过来。这个地方不会报错,如果使用公司内部的gitlab,可能会报错,此时将Jenkins主机秘钥添加到gitlab即可。
  • 执行shell:添加Jenkins要做的事情,其实是我们手动做的事情,然后交由Jenkins来做。
  • 完整截图如下:

    注意,这个地方的执行shell其实不是最终完整的样子,我故意把下边的拿掉,是因为,当你对Jenkins以及脚本已经有足够的熟悉之后,你就可以利用Jenkins来调试了,这就是其中一种方法。其中的代码意思就是,仅仅编译一下项目。

    第一次拉取代码,因为是从远程GitHub上拉取,会比较慢,这个时候,可以先去服务器上拉取一下,然后再来构建,当然,当Git地址配成公司内部的之后,这种情况就不会有了。

    到服务器上拉取可有如下操作:

    [root@eryajf ~]$cd /root/.jenkins/workspace
    [root@eryajf workspace]$git clone https://github.com/eryajf/xxl-job.git test-xxl
    
    因为我们刚刚已经拉取过,所以把刚才拉取成功的拷贝过来即可:
    [root@eryajf ~]$cd /root/.jenkins/workspace
    [root@eryajf workspace]$mv /opt/xxl-job/ ./test-xxl
    

    然后再出来构建一下,因为刚刚拷贝的是已经构建过的,依赖也都已经缓存了下来,所以编译就比较快,也比较顺利。

    既然编译已经成功了,那么我们就可以开始各种脚本的操作了。如果这个地方编译失败,那么看看是否是自己哪些地方配置错了,否则这个结果应该是与那会儿手动编译效果是一样的。

  • 接着完善一下Jenkins执行shell处的脚本:
  • #!/bin/bash
    
    source /etc/profile
    
    project="xxl"
    remote_user="root"
    remote_host="192.168.112.182"
    remote_port="22"
    remote_dir=/home/zhongzhuan/$project
    script_dir=/home/zhongzhuan/scripts
    
    cd $WORKSPACE && mvn  clean install -DskipTests=true
    cd $WORKSPACE/xxl-job-admin/target && mv xxl-job-admin-2.0.0-SNAPSHOT.war ROOT.war 
    
    if [ $mode == "deploy" ];then
        ssh -p ${remote_port} ${remote_user}@${remote_host} "[ ! -d ${remote_dir} ] && mkdir -p ${remote_dir}"
        ssh -p ${remote_port} ${remote_user}@${remote_host} "[ -f ${remote_dir}/ROOT.war.bak ] && rm -f ${remote_dir}/ROOT.war.bak"
        ssh -p ${remote_port} ${remote_user}@${remote_host} "[ -f ${remote_dir}/ROOT.war ] && mv ${remote_dir}/ROOT.war ${remote_dir}/ROOT.war.bak"
        scp -P ${remote_port} $WORKSPACE/xxl-job-admin/target/ROOT.war ${remote_user}@${remote_host}:${remote_dir}/ROOT.war && echo "success scp $project"
        sleep 2
        echo  "调用远程脚本开始部署!"
        ssh -p ${remote_port} ${remote_user}@${remote_host} "/bin/bash ${script_dir}/deploy.sh $mode $project"
    else
        ssh -p ${remote_port} ${remote_user}@${remote_host} "/bin/bash ${script_dir}/deploy.sh $mode $project"
    fi
    

    说明一二:

    其实这个地方我故意绕了一下,不过这么绕有我的道理。因为为了更贴合生产环境当中的实际情况。

    先说说这个脚本,其实脚本一点都不复杂,我不喜欢写那种特别复杂,复杂的别人都看不懂的脚本。

    这里说到了一个中转机,很多时候我们为了方便统一管理,会将某台主机定义为中转机,这样既保证安全,也方便管理了。

    这个链路一定要打通,否则脚本进行不下去的。

  • 接着是中转处的脚本:
  • 此脚本需放置在中转机(192.168.112.182)上,以实现承接的作用。

    注意,脚本放置的位置,要与上边Jenkins主机当中调用的位置一致,也就是/home/zhongzhuan/scripts下命名为deploy.sh

    这都是一些小细节,其实熟悉了之后会发现,Jenkins并不复杂,但需要细心,有许多前后调用的小细节,如果不注意,那么整个链路就会发生故障,自然构建也就无法成功!

    #!/bin/bash
    
    source /etc/profile
    
    mode=$1
    project=$2
    
    remote_port="10036"
    remote_user="root"
    remote_host="192.168.112.237"
    APPwar=/home/zhongzhuan/${project}/ROOT.war
    BAKwar=/home/zhongzhuan/${project}/ROOT.war.bak
    remote_appdir=/usr/local/${project}_tomcat/WAR
    
    if [ $mode == "deploy" ];then
        ssh -p ${remote_port} ${remote_user}@${remote_host} "[ -f ${remote_appdir}/ROOT.war  ] && rm -f ${remote_appdir}/ROOT.war"
        echo "正在将${project}的包从中转服务器传到目标服务器!"
        scp -P ${remote_port} $APPwar ${remote_user}@${remote_host}:${remote_appdir}/ROOT.war
        echo "正在调用应用服务器脚本开始部署!"
        ssh -p ${remote_port} ${remote_user}@${remote_host} "/bin/bash ${remote_appdir}/deploy.sh ${project}"
    else
        echo "正在将备份的${project}的包从中转服务器传到目标服务器!"
        scp -P ${remote_port} $BAKwar ${remote_user}@${remote_host}:${remote_appdir}/ROOT.war
        echo "正在调用应用服务器脚本开始回滚!"
        ssh -p ${remote_port} ${remote_user}@${remote_host} "/bin/bash ${remote_appdir}/deploy.sh ${project}"
    fi
    
  • 最后来看远程应用服务器上的脚本是怎么承接的:
  • 注意这个脚本是放置在最后的应用服务器上的(192.168.112.237),同样要注意,脚本的放置位置,应该在/usr/local/${project}_tomcat/WAR/deploy.sh

    #!/bin/bash
    
    project=$1
    
    source /etc/profile
    
    APPwar=/usr/local/${project}_tomcat/WAR/ROOT.war
    deploy(){
      webdir=/usr/local/${project}_tomcat/webapps
      tpid=`ps aux | grep ${project}_tomcat | grep java | grep -v grep | awk '{print $2}'`
      [ ! -z $tpid ] && kill -9 $tpid
      rm -rf ${webdir}/*
      mv $APPwar $webdir
      sleep 2
      /usr/local/${project}_tomcat/bin/startup.sh
      timeout 30 tail -fn 100 /usr/local/${project}_tomcat/logs/catalina.out
      sleep 1
      echo "部署完成!"
    }
    
    deploy
    

    现在,我们分别将脚本放置到对应的位置,来看看效果如何。

    如果各个环节都没问题,部署应该也是没有问题的了。完成之后,访问一下:

    首页访问没有问题,可能登陆之后失败,是因为数据库什么的都没有配置,不过这些都不重要啦,因为项目已经就此部署起来了。以后,也可以套这个思路,进行一个项目的构建。

    重要的是中间的三个脚本,希望各位好好琢磨琢磨,其实并不复杂,当你能够熟练运用并写出来,那么用熟Jenkins,就不是问题了!


    weinxin
    扫码订阅本站,第一时间获得更新
    微信扫描二维码,订阅我们网站的动态,另外不定时发送WordPress小技巧,你可以随时退订,欢迎订阅哦~

    二丫讲梵 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明<二十五>Jenkins实战应用–最基础核心的Jenkins功能部署一个java应用
    喜欢 (5)
    [如果想支持本站,可支付宝赞助]
    分享 (0)
    eryajf
    关于作者:
    学无止境,我愿意无止境学。书山有路,我愿意举身投火,淬炼成金!

    您必须 登录 才能发表评论!

    (14)个小伙伴在吐槽
    1. ╰⋛⋋や☆盛行☆や⋌⋚╯
      mvn clean install -DskipTests=true中的-DskipTests=true是什么意思?
      dnnltf2018-12-04 22:18 Windows 7 | Chrome 63.0.3239.132
    2. ╰⋛⋋や☆盛行☆や⋌⋚╯
      cd $WORKSPACE && mvn clean install -DskipTests=true这个代码的mvn后面有两个空格,虽然不影响运行。
      dnnltf2018-12-07 16:23 Windows 7 | Chrome 63.0.3239.132
    3. 楼主不错 ,我支援了你一元哦,但是我现在遇到问题了,看着你收集的问题没有解决掉ERROR: Couldn't find any revision to build. Verify the repository and branch
      零度火山3032018-12-13 18:04 Windows 7 | Chrome 68.0.3440.84
      • eryajf
        看你这个问题,先容我哈哈哈一下,首先,如果你的项目所有配置都没有问题的时候,那么应该检查一下,你发布的分支是否存在,如果你是刚刚做一个项目的配置,那么有两个思路,要么就是项目没有你要构建的分支,要么就是你的配置还有问题。感谢支持,有问题可以随时提,一起交流哈
        eryajf2018-12-13 19:48 Windows 7 | Chrome 70.0.3538.9
    4. 楼主厉害了,远程部署tomcat 这样真的省了好大的力气,就是能不能给咱在出一个jenkins远程部署启动jar包的 一起学习一下
      耐克不带勾2019-03-06 19:03 Windows 7 | Chrome 69.0.3497.81
      • eryajf
        其实是一个道理,思路有了,你可以自己写一下
        eryajf2019-03-06 19:35 Windows 7 | Chrome 49.0.2623.87
    5. chengkanghua
      如果是多个项目 一个项目是jdk 1.8 ,一个项目是jdk1.7, 这个单个jenkins 能配置吗
      chengkanghua2019-04-11 12:28 Windows 10 | Firefox浏览器 60.0
      • eryajf
        可以
        eryajf2019-04-11 12:50 Windows 7 | Chrome 49.0.2623.87
      • eryajf
        具体实施办法就是在服务器安装两个jdk,然后在Jenkins工具管理里边可以添加多个jdk,引用的时候使用不同的即可,或者不添加工具,编译的时候使用绝对路径即可
        eryajf2019-04-11 16:12 Windows 7 | Chrome 73.0.3683.103
    6. chengkanghua
      博主请教:1. mvn clean install -DskipTests=true 这条命令背后mvean 会去做编译 测试 打包吗2 .我用法是jenkins里添加BuildBuild Root POM 填的是 pom.xml Goals and options 填写是 clean package背后mvean 做的事情是一样的吗?3 .https://github.com/mountkin/greenhouse 这个项目是未编译过的是吗?
      chengkanghua2019-04-12 12:42 Windows 10 | Firefox浏览器 60.0
      • eryajf
        问题1,你可参考这篇文章来了解,maven基础知识问题2,涉及到不同的打包方式,我想说这真的是开发应该操心的事儿,应该由开发决定,如果开发这个东西都不能决定,那么项目真的不知道是怎么考虑的问题3,是的,这是没编译之前的源码,编译之后,会打出一个jar包或者war包,然后部署这个包就可以了
        eryajf2019-04-12 14:32 Windows 7 | Chrome 73.0.3683.103