使用Jenkins配置Git+Maven的自动化构建的方法

背景

最近安装Jenkins,参照网上的各种资料进行尝试,折腾了好久,但是查找了这么多资料,相似度在90%以上!!!,相同的安装过程,测试了几台机器,未曾成功,不得不感慨自己能力有限,最终慢慢摸索,形成思路,现分享给大家,希望大家在安装的时候少走弯路。

PS:本人很痛恨那种粘贴复制,毫无思考的博主,本想着拿着解决问题的心态,但结果还是一样,不但浪费了大家的时间,还浪费了大家的感情,所以,我把我遇到的问题和解决的方式记录下来和大家分享。

知识背景

首先需要理解的是,Jenkins是帮我们将代码进行统一的编译打包、还可以放到tomcat容器中进行发布。

意思是我们通过配置,将以前:编译、打包、上传、部署到Tomcat中的过程交由Jenkins,Jenkins通过给定的代码地址URL,将代码拉取到其“宿主服务器”(这是我个人的称呼,在下边会用到,就是Jenkins的安装位置),进行编译、打包和发布到容器中。

因此我们可以注意到的是,在Jenkins的宿主服务器中必须要有可以进行:代码clone(Git)、代码编译(Maven)、代码运行(Tomcat)的基本环境,其他文章上来就是安装jenkins,忽略了一些基本的配置。

下边就开始讲解各部分的安装过程,如果已经安装某一步的环境,则可以以此进行下一步。

一、Git的安装

1、安装依赖

sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

注意:perl-ExtUtils-MakeMaker 也是这些安装列表中的一员,不要因为显示的换行造成大家认为是两条执行命令。

2、下载Git

选择一个目录,存放下载的git,例如我的是:/home/xuliugen/tmp,大家可以根据需求到官网下载相应的版本

wget https://github.com/git/git/archive/v2.3.0.zip

3、解压git

下载之后是这样的,不要感到奇怪,直接解压即可

因为下载的是一个zip,所以使用命令将其解压到git目录下:

#参数-d 后边的是解压到的目录
unzip v2.3.0 -d git 

4、编译安装git

进入git目录

将其安装在“/usr/local/git”目录下,命令如下:

make prefix=/usr/local/git all
sudo make prefix=/usr/local/git install

5、配置Git

sudo vim /etc/profile #编辑profile文件

然后而已看到这个文件已经有很多配置了,只需要在最下边添加git的路径即可:

export PATH=/usr/local/git/bin:$PATH

将这段话放在最后边,然后使用source命令应用修改:

source /etc/profile

6、检验Git是否安装成功

git --version

二、Maven安装

1、下载和解压Maven

Maven的安装包下载可以根据需求找到合适的版本,解压之后,我的位置是:

2、配置Maven

编辑:~/.bash_profile文件,根据注释相应的修改即可

# maven所在的目录
export M2_HOME=/home/xuliugen/software/maven/apache-maven-3.3.3
# maven bin所在的目录
export M2=$M2_HOME/bin
# 将maven bin加到PATH变量中
export PATH=$M2:$PATH
# 配置JAVA_HOME所在的目录,注意这个目录下应该有bin文件夹,bin下应该有java等命令
export JAVA_HOME=/usr/lib/jvm/jre-1.7.0

然后运行:source ~/.bash_profile 应用修改

3、查看Maven是否安装成功

使用:mvn -version 即可查看结果

三、Jenkins的部署

Jenkins的安装很简单,直接将war放到容器中进行运行即可

1、将jenkins放到Tomcat中并解压,启动Tomcat,成功启动之后访问ip和端口如下:

启动成功之后,进入的界面如上,表示启动成功。

2、安装插件

在进行配置之前,由于使用的是Git拉去代码的方式,所以要首先安装插件

找到:插件管理 在“可选插件”界面使用ctrl+f 搜索:Deploy to container Plugin 插件(这个是支持将代码部署到tomcat容器的)

勾选,点击下边的按钮:直接安装,这个可能时间较久,等待即可。

安装完之后,如果勾选了:安装完成后重启jenkins 那么会重启jenkins。

然后安装:GIT plugin,何上边的步骤一样,如果使用上述的方式,由于网络的原因,可能会安装失败,这就需要我们使用另一种方式进行安装。

使用同样的方式在“可选插件”中搜索GIT plugin,找到之后点击蓝色链接(最好右键在新窗口中打开,放置覆盖jenkins界面)

会跳转到Git Plugin的插件信息地址:

可以看到Plugin ID为:git,然后在:http://updates.jenkins-ci.org/download/plugins/ 这地地方搜索(ctrl+f)即可找到,点进去,选择一个版本进行下载:

点进去下载的是一个hpi文件

然后同样的在:系统管理–管理插件–高级Tab中,下拉可以看到上传插件,然后选择文件上传刚才下载的hpi文件,即可,上传完之后,会自动安装。上述安装Deploy to container Plugin的方式也可以采用这种方式。

都安装完之后,在已安装Tab中可以看到刚安装的插件:

3、进行配置

看到上图中的左侧有一个:系统管理 点击去

上边的第一行黄色信息,表示编码问题,在Tomcat–>conf–>server.xml文件中修改即可

4、Jenkins系统设置

点击:系统设置这里没有强调的都设置为默认即可。

(注意:版本2.60.2是在:系统设置–>Global Tool Configuration下)

(1)JDK,别名是任意的,选择自己jdk的位置,jenkins推荐使用sun jdk而不是openjdk

(2)Git 的配置

注意这里的git位置,是可执行文件的地址,即是git–bin–下的可执行文件 git的目录(类似于java中bin下的java可执行文件位置)

如果填错,后期回报无法找到git等错误(最下边,其他问题下的第三个问题),请大家注意!

(3)Ant的配置

由于本次并没有用到Ant,不做配置,大家可以根据配置进行设置

(4)Maven的配置,选择自己maven的存放位置

(5)Jenkins Location

这里配置的是ip加端口和一个路径名称,邮箱要进行设定,后期会发送jenkins执行的结果到邮件中

(6)邮件通知

这里我配置的QQ邮箱,大家根据情况进行设置相应的smtp服务器,用户名、密码分别为自己的QQ邮箱何密码,如果不进行设置,后期jenkins构建项目的时候会报错,报错信息很好理解也很好找到是没有配置邮件的问题。

首先,要保证邮件的smtp和pop是开启状态的,这样的话才可以通过验证:

最后点击下边的应用、保存即可

5、Configure Global Security

然后回到系统管理,看到Configure Global Security 点击进去,根据下边进行配置即可

点击应用 保存之后,然后在屏幕的右上角,有一个登录-注册 ,点击注册即可实现用户的登录。

这里,如果是公司内网的话,或者最后搭建的jenkins是公司使用,那么最好用户名和密码为公司的账户密码,邮件也是公司的邮件,这样的话方便后期的操作。

至此Jenkins的基本配置完成。

创建Job

1、创建项目

点击登录之后,会看到下边的界面中:My Views

点击进去

点击:创建一个新任务

选择maven项目,点击OK,这里的Item名称是后边需要用到的,下边的配置也有用到这个的,大家可以很好的对应。

2、进行项目的配置

(1)源码管理选择Git,这个时候添加url之后,下边会报错,显示让去认证,认证即可(其他的安装中又遇到这个问题),如果认证失败,请下载认证Github Authentication plugin插件,这个在插件管理的可选插件中搜索安装。

我这里的rul是我在gitos上的一个项目,credentials是我在gitos上的用户名和密码认证。

(2)构建触发器,就是什么时候执行jenkins的自动化部署

选择第一个,其他的基本是定时执行什么的,大家可以自行查找,查看如何设置,根据需要进行配置

(3)Post Steps

选择上图中的,然后下边 的Execute shell如下,脚本的编写在下边进行了详细的说明:

#!/bin/bash
#copy file and restart tomcat 

export JAVA_HOME=/data/home/server/jdk
export CATALINA_HOME=/home/xuliugen/dubbo-provider
export CATALINA_BASE=/home/xuliugen/dubbo-provider
export BUILD_ID=dontKillMe

tomcat_path=/home/xuliugen/dubbo-provider
project=dubbo-provider
war_name=dubbo-provider.war
war_path=http://132.153.131.237/:8022/jenkins/job/ManenDemo/ws/targetserver_port=8082
file_path=~/.jenkins/jobs/ManenDemo/workspace/spring_provider/target

$tomcat_path/bin/shutdown.sh 

sleep 3s 

echo "rm -rf ${tomcat_path}/webapps/ROOT/*"

rm -rf ${tomcat_path}/webapps/ROOT/*

cd $file_path

cp ${war_name} ${tomcat_path}/webapps/ROOT/

cd $tomcat_path/webapps/ROOT/

unzip ${war_name}

rm -rf ${war_name}

sleep 5s 

#$tomcat_path/bin/startup.sh

cd $tomcat_path/bin/
./startup.sh

echo "server restarted"

(4)邮件通知

至此基本设置完毕,点击应用、保存

(5)立即构建

点击左上角的立即构建

然后看到下边的Build History 点击蓝色的进去,会进入Console

下边是进行jar的下载,会下载到宿主服务器的maven仓库中:

下边的信息表示项目编译通过:

下边是运行脚本的信息:

脚本的分析

在Jenkins的服务器上查看:

可以看到在/root/.jenkins这个目录,实际存放了Jenkins拉取Git代码之后编译好war的位置,到此,大家也许都该明白了,编译后的位置就在这里啊!然后,接着是部署到宿主服务器的Tomcat容器中,如何将编译好的war放到tomcat中,这就需要脚本来完成,也是上述过程中配置的过程,下边对每一行进行分析。

首先我们应该明白,将编译好的war放到tomcat容器中,我们首先要知道这两个的位置:编译后war的位置和目标容器的位置,很显然我们是知道的。

1、脚本文件的头,这个没得说

#!/bin/bash 

2、环境变量设置

export JAVA_HOME=/data/home/server/jdk
export CATALINA_HOME=/home/xuliugen/dubbo-provider
export CATALINA_BASE=/home/xuliugen/dubbo-provider
export BUILD_ID=dontKillMe

上边的各个位置,大家也许都知道,CATALINA_HOME和CATALINA_BASE的位置就是Tomcat容器的位置,这里根据需求我将Tomcat容器的名字改为dubbo-provider了,如果改成/home/xuliugen/tomcat是不是更好理解。

export BUILD_ID=dontKillMe这一句很重要,因为该job启动完后执行下一job,jenkins直接把tomcat进程杀了,所以无论脚本中怎么写了启动tomcat的命令,他是不会启动的。虽然上述截图中显示了Tomcat started、server restarted但是访问项目地址是访问不了的,这在:其他问题的第二个说明了这个问题。

3、其他路径位置

tomcat_path=/home/xuliugen/dubbo-provider #我的Tomcat位置
project=dubbo-provider #我的项目编译的名称
war_name=dubbo-provider.war #最后打包的war名称
war_path=http://132.153.131.237/:8022/jenkins/job/ManenDemo/ws/targetserver_port=8082 #宿主服务器的ip何端口
file_path=~/.jenkins/jobs/ManenDemo/workspace/spring_provider/target #编译好的war包存放地址

这个:war_path 其实也就是Jenkins的宿主服务器位置IP,端口为jenkins运行的端口,大家只需要将ip地址端口ManenDemo换成自己的即可;

file_path:就是Jenkins帮我们编译好的项目war的位置,上图中大家也可以看到,并且大家不可以完全按照上边的路径,要找到自己宿主服务器上实际war的位置,进行设置。

4、耳熟能详的执行命令

下边就是我们在使用原始方式,部署war的命令,大家很简单的可以理解,其中:

注意:个人写脚本的能力有限,所以我是假设项目已经在运行的情况下,因此我上来就是先关闭Tomcat,(正确的方式,应该判断端口是否打开,如果本身tomcat未启动,我的这种情况,会在Jenkins的Console中报拒绝连接的问题,如下图)。

另外用到了sleep 3s 这个可以让线程休眠一下,这样的话可以看一下tomcat的日志信息。

下边的脚本就是删除原来容器中的文件,然后将编译好的war移动到容器中,解压。运行tomcat。

$tomcat_path/bin/shutdown.sh
sleep 3s
echo "rm -rf ${tomcat_path}/webapps/ROOT/*"
rm -rf ${tomcat_path}/webapps/ROOT/*
cd $file_path
cp ${war_name} ${tomcat_path}/webapps/ROOT/
cd $tomcat_path/webapps/ROOT/
unzip ${war_name}
rm -rf ${war_name}
sleep 5s
cd $tomcat_path/bin/
./startup.sh
echo "server restarted"

将项目布署到远程Tomcat

上述创建项目,可以看出是在本地进行执行的,也就是进行编译后执行的Tomcat是何Jenkins的宿主服务器是在一起的,这很显然不符合我们常规的公司及其部署的方案,通常是将编译之后的代码在运行到其他的Tomcat服务器中的,下边有两种方式,将编译之后的项目部署到远程服务器中。

1、使用脚本的方式部署到远程服务器

2、使用Deploy to container Plugin插件部署到远程服务器

上述的开始阶段就安装了这个插件,下边就开始发挥其作用。

在创建的Job左侧点击设置,其他配置何在远程搭建项目是一致的,不同的是在这个地方:

以前我们在编译之后,将编译后的通过脚本补助到Jenkins的宿主服务器,使用插件,就不需要这种方式了。

还有就是的在构建之后,将编译后的文件**/target/dubbo-provider.war(就是上边的~/.jenkins/jobs/ManenDemo/workspace/spring_provider/target目录)部署到下边的远程Tomcat容器中;这里Containers的用户名和密码是Tomcat管理员的账户密码,Tomcat URL 就是你需要进行部署的远程Tomcat服务器的ip和端口。

这里需要进行设置的是远程Tomcat的管理员信息,修改远程Tomcat容器下的conf–tomcat-users.xml文件,在内添加下边的内容:

<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="admin"/>
<user username="admin" password="admin" roles="admin,manager,manager-script,manager-gui"/>

即可实现远程的访问,测试是可以通过的,但是有一个问题,通过这种方式,只将war复制到了wenapps下:

因此这种方式的话,我们访问的时候必须是ip、端口和项目名,例如:

http://115.159.151.247:8030/dubbo-provider/

当然这种方式 也是在实际的应用中不提倡的,解决方式就是修改Tomcat默认的访问路径即可,设置Tomcat–conf–server.xml文件如下:

在Host节点之间添加:

<Context path="" docBase="dubbo-provider" debug="0" reloadable="true" />

或者在docBase里边输入项目的绝对路径,例如我的:

<Context path="" docBase="/home/xuliugen/dubbo-provider/webapps/dubbo-provider" debug="0" reloadable="true" />

然后重启Tomcat,这样的话,http://ip:8030/dubbo-provider/ 和http://ip:8030这两种方式都可以访问到该项目。

后期补充:

上边的是设置Context Path,使得默认部署的时候会在webapps下作为一个单独的容器,其实可以直接将其设置为/ ,因为Tomcat默认的访问路径指向的就是ROOT,所以如果设置为ROOT的话就不需要在进行上边的设置了,如下:

自动部署war包到ROOT路径,也就是网站的根目录时,deploy插件的”Context path”要填写:”/”,而不是”ROOT”或者”/ROOT”,不然自动部署会失败,有类似以下错误:

其他问题

1、部署项目的时候报错

这个大家很好理解,是因为下载jar失败的问题,由于是第一次使用Maven,需要第一次下载很多jar到Maven仓库中,由于网络的问题下载失败,大家可以多次构建让他重新下载,或者直接到:https://repo.maven.apache.org/maven2 根据报错的jar,在maven2中找到自己缺失的jar,然后在/root/.m2/repository 相应的位置添加jar即可。

2、编写脚本文件启动tomcat但是项目仍然运行不起来

就是上边说道的问题了:

添加:export BUILD_ID=dontKillMe,因为该job启动完后执行下一job,jenkins直接把tomcat进程杀了,所以无论脚本中怎么写了启动tomcat的命令,他是不会启动的。

3、遇到下边的问题

这就是在系统设置的时候,设置的git的地址不对,上述已经说明了,应该是git的可执行文件的地址,如果只是git的目录,是无法找到git这个可执行文件的,如下:

可以看出使用的是这个:/usr/local/git/bin/git 进行git仓库的配置何代码的拉取,因此这设置git的目录,jenkins默认是不会找bin目录下的git可执行文件的。

至此,Jenkins的部署完成,希望对大家有所帮助。也希望大家多多支持我们。

(0)

相关推荐

  • Asp.net Core Jenkins Docker实现一键化部署的实现

    写在前面 在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署.大概的流程是Jenkins从git上获取代码 最开始Jenkins是放在Ubuntu的Docker中,但是由于Powershell执行的原因,就把Jenkins搬到了windows上.因为我们网站的部署需要停掉IIS站点,所以需要Powershell来远程操作服务器(上传文件,停止站点,启动站点),也很顺利的利用WinRM+Powershell脚本实现了上面的功能,但是最后在实际使用中发现,脚本

  • 详解Docker+Jenkins+Gitlab+Django应用部署实践

    一.背景介绍 在互联网应用快速更新迭代的大背景下,传统的人工手动或简单脚本已经不能适应此变化,此时Devops为我们提供了良好的解决方案,应用好CI/CD可以大大的方便我们的日常工作,自动化快速的持续集成/持续交付为我们带来了应用开放的更快速度.更好的稳定性和更强的可靠性. 二.拓扑环境 2.1 架构拓扑 如上图实例,简单花了下流程拓扑: 当研发push本地代码到gitlab-server后,webhook自动触发jenkins构建应用 在docker host上部署应用git clone来自g

  • 详解jenkins自动部署springboot应用的方法

    最近公司在利用jenkins自动部署springboot应用,以前别人配的那个jenkins虽说可以正常部署,但是多次反复部署之后jenkins会报错,提示内存不足: Maven JVM terminated unexpectedly with exit code 137 原因是因为jenkins没有配置部署新的应用前先把旧的应用进程先kill掉而导致在服务器上有多个应用进程.因此自己决定摸索如何配置jenkins可以每次部署都把旧进程kill掉再启动新进程. 安装Jenkins 安装命令: s

  • 在CentOS7上搭建Jenkins+Maven+Git持续集成环境的方法

    本文以部署 Spring boot + Maven 项目为例,使用码云作为代码托管仓库,在 CentOS 7 上搭建 Jenkins 持续集成环境. 1. 准备工作 1.1 安装 Java 环境 Jenkins 是基于 Java 开发的持续集成工具,需要在 Java 环境下运行.用下面命令查看系统是否已安装 Java: yum list installed | grep jdk 如果没有,使用 yum search 命令查找 openjdk 版本,选择合适的 jdk 进行安装: yum sear

  • Jenkins之Log Parse使用方法详解

    在初学使用Jenkins的同学们,应该都遇到过通过bash或者cmd命令执行输出的日志,没办法做到对error, warning等状态的分析和统计.在这里就给他介绍一款实现此功能的插件Log Parse.此插件安装相当容易,但配置规则文件时,我踩了一坑,记录共享于同学们. 规则文件绝对路径 当然,你的设置一定要重新加载,否则是无效的 规则文件相对路径: 在windows平台下,默认的根目录为C:\Windows\.SysWOW64\,所以需要把规则文件放到此目录下. 常用规则文件代码如下: ok

  • jenkins中通过Publish Over SSH插件将项目部署到远程机器上的讲解说明

    Publish Over SSH插件使用 在使用Publish Over SSH之前,需要制作SSH私钥.机器间做免密登录配置.假设机器A,ip为192.168.AA.AAA,机器B: 192.168.BB.BBB,机器A能够免密登录机器B,机器B能够免密登录机器A,制作方式是: 进入A机器,执行: cd ~ ssh-keygen -t rsa 通过下面的命令,表示可以通过机器192.168.AA.AAA免密登录到机器192.168.BB.BBB ssh-copy-id 192.168.BB.B

  • Jenkins简介与Docker部署Jenkins的方法

    一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测试和部署技术.Jenkins是一种软件允许持续集成. 1.2 Jenkins目的: 1.持续.自动地构建/测试软件项目. 2.监控软件开放流程,快速问题定位及处理,提示开放效率. 1.3 特性: 开源的java语言开发持续集成工具,支持CI,CD. 易于安装部署配置:可通过yum

  • Docker容器使用jenkins部署web项目(总结)

    (1)需要安装Docker容器,在Docker容器内安装jenkins,gogs,tomcat.   新建maven项目,添加findbugs plugin. 使用docker启动jenkins,gogs,Tomcat的命令gogs : 复制代码 代码如下: docker run -itd -p 10022:22 -p 10080:3000 --restart=always --privileged=true --name=gogs -v /var/gogs:/data gogs/gogs je

  • 如何通过Jenkins定期清理为None的镜像详解

    前言 在代码持续交付过程中,依靠Jenkins生产Docker镜像时,会生成许多的名为None的中间镜像,这些镜像在整个项目生产过程完毕后意义不大,还占着空间,需要定期清理,通过手动方式实在是繁琐,也就有了定期清理. Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测试和部署技术.Jenkins是一种软件允许持续集成. 下面话不多说了,来一起看看详细的介绍吧 一.手动方式

  • jenkins安装及其配置笔记

    一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测试和部署技术.Jenkins是一种软件允许持续集成. 1.2 Jenkins目的: 1.持续.自动地构建/测试软件项目. 2.监控软件开放流程,快速问题定位及处理,提示开放效率. 1.3 特性: 开源的java语言开发持续集成工具,支持CI,CD. 易于安装部署配置:可通过yum

随机推荐