1、安装SVN服务器,安装方法网上很多资料可参考。
在opt目录下创建svn库 /opt/svnrepo/
在该目录下执行以下命令,创建一个版本库svn
svnadmin create svn
创建完成后,/opt/svnrepo/目录下会生成svn目录,进入svn目录,会看到里面包含如下目录
conf:配置文件目录
db:上传的文件库
hooks:保存钩子命令脚本文件
locks:锁文件
进入conf目录,修改svnserve.conf文件内容如下
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = My Svn ##这里随意
修改passwd创建一组用户名和密码,格式如下
harry = harryssecret
修改authz文件,给上面创建的用户授权
harry=wr ##wr表示读写
通过以下命令启动svn服务
svnserve -d -r /opt/svnrepo/
2、安装Maven,Jenkins需要通过Maven对Maven项目打包
3、安装Tomcat,Jenkins和项目都需要运行到tomcat容器中,当然也可以分开部署到不同的容器中,
安装好tomcat之后,在conf目录下的tomcat-users.xml文件中创建用户和角色,如下所示
4、安装Jenkins
下载好jenkins.war,将其放到tomcat的webapps目录即可,启动tomcat即可访问到jenkins,第一次访问时需要去查看admin账号的密码,其实在tomcat时日志中也有打印出来,该密码在 /root/.jenkins/secrets/initialAdminPassword 文件中,在jenkins页面中输入该密码后就可以登录成功,之后选择安装推荐的插件就行。
1)、在系统管理-全局安全配置中设置如下
2)、在系统管理-全局工具配置中,配置jenkins所需的maven的settings.xml、JDK、Maven相关信息,如下图所示
3)、在插件管理中找到 Deploy to container 进行安装
4)、将创建的web项目上传到上面搭建好的svn库中
5)、在jenkins中新建一个项目,去设置相关属性,比如源码库,构建等,在这里我遇到一个很奇葩的问题,在设置源码库为svn库,然后需要保存svn库的用户名和密码的操作上出现了问题,我发现这一步骤调用的接口不是我设置的jenkins服务的域名,而是调用了127.0.0.1,真的有点搞笑,难道jenkins的页面把这里写死了?
怎么解决这个问题呢,我只能在本地起了一个nginx,将这个请求转发到了xxx.cn/jenkins上去,又因为我的xxx.cn域名配置了https,这里转发的时候转发到http的,服务器上又设置了一个http自动跳转到https,但这里又出现了把Post请求转成Get请求导致报405错误的问题;
本地nginx配置:
location /jenkins {
proxy_set_header Host xxx.cn;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://xxx.cn/jenkins;
}
服务器上http转https的配置:
server {
listen 80;
server_name xxx.cn;
##下面这句解决post请求被转成get请求的问题
return 307 https://$host$request_uri;
}
设置构建
配置好源码库和构建之后就可以对项目进行构建了
构建成功之后可以在工作区看到target目录和打包完成的war包
目前jenkins已经可以拿到svn库的源码通过maven进行打包操作了,接下来就是怎么将打包好的war部署到容器中,在项目中设置构建后的操作,如下图
设置好之后,再次进行构建,查看日志会发现jenkins会把war部署到指定容器,也可以去查看tomcat下的webapps目录,就能清楚的看到,最合理的办法那当然是去访问部署的项目,不出意外应该是可以正常访问的。至此,其实基本的功能都已经实现了,但感觉还是不够。
6)、提交代码触发svn的钩子程序去通知jenkins执行项目构建
如何通知jenkins去构建呢,jenkins提供了构建触发器,如下图进行配置
如上图,那最后完整的通知URL如下,只要在浏览器中运行该url,jenkins就会启动项目构建操作
https://xxx.cn/jenkins/user/admin/my-views/view/all/job/jenkins-one/build?token=jenkins-one-abc123
还记得上面安装svn部分,介绍svn版本库中的目录吗?其中有一个hooks目录,其中就是一些钩子程序,我们只需要将上面的url通过linux命令执行一遍即可通知到jenkins了,那用什么命令呢,没错就是curl,将下面的命令写到hooks目录中的post-commit.tmpl文件中,最后一定要记得将该文件重命名去掉.tmpl后缀,并且这里也不要.sh。
curl -X post -v -u admin:password -H "Jenkins-Crumb:583e0c4c4514ac5564d65c9412b279fcecc83d0f8dd996f6c9ed589ff9282b8c" https://xxx.cn/jenkins/user/admin/my-views/view/all/job/jenkins-one/build?token=jenkins-one-abc123
上面的命令中-H后是一个头部head,这里的Jenkins-Crumb是防止跨站点请求伪造,当然也可以不加这个头部信息,那它是如何获取的呢,在admin用户的设置下进行如下操作,获取API Token
拿到生成的API Token,在浏览器中执行如下请求
http://admin:[email protected]/jenkins/crumbIssuer/api/xml
该请求会返回一段xml,如下图所示,其中crumb标签的值就是上面的Jenkins-Crumb头
最后将上面的curl命令写入到hooks目录下的post-commit文件即可,可以将文件中原有的内容全部注释掉即可,这时,咱们在改完代码提交到svn之后就会自动触发jenkins进行构建操作。
7)、处理jenkins构建时出现从svn库中拉取不到最新版本源码的问题
我们反复修改几次代码,提交svn,触发jenkins构建,然后访问项目,会发现jenkins构建时拉取的不是最新代码,而是上一个版本的代码,通过如下方式进行处理即可