#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插件
拉取镜像
sudo docker pull jenkins
构建镜像
a. 由于容器内权限问题,我们需要根据官方镜像构建一个自己的jenkins镜像。很简单,写个Dockerfile即可,内容如下:
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所在目录执行构建新镜像命令:
sudo docker build -t jenkins:2.0 #这里的镜像名是自己任取的
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 \
上面的命令通过-v 将本地maven目录与Jenkins容器内目录关联,方便后面构建任务时要用到
a. 浏览器输入http:ip:8080
b. 第一次进入会让你输入初始密码,界面上会告诉你在哪个文件下,或者通过docker logs -f jenkins容器号查看启动日志,上面也会打出初始密码。
c. 输入密码成功后选择安装默认插件,下面就跟着提示一步步走就好了。
d. 上面 步骤成功后会进入主界面,马赛克的地方是我已经建好的构建任务
sudo docker exec jenkins /binbash #jenkins是容器名
git config --global user.name "Issac"
git config --global user.email "[email protected]"
//如果配置了ssh,还需要再配置公私钥匙,这里不再详述
d. 构建触发器,可选配置项。第二个勾选项“触发远程构建”,意思是使用get请求下面说明的url,且带上token,就会触发构建。
e.Pre Steps 一般就是写打包命令,我写的是用mvn打包和打成docker镜像
f. Post Steps,这里就是写执行脚本,脚本就是负责将打好的镜像push到私有库,远程登录部署机器,pull下来刚才的镜像,停止删除之前的容器,启动该新镜像。脚本我是直接拿的网上现成的。需要注意的是,远程登录部署机,需要在jenkins容器内配置ssh免密登录,我先贴免密登录配置,再贴脚本。
免密登录:
sudo docker exec 容器号 /bin/bash #进入容器
ssh-keygen -t rsa #会进入交互模式,一路按回车
会有文字提示生成的公私钥文件存入位置,一般在命令运行当前目录生成.ssh目录,进入该目录,至少有下面两个文件:
id_rsa : 生成的私钥文件
id_rsa.pub : 生成的公钥文件
下面就是将公钥内容拷到目标机器上,有两种方法,一种在当前机器通过以下命令:
ssh-copy-id -i ~/.ssh/id_rsa
另一种是就是手工将本地id_rsa.pub文件的内容拷贝至远程服务器的~/.ssh/authorized_keys文件中
jenkins执行脚本:
echo '================开始推送镜像================'
sudo docker login --username=admin --password=Harbor12345 x.x.x.x:8090 #登录私有库(harbor我没有用域名)
sudo docker push x.x.x.x:8090/xxx/xxx:latest#推送镜像,镜像文件已经在前面的mvn步骤打好了
echo '================结束推送镜像================'
echo '================开始远程启动================'
ssh [email protected] -tt << remotessh ###ssh远程部署机器
####从这里开始都是在远程机器上执行命令
cd /opt/issac
./jenkins.sh x.x.x.x:8090/xxx/xxx
sudo docker login -u admin -p Harbor12345 x.x.x.x:8090
sudo docker pull x.x.x.x:8090/xxx/xxx:latest
sudo docker run -d --name=容器名-`date +%Y-%m-%d` -p:8882:8882 --add-host discovery0:x.x.x.x -v /tmp/logs:/logs --network=discovery0 -e x.x.x.x:8090/xxx/xxx:latest
echo "finished!"
##--add-host是容器内添加一条dns,--newwork是当前容器的网络加入我已经创建好的桥接网络discovery0,我的业务系统需要的。
#####执行完毕
exit ###退出远程机器
remotessh ###结尾哦
echo '================结束远程启动================'
exit ###退出远程机器
remotessh ###结束ssh
echo '================结束远程启动================'
下面是远程部署机器上jenkins.sh的内容,网上抄来的,很简单,就是停掉和删除老容器
#!/bin/sh
sudo docker stop $(sudo docker ps | grep $1|awk '{print $1}'|sed 's/%//g')
sudo docker rm $(sudo docker ps -a | grep $1|awk '{print $1}'|sed 's/%//g')
点击保存后,进入主界面,进入自己刚创建的构建任务,点击构建,就会自动执行刚才配置好的内容了。
构建的时候,上图左下角会出现一个递增序号,点击进去后再点控制台,可以看到构建进度
PS:还有一种触发方式就是git push tag触发构建,这个需要在gitlab端配置勾子,也很简单,我是因为Jenkins和部署机器各自在内外网,无法通信,所以没用这个方式。
到此,jenkins搭建配置完毕
参考:
这位大神写的很好