Jenkins+Docker自动化部署Spring boot项目 (三)搭建jenkins
阅读原文时间:2021年04月20日阅读:1

#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. 拉取镜像

    sudo docker pull jenkins
  2. 构建镜像
    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 #这里的镜像名是自己任取的
  1. 启动容器

    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 <br /> -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. 上面 步骤成功后会进入主界面,马赛克的地方是我已经建好的构建任务

  1. 插件安装
    检查以下几个插件是否安装
    Maven Integration plugin
    docker-build-step
    Docker plugin
    Gitlab Hook Plugin
    GitLab Plugin

  2. 全局配置
    主要是配置mvn,方便后面构建任务中的脚本能调到宿主机上的mvn命令


    maven目录填与宿主机maven目录关联的容器目录

  3. 构建任务
    a.点击新建

    b. general部分填项目名和项目信息

    c. 源码管理,jenkins拉代码的地方 ,我的代码是放在gitlab上的,所以配置git。要成功拉取远程仓库的代码,本地环境要配置git账户信息的,所以我先进入容器配置git账户信息的

    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免密登录,我先贴免密登录配置,再贴脚本。
免密登录

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

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

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

另一种是就是手工将本地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 root@x.x.x.x -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搭建配置完毕

参考:
这位大神写的很好