如何利用Jenkins+ansible+maven(java)方式自动化更新微服务

来源:华云公众号 更新时间:2019-03-12
一般在开发过程中,都会出现在联调的过程中频繁修改代码,然后将最新代码部署到开发环境中,提供给其他微服务的小伙伴联调使用。传统的方式都需要手动编译代码并打包,然后将打包传到开发环境中,最后重启服务,这种方式非常耗时耗人力。为了节省开发联调的时间,可以使用Jenkins+ansible+maven(java)的方式自动打包上传到开发环境并自动重启服务。

一般在开发过程中,都会出现在联调的过程中频繁修改代码,然后将最新代码部署到开发环境中,提供给其他微服务的小伙伴联调使用。传统的方式都需要手动编译代码并打包,然后将打包传到开发环境中,最后重启服务,这种方式非常耗时耗人力。为了节省开发联调的时间,可以使用Jenkins+ansible+mavenjava)的方式自动打包上传到开发环境并自动重启服务。

环境准备

在服务器中安装好JDK1.8、Jenkins、ansible、git客户端等基础软件,这里就不详细介绍每个软件如何使用。

编写好ansible脚本

在服务器事先准备好微服务的ansible脚本。

ansible文件目录:

                                              1.png

文件说明:

1.       hosts文件主要记录要更新微服务的服务器地址详情,这里只需要ip地址和端口号,这里的地址详情可以随意写,下面会在Jenkins任务中动态修改,文件内容如下:

2.png

2.       roles文件夹下表示是每个项目执行ansible所需要的配置和文件。roles/project文件夹表示执行的一个任务,project文件夹就是该任务所需要的ansible配置和文件,roles/project/files是ansible任务执行所需要的文件,roles/project/tasks是任务执行的配置,这里可以配置需要在目前服务器执行的shell脚本,roles/project/vars是任务执行的所需要的参数,注意var下的配置都会在下面的Jenkins任务中动态修改。


roles/project/task/main.yml文件内容如下:

                                              3.png

roles/project/task/user.yml文件内容如下:

4.png

roles/project/var/main.yml文件内容如下:

5.png

                  

1.       project.xml是执行project这个任务的关联主机和roles信息,文件内容如下:

6.png

Jenkins新建任务

1.       新建一个maven项目任务,这里maven项目中必须要包含pom.xml文件。

7.png

2.       在新建的任务中添加构建过程中的所需要的参数,这里只要增加server_ip、server_port、server_pass这2个参数

8.png

9.png

3.       添加版本控制地址,这里以git作为例子,可以执行响应的版本号,这里的版本号也可以通过参数来指定。

10.png

4.       添加执行maven命令

11.png

5.       最后一步新增maven命令执行完了之后执行的shell脚本。最好保存就可以构建了。

12.png

详细脚本如下:

ansible_install=/opt/ansible ##之前写好的ansible脚本

FOLDNAME=user

JARFILE=user.jar

SERVERNAME=user.service

cd ${ansible_install}/roles/project/vars

rm -rf main.yml

echo FOLDNAME: ${FOLDNAME} >> main.yml

echo JARFILE: ${JARFILE} >> main.yml

echo SERVERNAME: ${SERVERNAME} >> main.yml

cd ${ansible_install}

rm -rf hosts

echo '' >> hosts

echo '[project]' >> hosts

echo ${server_ip} ansible_ssh_port=${server_port} >> hosts

cd ${ansible_install}

cd roles/project/files/

rm -rf ./*.jar

cp  ${WORKSPACE}/user/target/${JARFILE} ./

expect -c "

set timeout 300

    spawn ssh-copy-id -i /root/.ssh/id_rsa.pub -p ${server_port} root@${server_ip}

    expect {

     \"(yes/no)?\" {send \"yes\r\";exp_continue}

        \"*password:\" {send \"$server_pass\r\"}

        \"*again.\" {send \"$server_pass\r\"}

    }

    expect eof

"

cd ${ansible_install}

expect -c "

set timeout 3000

    spawn ansible-playbook -i ${ansible_install}/hosts user.yml

    expect {

     \"(yes/no)?\" {send \"yes\r\";exp_continue}

        \"*password:\" {send \"$server_pass\r\"}

        \"*again.\" {send \"$server_pass\r\"}

    }

    expect eof

"

总结

完成自动化脚本之后,在开发联调时就不用再手动打包部署了,只要在Jenkins中构建下对应Job就可以完成服务自动打包更新,提高了开发人员联调效率。本文是针对mavne项目为例,其他语言(go、PHP、react等)只要事先准备好脚本,同样可以实现自动化更新服务。当然还有缺点,目前还不可以自定化更新数据库、安装服务、多节点服务安装和更新等场景,后续有兴趣的同学可以实现这些场景。


在线咨询
400-808-4000
免费试用