1、持续部署、持续集成、持续交互

在讲svn和jenkins持续集成之前,必须先了解下持续部署、持续集成以及持续交互的概念。

1.1、持续部署

关注点:在于项目功能部署至服务器后可以运行,为下一步测试环节或者最终用户正式使用做好准备工作。

1.2、持续集成

关注点:在于尽早发现项目整体运行问题, 尽早解决。

在项目的开发过程中,每个人(团队)都需要负责不同的模块,单个人(团队)开发测试能够通过,并不代表把所有模块整合测试能够通过,因为各个模块之间虽然可以独立完成,独立测试也是可以通过,但是上线整合在一起总会遇到各种问题,因为各个模块虽然可以独立开发或者运行,但避免不了相互调用或者数据的依赖问题。

经常性、 频繁的把所有模块集成在一起进行测试, 有问题尽早发现, 这就是持续集成。

1.3、持续交互

关注点:在于研发团队的最新代码(功能)能够尽快让最终用户体验到。

程序员开发的新功能,也通过了测试人员的测试,但是并不代表用户就一定喜欢。等开发人员把所有功能都开发完成后,再交给客户体验或者验收,但客户不喜欢或者不满意某个功能的时候,需要返工,不仅照成项目的大量改动,延期工期,用户体验也不佳。

如果用小版本不断进行快速迭代,不断收集用户反馈信息,用最快的速度改进优化。

1.4、总体目标

①、降低风险

一天中进行多次的集成, 并做了相应的测试, 这样有利于检查缺陷, 了解软件的健康状况, 减少假定。

②、减少重复过程

产生重复过程有两个方面的原因:

一个是编译、 测试、 打包、 部署等等固定操作都必须要做, 无法省略任何一个环节;

另一个是一个缺陷如果没有及时发现, 有可能导致后续代码的开发方向是错误的,要修复问题需要重新编写受影响的所有代码。

……

2、项目部署方式的对比

2.1、手动部署

图片

2.2、自动化部署

“自动化”的具体体现:向版本库中提交代码后,应用服务器上自动(自动、定时或者一键)部署,用户或者测试人员使用的立马是就是最新的应用程序或者功能。

图片

3、Jenkins+SVN持续集成环境搭建

搭建上述持续集成环境可以把整个构建、部署的过程自动化,减轻了开发人员的工作量,把自己的代码提交上去之后,服务器哈桑运行的马上就是最新版本。

要能够成功搭建或成功使用整套持续集成环境,这个操作过程过程虽然繁琐,但总体也没有什么难道,但是需要以下前提知识:

  • Linux系统基本命令操作和编辑器vim的使用

  • Maven的使用和Maven项目的构建

  • SVN的使用

    3.1、系统结构

    3.1.1、版本控制子系统

    也就是Subversion所在的服务器,它包括:

  • Subversion服务

  • 项目对应的版本库

  • 版本库钩子程序

    3.1.2、持续集成子系统

    Jenkins所在的服务器,它包括:

  • JDK

  • Maven

  • Tomcat

  • Jenkins

其中Jenkins中包含:

  • 主体程序(jenkins的war包)

  • SVN插件

  • Maven插件

  • Deploy to web container插件

    3.1.3、应用发布子系统

    也就是部署项目(测试或者生产环境)的服务器,它包括:

  • JDK

  • Tomcat

    3.2、环境的搭建

    3.2.1、版本控制子系统

    Subversion所在的服务器,我这里是192.168.199.242。安装过程省略,请参考《centos7安装svn》。这里记录下我的svn的账户密码:

图片

svnserve.conf文件中的anon-access一定要打开注释并设置为none:

图片

版本控制子系统服务器(242):

svn://192.168.199.242:3690/test_project

3.2.2、应用发布子系统

按3.1.3节内容,应用发布子系统需要安装JDK和tomcat,由于JDK和tomcat安装部署的过程相对比较简单,这边就省略安装过程,只记录下tomcat下tomcat-users.xml。

文件路径:

tomcat/config/tomcat-users.xml

  • 对tomcat添加角色和用户:
1
2
3
4
5
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="seage" password="seagetech" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

其中user标签的username=”seage”,表示用户名为seage;password=”seagetech”,表示密码为seagetech

  • 修改访问权限

至少启动一次tomcat,在webapps/manager/META-INF/context.xml下,将allow值替换为”^.*$:

1
2
3
4
<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="^.*$" />
</Context>

应用发布子系统服务器:

内网:http://192.168.199.242/

3.2.3、持续集成子系统

①、maven的配置

官网下载:

1
2
cd /opt
wget https://archive.apache.org/dist/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz

解压:

1
tar -zxvf apache-maven-3.5.3-bin.tar.gz

复制到/usr/local下

1
cp -rf apache-maven-3.5.3/ /usr/local/maven3.5.3/

在maven3.5.3创建创库

1
2
cd /usr/local/maven3.5.3/
mkdir repository

修改settings.xml文件,指定创库地址

1
2
cd conf/
vi settings.xml

图片

配置环境变量

1
vi /etc/profile

在profile文件最后一行键入如下内容

1
2
MAVEN_HOME=/usr/local/maven3.5.3
export PATH=${MAVEN_HOME}/bin:${PATH}

重启配置文件,使改生效

1
source /etc/profile

测试maven配置是否成功

1
mvn -v

结果如下说明配置成功
图片

②、安装Jenkins

官网下载

1
2
cd /opt
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

将下载后的war包复制到tomcat下的webapps下

1
cp -rf jenkins.war /usr/local/tomcat8.5.47/webapps/jenkins.war

启动tomcat,访问Jenkins地址:

内网:http://192.168.199.242/jenkins/

图片

解锁Jenkins,按登录界面提示,从/root/.jenkins/secrets/initialAdminPassword文档中获取admin用户的密码

1
cat /root/.jenkins/secrets/initialAdminPassword

图片

在管理员密码输入框输入获取的密码,然后点击右下角的继续,但是界面可能会出现这个离线的界面

图片

修改hudson.model.UpdateCenter.xml文件

1
vi /root/.jenkins/hudson.model.UpdateCenter.xml

图片

将url中的地址https改成http,保存退出即可,然后再重启tomcat或者Jenkins。重新登录Jenkins后,则进入到新手入门界面

图片

两种选择:安装推荐的插件、选择插件来安装,两种方式都可以选择,不管选择哪一种都没有什么影响,因为插件安装的话在后续还是可以安装的,这里我们选择安装推荐的插件,进入安装页面

图片

这一步骤可能有点慢,请耐心等待,安装完成后,会提示重启jenkins,重启后,重新登录,后面几个页面只有按照导向来完成即可,没有什么复杂的,这里省略,最终Jenkins的主页面如下:

图片

表示Jenkins已完成安装

3.3、Jenkins的使用

3.3.1、全局配置

  • 全局maven配置:maven Configuration

在主页面选择Manager Jenkins

图片

全局工具配置Global Tool Configuration

图片

找到第一个maven配置,默认settings和全局的settings。都选择Settings file in filesystem。然后输入文件路径/usr/local/maven3.5.3/conf/settings.xml(即3.2.3节搭建的maven下的settings.xml文件)

图片

  • JDK配置

在Maven配置同界面,找到JDK安装位置

图片

点击新增JDK

图片

取消Install automatically的勾选

图片

输入别名,随意填写,JAVA_HOME,即jdk的安装位置

图片

  • maven配置

在JDK同页面,找到Maven安装界面

图片

点击新增Maven

图片

去掉Install automatically的勾选

图片

输入Name名称,随便输入,MAVEN_HOME即3.2.3节安装的maven路径

图片

最后点击保存,全局配置完成。

3.3.2、安装插件

在3.2.2节中,Jenkins中还需要Deploy to web container插件,该插件用于发布war包到自定的tomcat中,即应用发布子系统中。

Manage Jenkins -> Manage Plugins

图片

选择可选插件

图片

找到Deploy to container,并勾选

图片

然后点击直接安装

图片

安装等待中,安装完Jenkins后重启

图片

3.3.3、创建工程

  • 创建工程

首先应该有个web工程项目,使用idea创建一个测试的springboot项目,创建过程省略,这里记录主要代码。

项目结构:

图片

其中JenkinsController类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.seagetech.jenkins.test;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @author wangzb
* @date 2019/11/17 15:15
*/
@RestController
@RequestMapping(value = "/")
public class JenkinsController {

@GetMapping("/sayHello")
public String sayHello(){
return "Hello Jenkins!";
}
}

将项目部署到应用发布子系统中,访问/sayHello接口:

内网:http://192.168.199.242/jenkinsTest/sayHello

页面显示:

图片

  • 将项目提交到svn

svn最终结构如下:

图片

3.3.4、创建任务

一切准备就绪,最后一步就是在jenkins上创建持续集成任务。

  • 新建任务

jenkins主页面,选择新建Item

图片

输入一个任务名称,并选择Freestyle project

图片

  • 源码管理

图片

选择Subversion

图片

Repository URL:代码创库地址,注意一点,创库地址必须到项目的根目录,也就是所填写的地址是pom文件所在目录,按3.3.3节创建的项目,本输入框填写地址:

1
svn://192.168.199.242/test_project/jenkins-test

Credentials:证书,也就是用户名密码,我们在3.2.1节在conf下的passwd文件中设置的密码,此处为seage/seagetech。点击添加,然后在选择框中选择刚刚添加的账户密码。
图片

最终如下:

图片

  • 构建

新增构建步骤,选择Invoke top-level Maven targets

图片

在Maven版本中选择3.3.1节中配置的maven,目标填写clean和install,即清理和安装命令

图片

  • 构建后操作

构建后的操作就是将构建后的war包发布到应用发布子系统中,点击增加构建后操作步骤,然后选择Deploy war/ear to a container。即我们在3.3.2节安装的插件

图片

WAR/EAR files :war、ear包的名字,即我们平常打包后war包所在的路径(相对路径)和war包的名字,我们测试项目是在target/jenkins-test-0.0.1.war;

Context path:项目的Context path,即部署到应用发布子系统中的tomcat下的war包名,按3.3.3节部署到tomcat下的名字是jenkinsTest。

图片

Containers:容器,点击Add Container,我们使用的是tomcat8,选择Tomcat 8.x Remot

图片

图片

添加Credentials(认证),即3.3.2节设置的tomcat的用户名和密码,点击添加

图片

Tomcat的地址,按3.2.2节,tomcat的地址为:http://192.168.199.242/

最终如下:

图片

  • 保存

最后一步,别忘记保存刚刚的设置,点击保存后,进入到该任务的主页面

图片

  • Build Now(立即构建)

点击Build Now,立即构建,点击构建后,jenkins就按2.2节自动化部署那张图的流程开始工作“”

第一:jenkins调用svn插件从svn中获取源码;

第二:调用maven插件对项目源码进行clean和install操作,并获得war包;

第三:调用deploy to web container插件将war包部署到tomcat中。

图片

之后可以在左下角看到构建历史,每个构建历史可以查看控制台构建情况

图片

如果在控制台能够看到success,表示此时构建成功

图片

3.3.5、构建触发器

在上一节中,我们成功的完成了jenkins的一次构建流程,需要点击立即构建才能部署最新代码到tomcat下,那如果有这样的需求,程序员将代码提交到svn上时,自动触发jenkins的构建项目。

这就需要3.1.1节提到的SVN的钩子程序和jenkins的构建触发器。

  • jenkins的构建触发器

在jenkins_test任务主界面,选择配置

图片

进入配置页面,然后找到构建触发器

图片

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

比如我们这里jenkins中jenkins_test任务配置地址是:

1
http://192.168.199.242/jenkins/job/jenkins_test

而且配置的token为:JENKINS_TEST,那么全路径便是:

1
http://192.168.199.242/jenkins/job/jenkins_test/build?token=JENKINS_TEST

所以访问上述地址,就会触发jenkins_test任务的构建操作

最终如下:

图片

  • SVN的钩子程序

按3.2.1节,test_project创库的路径是:/var/svn/repository/test_project/

1
2
cd /var/svn/repository/test_project/
ll

图片

hooks目录下就是钩子程序所存放的目录

1
2
cd hooks
ll

图片

其中post-commit提交后出触发,pre-commit提交前触发等等,这里我们需要pre-commit.tmpl。注意最终svn调用的文件是不带任何后缀的,即文件名称为pre-commit。复制pre-commit.tmpl并指定文件名称为pre-commit

1
2
cp post-commit.tmpl post-commit
ll

图片

编辑post-commit文件

1
vi post-commit

文件内容如下
图片

将最后三行代码都注释掉

图片

并在最后一行输入如下内容

1
curl -X post -v -u admin:33345ba68a214e238f73ab635dde930c http://192.168.199.242/jenkins/job/jenkins_test/build?token=JENKINS_TEST

保存退出,curl命令解析:

-X:指定请求方式,这里指定为post请求

-v:显示响应结果

-u:携带用户名密码,即Jenkins的用户名(admin)和密码(在3.2.3节中提到,使用 cat /root/.jenkins/secrets/initialAdminPassword命令获取)

最后在修改post-commit文件的权限,要不然svn没有权限执行post-commit文件

1
chmod 555 post-commit

3.5.6、测试

到3.5.5节我们所有的事情都做完了,接下来就是测试,我们在idea工作区,修改3.3.3节创建的工程中的JenkinsController的代码,修改后的部分代码

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping(value = "/")
public class JenkinsController {

@GetMapping("/sayHello")
public String sayHello(){
return "Hello Jenkins hoots! dd gg dd";
}
}

然后提交到svn,如果jenkins的jenkins_test工程下多了一次构建,并且构建成功

图片

那么我们通过下面的地址http://192.168.199.242/jenkinsTest/sayHello就可以看到新的内容

图片

最后更新: 2019年11月25日 17:59

原始链接: https://www.sunnymaple.cn/2019/11/22/Jenkins+SVN持续集成/

× 请我吃糖~
打赏二维码