码迷,mamicode.com
首页 > 其他好文 > 详细

SVN + Jinkins 构建自动部署

时间:2019-09-20 10:34:21      阅读:711      评论:0      收藏:0      [点我收藏+]

标签:报错   comm   应该   font   failed   密码认证   service   The   程序员   

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 + Jinkins 构建自动部署

标签:报错   comm   应该   font   failed   密码认证   service   The   程序员   

原文地址:https://www.cnblogs.com/hukey/p/11555206.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!