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 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2018-09-20 [ python ] 函数进阶
2018-09-20 [ python ] 函数的参数