1. 前言

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

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

2. 实现过程

环境介绍

2.1 svn 服务器搭建

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

安装svn程序包

  1. [root@192.168.118.14 ~]#yum install subversion -y
  2. 创建common项目 svn目录
  3. [root@192.168.118.14 ~]#mkdir -pv /svn/dev_test
  4. 创建svn仓库
  5. [root@192.168.118.14 ~]#svnadmin create /svn/dev_test/
  6. [root@192.168.118.14 ~]#ls /svn/dev_test/
  7. conf db format hooks locks README.txt

修改svn配置文件,设置用户及权限:

三个文件说明:

  1. Passwd - 用户名和密码
  2. [root@192.168.118.14 /svn/dev_test/conf]#egrep -v "^#|^$" passwd
  3. [users]
  4. dev_test:dev_test123
  5.  
  6. 我这里新增了用户 dev_test 密码: dev_test123
  7.  
  8. Authz - 设置权限
  9. [root@192.168.118.14 /svn/dev_test/conf]#egrep -v "^#|^$" authz
  10. [aliases]
  11. [groups]
  12. admin = dev_test
  13. [/]
  14. @admin = rw
  15.  
  16. 定义 dev_test 管理员组,且管理员组对这个svn仓库有读写权限。
  17.  
  18. svnserve.conf - 仓库主配置文件
  19. [root@192.168.118.14 /svn/dev_test/conf]#egrep -v "^#|^$" svnserve.conf
  20. [general]
  21. anon-access = none
  22. auth-access = write
  23. password-db = passwd
  24. authz-db = authz
  25. [sasl]

配置完这些,就可以启动 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. [root@192.168.118.14 ~]#ssh-keygen -t rsa -P ''
  2. [root@192.168.118.14 ~]#ssh-copy-id 192.168.118.15
  3. [root@192.168.118.14 ~]#ssh-copy-id 192.168.118.16

做好无密码验证之后在配置 ansible

  1. [root@192.168.118.14 ~]#vim /etc/ansible/hosts
  2.  
  3. [dev_test_node1]
  4. 192.168.118.15 ansible_user=root app_dir=/app/node1/
  5. [dev_test_node2]
  6. 192.168.118.15 ansible_user=root app_dir=/app/node1/
  7.  
  8. 测试 ansible
  9. [root@192.168.118.14 ~]#ansible all -m ping
  10. 192.168.118.15 | SUCCESS => {
  11. "changed": false,
  12. "ping": "pong"
  13. }
  14. 192.168.118.16 | SUCCESS => {
  15. "changed": false,
  16. "ping": "pong"
  17. }

2.4 服务节点启动脚本编写

这里只记录 app-node1 192.168.118.15 编写的过程, 192.168.118.16 一样的操作

  1. [root@192.168.118.15 ~]#mkdir -pv /app/node1
  2. [root@192.168.118.15 ~]#cd /app/node1/
  3. [root@192.168.118.15 /app/node1]#cat service.sh
  4. #!/bin/bash
  5. # Author:hukey
  6. APP_HOME=/app/node1
  7. cd $APP_HOME
  8. APP=$(ls *.jar)
  9. start(){
  10. nohup java -jar $APP &
  11. }
  12.  
  13. stop(){
  14. PID=$(cat winstar-common-api.pid)
  15. kill -9 $PID
  16. }
  17.  
  18. update(){
  19. stop
  20. DATE=$(date +"%Y%m%d%H%M%S")
  21. if [ ! -f backup/app/$DATE ];then
  22. mkdir -p backup/app/$DATE
  23. fi
  24. mv $APP backup/app/$DATE && rm -rf nohup.out
  25. }
  26.  
  27. case $1 in
  28. start)
  29. start
  30. ;;
  31. stop)
  32. stop
  33. ;;
  34. update)
  35. update
  36. ;;
  37. *)
  38. echo "用法:$0 [start | stop | restart | update]"
  39. esac

编写了一个很简陋的脚本文件,因为测试,只要实现功能即可,生产使用建议进行优化。

注意脚本的 start  和 update 部分,因为待会 ansible 会使用到两处。

2.5 配置 jenkins 任务并实现提交svn触发jenkins

写完,点击保存。

任务创建完成,这里可以进行一下测试。

在刚才window主机的svn下新建一个文件夹作为 dev_test 的仓库,然后编写 Jenkinsfile 文件及脚本文件,具体如下:

Jinkinsfile 文件内容:

  1. pipeline{
  2. agent any
  3. stages {
  4. stage('Deliver') {
  5. steps {
  6. withEnv(['JENKINS_NODE_COOKIE=dontkillme']) {
  7. sh 'sh ./dev_test/jenkins/scripts/deliver.sh'
  8. }
  9. }
  10. }
  11. }
  12. }

这里使用的是 Jinkinsfile 语法,其实也就是去触发了一个 shell脚本,根据路径创建脚本:

脚本对应上面的目录应该是:./dev_test/jenkins/scripts/deliver.sh

  1. #!/bin/bash
  2. # Author:hukey
  3. function start(){
  4. ansible $1 -a "/app/node1/service.sh start"
  5. }
  6.  
  7. function update(){
  8. if [ ! -f /var/lib/jenkins/workspace/dev_test/dev_test/*.jar ];then
  9. echo '[Error]:java.jar not exist, update failed.'
  10. exit 1
  11. fi
  12. JAR=$(ls /var/lib/jenkins/workspace/dev_test/dev_test/*.jar)
  13. ansible $1 -a "{{app_dir1}}/service.sh update"
  14. ansible $1 -m copy -a "src=$JAR dest={{$2}}"
  15. }
  16.  
  17. function netPort(){
  18. ansible $1 -a "netstat -ntplu"
  19. }
  20.  
  21. update dev_test_node1 app_dir1
  22. sleep 3
  23. start dev_test_node1
  24.  
  25. while sleep 5; do
  26. START_CODE=$(netPort dev_test_node1 | egrep java | wc -l)
  27. if [ $START_CODE -ge 1 ]; then
  28. update dev_test_node2 app_dir1
  29. sleep 3
  30. start dev_test_node2
  31. break
  32. fi
  33. done

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

Jinkinsfile 文件目录:

deliver.sh 脚本目录:

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

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

第一次通过 jenkins 构建 一般都会出现这样的报错,原因是 jenkins 默认是通过 jenkins 用户来运行的,当jenkins 用户使用ansible 推送的时候,jenkins用户并没有做无密码登录。
因此使用 root 用户来启动 jenkins 服务。

  1. [root@192.168.118.14 ~]#vim /etc/sysconfig/jenkins
  2.  
  3. 修改 JENKINS_USER="jenkins" JENKINS_USER="root"
  4. 重启服务,再次构建:
  5. [root@192.168.118.14 ~]#systemctl restart jenkins

这里使用 jenkins 构建的前提是,两个服务节点的服务都在正常工作的前提下。

如果脚本都没问题的前提下,手动构建是会直接成功的。接下来进行 svn 提交自动触发jenkins 任务配置。

Jenkins -> 系统管理 -> Jenkins 命令行接口  下载 jenkins-cli.jar

切换到 192.168.118.14

  1. [root@192.168.118.14 ~]#cd /svn/dev_test/hooks/
  2. jenkins-cli.jar 拷贝到该目录,并创建一个脚本文件 post-commit
  3. #!/bin/bash
  4. 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 -> 系统管理 -> 管理用户 -> 新建用户

再次提交测试:

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

SVN + Jenkins 构建自动部署的更多相关文章

  1. Gitlab+Jenkins实现自动部署

    Gitlab+Jenkins实现自动部署   系统环境: Gitlab主机 IP:192.168.1.2 Jenkins主机 IP:192.168.1.3 一.为何要做自动部署 #部署Tomcat的在 ...

  2. 在linux服务器上装svn版本管理,自动部署代码到项目

    在linux服务器上装svn版本管理,自动部署代码到项目 http://bbs.aliyun.com/read/9715.html?spm=5176.7114037.1996646101.1.W3zw ...

  3. GitHub + circleCI 自动构建/自动部署 应用

    GitHub + circleCI 自动构建/自动部署, 这里略过了单元测试,以部署 laravel 应用为例子 比起 gitlab + ansible + genkins 操作起来节省了很多硬件资源 ...

  4. 在linux服务器上装svn版本管理,自动部署代码到web项目

    在linux服务器上装svn版本管理,自动部署代码到项目 1.安装svn服务器端  yum install subversion   从镜像下载安装svn服务器端 中间会提示是否ok,输入y,确认  ...

  5. Jenkins代码自动部署相关文档

    环境 centos 7.0+ Java JDK 1.8+ jenkins 2.220 maven 3.0+ git 1.8+ 注意事项 一. linux 安装 JDK (jdk-8u201-linux ...

  6. 使用Jenkins构建、部署spring boot项目

    一.环境搭建 本次实验的环境为Ubuntu 16.04,Jenkins 2.8.3 1.安装ssh sudo apt-get update # 更新软件源 sudo apt-get install o ...

  7. Jenkins之自动部署、代码安全扫描、自动化接口测试

    搭建Jenkins wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.reporpm --i ...

  8. springboot+Jenkins+docker-compose自动部署项目实践

    DevOps思想 一个开发.测试.运维的整个过程的思想. plan:需求.计划 code:编码 build:构建 test: 测试 release:发布版本 deploy:部署 operate:项目运 ...

  9. 使用jenkins 插件自动部署项目至tomcat

    前面使用maven.ant编译项目就不说,只说一下使用jenkins的插件自动部署项目 1.首先jenkins安装插件Deploy to container Plugin ,下载地址为:https:/ ...

随机推荐

  1. 界面交互~Toast和模态对话框

    界面交互 名称 功能说明 wx.showToast 显示消息提示框 wx.showModal 显示模态对话框 wx.showLoading 显示 loading 提示框 wx.showActionSh ...

  2. hak的使用

    autohotkey简称ahk 它是一款轻量级的脚本语言文件,它可以干任何事情,如做dnf的连发脚本,类似按键精灵的自动化点击,按键自动打开文件一系列事情,文件需要按照ahk自己的语言,实现自定义的脚 ...

  3. postgres高可用学习篇二:通过pgbouncer连接池工具来管理postgres连接

    安装pgbouncer yum install libevent -y yum install libevent-devel -y wget http://www.pgbouncer.org/down ...

  4. Docker部署nodejs应用并使用PM2作为守护进程

    环境:centos7.6 Docker version 18.06.0-ce mkdir /data cd /data 拉取最新keymetrics/pm2:latest-alpine镜像 docke ...

  5. Vue移动端项目如何使用手机预览调试

  6. fiddler抓取手机https请求详解

    前言: Fiddler是在 windows下常用的网络封包截取工具,在做移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析,fiddler默认只能抓取http请求,需要配置和 ...

  7. GPP(Group Policy Preferences)漏洞

    再次之前先讲一些知识点: 密码的难题 每台Windows主机有一个内置的Administrator账户以及相关联的密码.大多数组织机构为了安全,可能都会要求更改密码,虽然这种方法的效果并不尽如人意.标 ...

  8. LeetCode 818. Race Car

    原题链接在这里:https://leetcode.com/problems/race-car/ 题目: Your car starts at position 0 and speed +1 on an ...

  9. know thself

  10. java 数组遍历(方法内部的代码)

    //数组遍历(依次输出数组中的每一个元素)二维数组: int[][] arr={{1,2},{3,4,5},{6,7}}; for(int i=0;i<arr.length;i++){ for( ...