SVN + Jenkins 构建自动部署
1. 前言
因为研发部门不想把他们的源代码 git 到服务器再编译,git + maven + jenkins 的方式行不通,于是采用 svn + jenkins的方式,流程如下:

只需要 程序员 手动提交到svn ,后面的事件都是由 jenkins 自动完成的。
2. 实现过程
环境介绍

2.1 svn 服务器搭建
时间同步、selinux 、iptables 这些初始化工作就不在说了。
安装svn程序包
[root@192.168.118.14 ~]#yum install subversion -y
创建common项目 svn目录
[root@192.168.118.14 ~]#mkdir -pv /svn/dev_test
创建svn仓库
[root@192.168.118.14 ~]#svnadmin create /svn/dev_test/
[root@192.168.118.14 ~]#ls /svn/dev_test/
conf db format hooks locks README.txt
修改svn配置文件,设置用户及权限:
三个文件说明:
Passwd - 用户名和密码
[root@192.168.118.14 /svn/dev_test/conf]#egrep -v "^#|^$" passwd
[users]
dev_test:dev_test123 我这里新增了用户 dev_test 密码: dev_test123 Authz - 设置权限
[root@192.168.118.14 /svn/dev_test/conf]#egrep -v "^#|^$" authz
[aliases]
[groups]
admin = dev_test
[/]
@admin = rw 定义 dev_test 为 管理员组,且管理员组对这个svn仓库有读写权限。 svnserve.conf - 仓库主配置文件
[root@192.168.118.14 /svn/dev_test/conf]#egrep -v "^#|^$" svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
[sasl]
配置完这些,就可以启动 svn 服务了。
[root@192.168.118.14 /svn/dev_test/conf]#svnserve -d -r /svn/
ok,到这里 svn 启动成功,可以通过本地主机进行测试,可以在 window端安装 svn 客户端进行测试:


点击OK,输入用户名和密码

Svn 测试成功。
2.2 jenkins 服务器搭建
参考之前的博客:https://www.cnblogs.com/hukey/p/11207345.html
2.3 ansible 安装
[root@192.168.118.14 ~]#yum install ansible -y
在配置ansible 之前需要做无密码认证登录
两台服务节点,如果节点多的话,可以使用 execpt 来写脚本,具体参考之前的博客:https://www.cnblogs.com/hukey/p/10949963.html
[root@192.168.118.14 ~]#ssh-keygen -t rsa -P ''
[root@192.168.118.14 ~]#ssh-copy-id 192.168.118.15
[root@192.168.118.14 ~]#ssh-copy-id 192.168.118.16
做好无密码验证之后在配置 ansible
[root@192.168.118.14 ~]#vim /etc/ansible/hosts [dev_test_node1]
192.168.118.15 ansible_user=root app_dir=/app/node1/
[dev_test_node2]
192.168.118.15 ansible_user=root app_dir=/app/node1/ 测试 ansible
[root@192.168.118.14 ~]#ansible all -m ping
192.168.118.15 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.118.16 | SUCCESS => {
"changed": false,
"ping": "pong"
}
2.4 服务节点启动脚本编写
这里只记录 app-node1 192.168.118.15 编写的过程, 192.168.118.16 一样的操作
[root@192.168.118.15 ~]#mkdir -pv /app/node1
[root@192.168.118.15 ~]#cd /app/node1/
[root@192.168.118.15 /app/node1]#cat service.sh
#!/bin/bash
# Author:hukey
APP_HOME=/app/node1
cd $APP_HOME
APP=$(ls *.jar)
start(){
nohup java -jar $APP &
} stop(){
PID=$(cat winstar-common-api.pid)
kill -9 $PID
} update(){
stop
DATE=$(date +"%Y%m%d%H%M%S")
if [ ! -f backup/app/$DATE ];then
mkdir -p backup/app/$DATE
fi
mv $APP backup/app/$DATE && rm -rf nohup.out
} case $1 in
start)
start
;;
stop)
stop
;;
update)
update
;;
*)
echo "用法:$0 [start | stop | restart | update]"
esac
编写了一个很简陋的脚本文件,因为测试,只要实现功能即可,生产使用建议进行优化。
注意脚本的 start 和 update 部分,因为待会 ansible 会使用到两处。
2.5 配置 jenkins 任务并实现提交svn触发jenkins


写完,点击保存。
任务创建完成,这里可以进行一下测试。
在刚才window主机的svn下新建一个文件夹作为 dev_test 的仓库,然后编写 Jenkinsfile 文件及脚本文件,具体如下:
Jinkinsfile 文件内容:
pipeline{
agent any
stages {
stage('Deliver') {
steps {
withEnv(['JENKINS_NODE_COOKIE=dontkillme']) {
sh 'sh ./dev_test/jenkins/scripts/deliver.sh'
}
}
}
}
}
这里使用的是 Jinkinsfile 语法,其实也就是去触发了一个 shell脚本,根据路径创建脚本:
脚本对应上面的目录应该是:./dev_test/jenkins/scripts/deliver.sh
#!/bin/bash
# Author:hukey
function start(){
ansible $1 -a "/app/node1/service.sh start"
} function update(){
if [ ! -f /var/lib/jenkins/workspace/dev_test/dev_test/*.jar ];then
echo '[Error]:java.jar not exist, update failed.'
exit 1
fi
JAR=$(ls /var/lib/jenkins/workspace/dev_test/dev_test/*.jar)
ansible $1 -a "{{app_dir1}}/service.sh update"
ansible $1 -m copy -a "src=$JAR dest={{$2}}"
} function netPort(){
ansible $1 -a "netstat -ntplu"
} update dev_test_node1 app_dir1
sleep 3
start dev_test_node1 while sleep 5; do
START_CODE=$(netPort dev_test_node1 | egrep java | wc -l)
if [ $START_CODE -ge 1 ]; then
update dev_test_node2 app_dir1
sleep 3
start dev_test_node2
break
fi
done

这个脚本主要是配合 服务节点上的 service.sh 脚本,上面这个脚本必须能够正确的调用到 service.sh才行。
Jinkinsfile 文件目录:

deliver.sh 脚本目录:

接下来将程序拷贝进来提交到 svn 服务器,然后通过手动构建 jenkins 做测试。




ok,程序已经提交到 svn 了, 接下来切换到 jenkins 进行手动构建测试。


第一次通过 jenkins 构建 一般都会出现这样的报错,原因是 jenkins 默认是通过 jenkins 用户来运行的,当jenkins 用户使用ansible 推送的时候,jenkins用户并没有做无密码登录。
因此使用 root 用户来启动 jenkins 服务。
[root@192.168.118.14 ~]#vim /etc/sysconfig/jenkins 修改 JENKINS_USER="jenkins" 为 JENKINS_USER="root"
重启服务,再次构建:
[root@192.168.118.14 ~]#systemctl restart jenkins
这里使用 jenkins 构建的前提是,两个服务节点的服务都在正常工作的前提下。
如果脚本都没问题的前提下,手动构建是会直接成功的。接下来进行 svn 提交自动触发jenkins 任务配置。
Jenkins -> 系统管理 -> Jenkins 命令行接口 下载 jenkins-cli.jar
切换到 192.168.118.14
[root@192.168.118.14 ~]#cd /svn/dev_test/hooks/
将 jenkins-cli.jar 拷贝到该目录,并创建一个脚本文件 post-commit
#!/bin/bash
java -jar /svn/dev_test/hooks/jenkins-cli.jar -s http://192.168.118.14:8080/ -auth dev_test:dev_test build dev_test
上面的脚本使用 dev_test用户 dev_test密码登录到 jenkins 构建 dev_test 项目。
注意权限:
[root@192.168.118.14 /svn/dev_test/hooks]#chmod +x post-commit jenkins-cli.jar
因此需要在jenkins 创建一个 dev_test 用户且密码为 dev_test
Jenkins -> 系统管理 -> 管理用户 -> 新建用户

再次提交测试:

构建成功。 记录的不是特别详细,但是整体的思路已经很清晰了。如果有同学需要这样的实现,遇到不懂的地方,下面留言直接问。
SVN + Jenkins 构建自动部署的更多相关文章
- Gitlab+Jenkins实现自动部署
Gitlab+Jenkins实现自动部署 系统环境: Gitlab主机 IP:192.168.1.2 Jenkins主机 IP:192.168.1.3 一.为何要做自动部署 #部署Tomcat的在 ...
- 在linux服务器上装svn版本管理,自动部署代码到项目
在linux服务器上装svn版本管理,自动部署代码到项目 http://bbs.aliyun.com/read/9715.html?spm=5176.7114037.1996646101.1.W3zw ...
- GitHub + circleCI 自动构建/自动部署 应用
GitHub + circleCI 自动构建/自动部署, 这里略过了单元测试,以部署 laravel 应用为例子 比起 gitlab + ansible + genkins 操作起来节省了很多硬件资源 ...
- 在linux服务器上装svn版本管理,自动部署代码到web项目
在linux服务器上装svn版本管理,自动部署代码到项目 1.安装svn服务器端 yum install subversion 从镜像下载安装svn服务器端 中间会提示是否ok,输入y,确认 ...
- Jenkins代码自动部署相关文档
环境 centos 7.0+ Java JDK 1.8+ jenkins 2.220 maven 3.0+ git 1.8+ 注意事项 一. linux 安装 JDK (jdk-8u201-linux ...
- 使用Jenkins构建、部署spring boot项目
一.环境搭建 本次实验的环境为Ubuntu 16.04,Jenkins 2.8.3 1.安装ssh sudo apt-get update # 更新软件源 sudo apt-get install o ...
- Jenkins之自动部署、代码安全扫描、自动化接口测试
搭建Jenkins wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.reporpm --i ...
- springboot+Jenkins+docker-compose自动部署项目实践
DevOps思想 一个开发.测试.运维的整个过程的思想. plan:需求.计划 code:编码 build:构建 test: 测试 release:发布版本 deploy:部署 operate:项目运 ...
- 使用jenkins 插件自动部署项目至tomcat
前面使用maven.ant编译项目就不说,只说一下使用jenkins的插件自动部署项目 1.首先jenkins安装插件Deploy to container Plugin ,下载地址为:https:/ ...
随机推荐
- 离线安装docker(RedHat7.4)
离线安装docker(RedHat7.4) docker 1. 下载地址 2. 解压并注册为service 1. 下载地址 官网下载地址:下载 官网文档地址:文档 2. 解压并注册为service 下 ...
- 微信小程序~事件绑定和冒泡
[1]事件绑定和冒泡 事件绑定的写法同组件的属性,以 key.value 的形式. key 以bind或catch开头,然后跟上事件的类型,如bindtap.catchtouchstart.自基础库版 ...
- Django REST framework —— 认证组件源码分析
我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...
- 关闭centos大页及swappiness
首先检查THP的启用状态: [root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag [always] madvise ne ...
- axure快速上手
Axure RP是一个专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写.Axure RP是美国Axur ...
- Fiddler——手机端无法安装证书
前言 一个APP测试,需要抓包,设置好代理后,访问代理地址,下载证书,下载完成却不能安装. 提示:无法读取该证书文件 手机型号: OPPO A5 步骤 设置->其他设置->设备与隐私-&g ...
- 2019牛客多校第九场AThe power of Fibonacci——扩展BM
题意 求斐波那契数列m次方的前n项和,模数为 $1e9$. 分析 线性递推乘线性递推仍是线性递推,所以上BM. 由于模数非质数,上扩展版的BM. 递推多少项呢?本地输入发现最大为与前57项有关(而且好 ...
- fitnesse的安装
最近项目组有个单独的功能模块需要写自动化,由于是测试接口,我本来是想用之前那个项目组使用的robot framework+python,但是呢,项目组领导觉得,目前项目开发语言是java,相应的自动化 ...
- jmeter使用教程
jmeter是基于JVM(最新版本基于jdk8+)的压测工具包.提供了丰富的工具来设置压测计划,执行压测任务和生成压测报告. 我这边使用的是windows10平台. 整个流程如下: 1.下载jmete ...
- 洛谷 题解 UVA572 【油田 Oil Deposits】
这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...