版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liubingyu12345/article/details/80737412

Jenkins+Docker自动化部署Spring boot项目 (三)搭建jenkins

搭建jenkins

jenkins我是通过下载镜像完成安装的,建议使用docker hub的镜像,它提供的版本比较新。一开始为了图快,我用了163镜像库的jenkins镜像,它的版本比dokcer hub低一个版本。安装好后安装插件,有个必要的插件安装不上,提示版本太低,后来换成docker hub提供的高版本镜像文件就OK了。这是官方地址

前置条件

操作系统版本:Ubuntu16
docker版本:1.13.1
私有库harbor搭建成功
spring boot项目配置好dockerfile maven插件

操作步骤

####1. 拉去镜像

1
sudo docker pull jenkins

####2. 构建镜像
a. 由于容器内权限问题,我们需要根据官方镜像构建一个自己的jenkins镜像。很简单,写个Dockerfile即可,内容如下:

1
2
3
4
5
FROM jenkins
USER root
RUN apt-get update && apt-get install -y sudo && rm -rf /var/lib/apt/lists/*
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
USER jenkins

b. 在Dockerfile所在目录执行构建新镜像命令:

1
sudo docker build -t jenkins:2.0 #这里的镜像名是自己任取的

####3. 启动容器

1
2
3
4
5
sudo docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -u root  \
-v /home/acmedcare/jenkins_home:/var/jenkins_home \
-v /opt/maven/apache-maven-3.2.5:/usr/local/maven \
-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker \
jenkins:2.0

上面的命令通过-v 将本地maven目录与Jenkins容器内目录关联,方便后面构建任务时要用到
a. 浏览器输入http//:127.0.0.1:8080
b. 第一次进入会让你输入初始密码,界面上会告诉你在哪个文件下,或者通过docker logs -f jenkins容器号查看启动日志,上面也会打出初始密码
c. 输入密码成功后选择安装默认插件,下面就跟着提示一步步走就好了。
d. 上面 步骤成功后会进入主界面,马赛克的地方是我已经建好的构建任务
这里写图片描述
####4. 插件安装
检查以下几个插件是否安装
Maven Integration
docker-build-step
Docker
Gitlab Hook
GitLab
这里写图片描述

####5. 全局配置
主要是配置mvn,方便后面构建任务中的脚本能调到宿主机上的mvn命令
这里写图片描述
这里写图片描述
maven目录填与宿主机maven目录关联的容器目录
####6. 构建任务
#####a. 点击新建
这里写图片描述
#####b. general部分填项目名和项目信息
这里写图片描述
#####c. 源码管理,jenkins拉代码的地方 ,我的代码是放在gitlab上的,所以配置git。要成功拉取远程仓库的代码,本地环境要配置git账户信息的,所以我先进入容器配置git账户信息的

1
2
3
4
sudo docker exec jenkins /binbash  #jenkins是容器名
git config --global user.name "Issac"
git config --global user.email "Issac@xx.com"
//如果配置了ssh,还需要再配置公私钥匙,这里不再详述

这里写图片描述
#####d. 构建触发器,可选配置项。第二个勾选项“触发远程构建”,意思是使用get请求下面说明的url,且带上token,就会触发构建。
这里写图片描述
#####e. Pre Steps 一般就是写打包命令,我写的是用mvn打包和打成docker镜像
这里写图片描述
#####f. Post Steps,这里就是写执行脚本,脚本就是负责将打好的镜像push到私有库,远程登录部署机器,pull下来刚才的镜像,停止删除之前的容器,启动该新镜像。脚本我是直接拿的网上现成的。需要注意的是,远程登录部署机,需要在jenkins容器内配置ssh免密登录,我先贴免密登录配置,再贴脚本。
####7. 免密登录

1
2
sudo docker exec 容器号 /bin/bash #进入容器
ssh-keygen -t rsa #会进入交互模式,一路按回车

会有文字提示生成的公私钥文件存入位置,一般在命令运行当前目录生成.ssh目录,进入该目录,至少有下面两个文件:
id_rsa : 生成的私钥文件
id_rsa.pub : 生成的公钥文件
下面就是将公钥内容拷到目标机器上,有两种方法,一种在当前机器通过以下命令:

1
ssh-copy-id -i ~/.ssh/id_rsa <romte_ip>

另一种是就是手工将本地id_rsa.pub文件的内容拷贝至远程服务器的~/.ssh/authorized_keys文件中
//最后公钥里面得内容都要copy到authorized_keys文件中
####8. jenkins执行脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#================登录私有库,开始推送镜像(harbor我没有用域名)================
docker login -u admin -p Harbor12345 47.103.129.237:9020
#================标记镜像 tag 本地镜像 远程镜像================
docker tag 47.103.129.237:9020/bambou/bambou-shop-service-weixin 47.103.129.237:9020/bambou/bambou-weixin
#================开始推送================
docker push 47.103.129.237:9020/bambou/bambou-weixin #推送镜像,镜像文件已经在前面的mvn步骤打好了
#================结束推送镜像,删除冗余镜像================
docker images|grep none|awk '{print $3}'|xargs docker rmi
#================删除冗余镜像成功================
#================开始远程启动================
ssh root@116.62.56.59 -tt << remotessh ###ssh远程部署机器
#================远程启动成功================
####从这里开始都是在远程机器上执行命令
#================停止并删除已启动的容器================
cd /usr/local/docker/sh
sh clean.sh
sleep 3s
#================删除已下载的镜像================
docker rmi 47.103.129.237:9020/bambou/bambou-weixin
#================登录私有库================
docker login -u admin -p Harbor12345 47.103.129.237:9020
#================下载镜像================
docker pull 47.103.129.237:9020/bambou/bambou-weixin
#================启动容器(使用weave 解决不同宿主机docker容器通信的问题)================
docker run --name=bambou-weixin --net=weave -d -p 8900:8900 -v /tmp/logs/docker/weixin:/logs 47.103.129.237:9020/bambou/bambou-weixin:latest
#================清理版本号为none的容器===============
#sleep 3s
#docker images|grep none|awk '{print $3}'|xargs docker rmi
#================执行完毕,推出远程机器================
exit
remotessh
#================结束远程启动================
exit
remotessh
#================结束远程启动================

下面是远程部署机器上clean.sh的内容,网上总结来的,很简单,就是停掉和删除老容器 并删除tag 为none的镜像

1
2
3
4
#!/bin/bash
docker ps -a|grep "Exited" | awk '{print $1}' | xargs docker stop
docker ps -a|grep "Exited" | awk '{print $1}' | xargs docker rm
docker images|grep none|awk '{print $3}'|xargs docker rmi

点击保存后,进入主界面,进入自己刚创建的构建任务,点击构建,就会自动执行刚才配置好的内容了。
这里写图片描述
构建的时候,上图左下角会出现一个递增序号,点击进去后再点控制台,可以看到构建进度
这里写图片描述
PS:还有一种触发方式就是git push tag触发构建,这个需要在gitlab端配置勾子,也很简单,我是因为Jenkins和部署机器各自在内外网,无法通信,所以没用这个方式。
到此,jenkins搭建配置完毕

###遇到问题
####a. docker login 老是不行被拒,后面发现是hearo挂掉了,特此记录下 //Docker login 被拒 检查 /etc/docker/deam.json 文件配置 ,及hearo服务器有没有启动
####b.
其他问题见下方参考资料
参考:
这位大神写的很好
liubingyu12345 本人根据改作者实际操作有稍微改动,特此感谢
###参考资料
安装docker-compose
daemon.json的作用
修改docker私库的地址(设置docker访问白名单)
Docker ToolBox解决 http: server gave HTTP response to HTTPS client问题
Windows下安装docker后的默认操作系统密码
docker push 镜像 An image does not exist locally with the tag
maven搭建
然后保存退出,执行命令: source /etc/profile 使新增配置生效
Docker之快捷(批量)删除docker镜像容器及释放docker空间(第十六篇
docker中批量删除 tag为none的镜像
Docker命令行参考(13) – docker tag给镜像做一个标签
jenkins修改maven插件的settings.xml

× 请我吃糖~
打赏二维码