zoukankan      html  css  js  c++  java
  • 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 -> 系统管理 -> 管理用户 -> 新建用户

    再次提交测试:

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

  • 相关阅读:
    GitLabCI系列之流水线语法
    ssh访问控制,阻断异常IP,防止暴力破解
    天翼云主机高可用的两种办法
    kvm命令管理虚拟机
    kvm安装windows使用virtio驱动
    kvm上已安装的虚拟机修改为桥接网络
    监控Redis集群,有两种方法
    vivo 公司 Kubernetes 集群 Ingress 网关实践
    KVM里安装不是原装的winxp系统镜像
    kvm里的虚拟机硬盘和网卡使用virtio驱动
  • 原文地址:https://www.cnblogs.com/hukey/p/11555206.html
Copyright © 2011-2022 走看看