Jenkins+ansible+Docker+ Maven+Svn自动化部署

声明:
如果您有更好的技术与作者分享,或者商业合作;
请访问作者个人网站 http://www.esqabc.com/view/message.html 留言给作者。
如果该案例触犯您的专利,请在这里:http://www.esqabc.com/view/message.html 留言给作者说明原由
作者一经查实,马上删除。

准备工具:
服务器三台或者以上
a,主服务器:docker_t (安装Ansible和Jenkins)
b,被控制的服务器A:esqabc_a
c,被控制的服务器B:esqabc_b
注意,由于我的三台服务器都是国外服务器,显示与提示,相比国内会有所不同
安装Ansible和Jenkins,请访问地址:https://blog.csdn.net/esqabc/article/details/90257590
不清楚怎么使用Ansible,请访问地址:https://blog.csdn.net/esqabc/article/details/92773041
不清楚怎么使用Jenkins发布项目,请访问地址:https://blog.csdn.net/esqabc/article/details/90481880
本文出现的192.168.0.111或者192.168.0.222都是虚假的

一,Jenkins+Ansible+Maven+Svn自动化部署

1,为远程连接主机生成公/私钥
(1)在主服务器下执行命令:

[root@docker_t ~]# cd /home & mkdir key & ssh-keygen -t dsa -f /root/.ssh/id_dsa -P ""

(2)查看公/私钥是否生成成功

[root@docker_t ~]# cd /root/.ssh/
[root@docker_t .ssh]# ll
在这里插入图片描述

(3)分发公钥给被控制的服务器(esqabc_a和esqabc_b),请输入一下yes和密码授权一下就可以了

[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.0.111

[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.0.222


或者修改端口(24680)的方式分发:

[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub -p 24680 root@192.168.0.111

[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub -p 24680 root@192.168.0.222

(4)测试一下是否成功(ssh + 服务器ip)
在主服务器中执行命令:

[root@docker_t key]# ssh 192.168.0.111 "hostname"
esqabc_a
[root@docker_t key]# ssh 4192.168.0.222 "hostname"
esqabc_b

2,定义(ansible)主机
(1)编辑文件:hosts

[root@docker_t ~]# vim /etc/ansible/hosts
添加一个主机组(rj-bai)
[rj-bai]
192.168.0.111
192.168.0.222
然后保存退出,注意:rj-bai 为模块名,下面是要管理的主机 ip 地址,模块名随便写

(2)测试一下是否成功
执行命令:

[root@docker_t ~]# ansible rj-bai -m command -a pwd
在这里插入图片描述
出现这个,就算是成功了

3,安装Jenkins

(1)添加Jenkins插件:

1、Maven
2、SSH
3、Ansible

(2)创建一个任务
在这里插入图片描述
(3)配置
1,源码管理(我这里是SVN,如果是使用其它的请自行)
在这里插入图片描述
2,添加SVN账号
在这里插入图片描述
3,构建触发器(根据自己的选择,我这里选择的是定时执行)
日程表:是cron表达式,每分钟执行一次:*/1 * * * *
就是说,每分钟检测一次SVN代码有没有更改
在这里插入图片描述
4,选择构建
(1)选择调用顶层Maven目标

在这里插入图片描述
这里是使用maven打包jar,目标命令是:clean install

(2)选择执行 shell
在这里插入图片描述
jenkins自动打包jar文件,会在主机目录:/root/.jenkins/workspace/ 下创建一个任务名称的文件夹,存放打包后的jar文件
如:任务名称为:jarweb-jen-ans-t,打包文件名称为:jarweb-jen-ans.jar
即:/root/.jenkins/workspace/jarweb-jen-ans-t/target/jarweb-jen-ans.jar
上面命令的说明:

#把项目jar文件复制到ansible发布目录(ansible目录可以随意地方)
cp /root/.jenkins/workspace/jarweb-jen-ans-t/target/jarweb-jen-ans.jar /etc/ansible/roles/jarweb/
#进入jenkins任务打包目录
cd /root/.jenkins/workspace/jarweb-jen-ans-t/target/
#删除旧的打包文件
rm -rf *.jar

(3)选择Invoke Ansible Playbook
在这里插入图片描述
说明:
Playbook path:填写deploy-jarweb.yml地址,如:/etc/ansible/roles/jarweb/deploy-jarweb.yml
File or host list:填写主机组的地址,如:/etc/ansible/hosts
文件:deploy-jarweb.yml

#
- hosts: rj-bai
  remote_user: root
  tasks:
    - name: copy jar
      copy : src=/etc/ansible/roles/jarweb/jarweb-jen-ans.jar dest=/home/tools/jar/jarweb-jen-ans.jar
    - name: copy sh
      copy: src=/etc/ansible/roles/jarweb/jarweb-script.sh dest=/home/tools/jar/jarweb-script.sh
    - name:  shell sh
      shell: sh /home/tools/jar/jarweb-script.sh

文件:hosts

[rj-bai]
192.168.0.111
192.168.0.222

文件:jarweb-script.sh

#!/bin/sh

#设置输出语言
export LANG=en_US.UTF-8

project=jarweb-jen-ans.jar

#输出信息
echo "begin>>>>>>>>>>>>>>>>>>>>"

#获取当前服务器时间,并格式化
dqtime=$(date "+%Y-%m-%d %H:%M:%S")

#输出当前服务器时间
echo "datetime: ${dqtime}"

#获取项目正在运行的进程PID(方法有很多,这是其它一种)
javapid=$(ps -ef|grep $project |grep -v grep|awk '{print $2}')

#输出PID
echo "javapid: $javapid"

#通过项目的PID,判断有没有在运行
process=$(ps -ef |grep $javapid |grep java)
echo "process: $process"
if [ "$process" = "" ]
   then
      echo "Not found>$project<, running Java program"
else
#如果已经在运行,就直接杀死进程
  echo "Start killing the process ID of jarweb-jen-ans.jar"
  echo "kill -9 $javapid"
  kill -9 $javapid
fi

echo "<<<<<<<<<<<<<<<<<<<end"

#输出友好的倒计时提示,项目在5秒钟后启动
seconds_left=5
echo "Start the project after 5 seconds"
while [ $seconds_left -gt 0 ];
do
   echo -n "Please wait for> ${seconds_left} <seconds.."
   sleep 1
   seconds_left=$(($seconds_left - 1))
   #清除上一行内容,即上一个倒计时输出的信息
   echo -ne "\r     \r"
done

echo "Startup project $project"

#项目启动需要执行的命令
source /etc/profile

nohup java -jar /home/tools/jar/jarweb-jen-ans.jar > /home/tools/jar/nohup.out 2>&1 &

echo "aaaaaaaaaaaaaaaaaaaaaaaaaaaa"
#显示项目启动的日志输出
#tail -999f /home/tools/jar/nohup.out

(5)最后点击确定,等待jenkins自动生成吧
打包项目的地址:https://github.com/esqabc/jarweb-jen-ans
检测是否打包发布成功,请自行在浏览器输入:http://ip:8080/index 是否出现你的网页
在这里插入图片描述

二,Jenkins+ansible+Docker+ Maven+Svn自动化部署

我想到了两种方案,如果不符合或者有什么疑问,
请通过我的个人网站留言给我:http://www.esqabc.com/view/message.html
方案1:
在这里插入图片描述
方案2:
在这里插入图片描述
下面介绍方案2的使用:
准备服务器三台或者以上
1,主服务器:docker_t (安装Ansible,Jenkins,Docker,harbor)-192.168.0.001
2,项目服务器A:esqabc_a (安装Docker)-192.168.0.111
3,项目服务器B:esqabc_b (安装Docker)-192.168.0.222
注意:harbor私仓库可以安装在其他服务器,这里以安装在192.168.0.001为例
打包项目地址:https://github.com/esqabc/docker-jen-ans

首先在项目服务器A、B的:/etc/docker 目录下,创建文件:daemon.json
执行命令:

[root@esqabc_a ~]# cd /etc/docker/
[root@esqabc_a docker]# touch daemon.json
[root@esqabc_a docker]# vi daemon.json
输入:
{ “insecure-registries”:[“192.168.0.001:8088”] }
A、B服务器都一样

a,在Jenkins创建一个任务:docker-jen-ans
在这里插入图片描述
b,源码管理
在这里插入图片描述
c,构建触发器(根据自己的选择,我这里选择的是定时执行)
日程表:是cron表达式,每分钟执行一次:*/1 * * * *
就是说,每分钟检测一次SVN代码有没有更改
在这里插入图片描述
d,选择构建
(1)选择调用顶层Maven目标

在这里插入图片描述
这里是使用maven打包docker,目标命令是:package docker:build

(2)选择执行 shell
在这里插入图片描述
上面命令的说明:

#把打包好的镜像(tag docker-jen-ans:v1)标记为(192.168.0.001:8088/esqabc/docker-jen-ans:v1)
docker tag docker-jen-ans:v1 192.168.0.001:8088/esqabc/docker-jen-ans:v1

#把我们标记好的镜像(192.168.0.001:8088/esqabc/docker-jen-ans:v1)发送到私仓库(192.168.0.001:8088)esqabc项目下
docker push 192.168.0.001:8088/esqabc/docker-jen-ans:v1

#删除标记为(192.168.0.001:8088/esqabc/docker-jen-ans:v1)
docker rmi 192.168.0.001:8088/esqabc/docker-jen-ans:v1

#删除打包好的镜像(tag docker-jen-ans:v1)
docker rmi docker-jen-ans:v1

(3)选择Invoke Ansible Playbook

在这里插入图片描述
说明:
Playbook path:填写deploy-jarweb.yml地址,如:/etc/ansible/roles/jarweb/deploy-jarweb.yml
File or host list:填写主机组的地址,如:/etc/ansible/hosts

文件:deploy-jarweb.yml

#
#使用Ansible的主机组rj-bai,把脚本文件jarweb-script.sh发送到主机组rj-bai里面的服务器中,然后再执行脚本
- hosts: rj-bai
  remote_user: root
  tasks:
    - name: copy sh
      copy: src=/etc/ansible/roles/jarweb/jarweb-script.sh dest=/home/tools/jar/jarweb-script.sh
    - name:  shell sh
      shell: sh /home/tools/jar/jarweb-script.sh

文件:hosts

#主机组
[rj-bai]
192.168.0.111
192.168.0.222

文件:jarweb-script.sh

#!/bin/sh

#设置输出语言
export LANG=en_US.UTF-8

#当前项目版本
project=docker-jen-ans:v1

#输出信息
echo "begin>>>>>>>>>>>>>>>>>>>>"

#获取当前服务器时间,并格式化
dqtime=$(date "+%Y-%m-%d %H:%M:%S")

#输出当前服务器时间
echo "datetime: ${dqtime}"

#删除旧的运行信息
docker kill $project
#删除旧的容器
docker rm $project
#删除旧的镜像
docker rmi $project


#下载新镜像
docker pull 192.168.0.001:8088/esqabc/docker-jen-ans:v1
#标记(镜像重命名)把192.168.0.001:8088/esqabc/docker-jen-ans:v1改为docker-jen-ans:v1
docker tag 192.168.0.001:8088/esqabc/docker-jen-ans:v1 docker-jen-ans:v1


#删除镜像
docker rmi 192.168.0.001:8088/esqabc/docker-jen-ans:v1

#运行镜像
docker run -it -d --name esqabcweb -p 8888:8888 docker-jen-ans:v1

e,保存,修改一下代码提交SVN
在这里插入图片描述
生成后到私仓库查看:
在这里插入图片描述
登录项目服务器A、B查看
A:
在这里插入图片描述
在这里插入图片描述

B:
在这里插入图片描述
在这里插入图片描述
访问项目:
在这里插入图片描述
到这里就已经算了完成了

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值