SVN + Jenkins 构建自动部署

1. 前言

因为研发部门不想把他们的源代码 git 到服务器再编译,git + maven + jenkins 的方式行不通,于是采用 svn + jenkins的方式,流程如下:

 

 

 

只需要 程序员 手动提交到svn ,后面的事件都是由 jenkins 自动完成的。

 

2. 实现过程

 

环境介绍

 

 

 

2.1 svn 服务器搭建

时间同步、selinux 、iptables 这些初始化工作就不在说了。

安装svn程序包

1
2
3
4
5
6
7
[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配置文件,设置用户及权限:

三个文件说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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]

 

1
2
3
4
5
6
7
###说明###
 
anon-access = none             # 匿名用户不可读写,也可设置为只读 read
auth-access = write            # 授权用户可写
password-db = passwd           # 密码文件路径,相对于当前目录
authz-db = authz               # 访问控制文件
realm = /var/opt/svn/svn       # 认证命名空间,会在认证提示界面显示,并作为凭证缓存的关键字,可以写仓库名称比如svn

 

 

配置完这些,就可以启动 svn 服务了。

1
[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 安装

1
[root@192.168.118.14 ~]#yum install ansible -y

在配置ansible 之前需要做无密码认证登录

两台服务节点,如果节点多的话,可以使用 execpt 来写脚本,具体参考之前的博客:https://www.cnblogs.com/hukey/p/10949963.html

1
2
3
[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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[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 一样的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[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 文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/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 服务。

1
2
3
4
5
[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

1
2
3
4
[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 项目。

注意权限:

1
[root@192.168.118.14 /svn/dev_test/hooks]#chmod +x post-commit jenkins-cli.jar

因此需要在jenkins 创建一个 dev_test 用户且密码为 dev_test

 

Jenkins -> 系统管理 -> 管理用户 -> 新建用户

 

 

再次提交测试:

 

 

构建成功。 记录的不是特别详细,但是整体的思路已经很清晰了。如果有同学需要这样的实现,遇到不懂的地方,下面留言直接问。

 

本文作者:hukey

本文链接:https://www.cnblogs.com/hukey/p/11555206.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hukey  阅读(18256)  评论(11编辑  收藏  举报
历史上的今天:
2018-09-20 [ python ] 函数进阶
2018-09-20 [ python ] 函数的参数
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 彩虹 Jay
彩虹 - Jay
00:00 / 00:00
An audio error has occurred.

彩虹 + 轨迹 (Live) - 周杰伦 (Jay Chou)

彩虹

词:周杰伦

曲:周杰伦

哪里有彩虹告诉我

哪里有彩虹告诉我

能不能把我的愿望还给我

能不能把我的愿望还给我

为什么天这么安静

为什么天这么安静

所有的云都跑到我这里

有没有口罩一个给我

有没有口罩一个给我

释怀说了太多就成真不了

释怀说了太多就成真不了

也许时间是一种解药

也许时间是一种解药

也是我现在正服下的毒药

也是我现在正服下的毒药

看不见你的笑 我怎么睡得着

看不见你的笑 我怎么睡得着

你的声音这么近我却抱不到

你的声音这么近我却抱不到

没有地球太阳还是会绕

没有地球太阳还是会绕

没有理由我也能自己走

没有理由我也能自己走

你要离开 我知道很简单

你要离开 我知道很简单

你说依赖 是我们的阻碍

你说依赖 是我们的阻碍

就算放开 但能不能别没收我的爱

就算放开 但能不能别没收我的爱

当作我最后才明白

当作我最后才明白

看不见你的笑 要我怎么睡得着

看不见你的笑 要我怎么睡得着

你的声音这么近我却抱不到

没有地球太阳还是会绕 会绕

没有理由我也能自己走掉

释怀说了太多就成真不了

也许时间是一种解药 解药

也是我现在正服下的毒药

轨迹

词:黄俊郎

曲:周杰伦

我会发着呆然后忘记你

接着紧紧闭上眼

想着哪一天 会有人代替

想着哪一天 会有人代替

让我不再想念你

我会发着呆 然后微微笑

我会发着呆 然后微微笑

接着紧紧闭上眼

又想了一遍 你温柔的脸

又想了一遍 你温柔的脸

在我忘记之前