容器自动化部署--jenkins+gitlab+Harbor实现容器自动化部署
这是我做的容器自动化部署架构图:
这里我把gitlab和jenkins部署在一台机器上:192.168.6.10
docker-Harbor服务器:192.168.6.3
测试环境:192.168.6.136
生产环境:192.168.6.5
首先,jenkins服务器、测试环境和正式环境上需要安装docker且配置可登录Harbor服务拉取镜像,不在介绍,详情参考前面发的帖文,其次,需要在jenkins机器上安装git以便后期可以从jenkins服务器上拉取gitlab上的代码。
这里需要注意,jenkins机器上要安装git、jdk、maven、docker并且配置可以登录Harbor私库,详情参考前边的帖文。
# 基础配置
①、需要在业务机器(测试机、正式机)上配置:
# visudo
#
#Defaults requiretty
Defaults:root !requiretty
否则在执行远程脚本的时候会报错。
②、其次需要使jenkins用户可以使用docker命令:
执行visudo添加如下内容:
jenkins ALL=(root) NOPASSWD:/~/dokcer(这里是docker的安装目录)
Defaults:jenkins !requiretty
1、配置环境
参照前文将jenkins安装后并且安装所推荐的插件并且设置了账号、密码、邮箱等以后需要配置JDK、git、maven等。如果没有安装上述环境则参照前文安装相应服务。
注意:如果服务器已安装相应服务、环境时一定不要选择自动安装,否则会冲突,另外别名随意起,自己知道即可,目录一定要写对,否则后期在使用的时候会报错,如果不知道安装位置在哪可用命令查找:
[root@localhost ~]# which java
/home/env/jdk1.8.0_271/bin/java
[root@localhost ~]# which git
/usr/local/git/bin/git
[root@localhost ~]# which mvn
/home/env/apache-maven-3.8.1/bin/mvn
2、插件安装
首次登录推荐安装的插件还是不够的,还需要选择安装一部分插件:
Role-based-Authorization Strategy、Authorize Project、Maven Integration、SSH plugin、Gitlab Hook Plugin、GitLab Plugin
注意:插件安装完成后需要重启,快速重启的方法就是在地址后面加上restart,如:http://localhost/restart这样即可快速重启。
安装完插件后需要开启插件功能
以上插件具有权限管理的功能,具体的权限分配、账号注册等不在一一介绍。
3、jenkins+gitlab密钥配对
首先需要在jenkins服务器生成秘钥,输入命令后一路回车:
[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:six0/vQ50KNkelV5n3EEnDnixe7v8MhkOYJCkxsKwYs root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| o.+ |
| . . B .|
| o . = o |
| . o . + o..|
| E + o S. . o .+|
| . = =+++. .o.|
| . =+++... *. |
| ..ooo.. = =.|
| .. o. o.o|
+----[SHA256]-----+
这时会在/root/.ssh目录下生成两个文件:id_rsa(私钥)、id_rsa.pub(公钥),将公钥里的内容复制到gitlab,具体操作如下:
复制粘贴后点击添加即可。
然后将私钥复制到jenkins上,具体操作如下:
选择添加凭据即可
这里需要选择“SSH Username with privite key”,范围默认,ID唯一,username即为gitlab服务器的用户名,并将复制的私钥复制到输入框中,注意:BEGIN和END两行也是复制内容的范围。之后确定即可。
4、配置远程机器(Harbor、测试环境和正式环境与jenkins的全局凭证)
根据自己的规范添加域名和描述后点击“OK”出现如下界面时点击“返回到凭据域列表”
给刚创建的域添加凭据
类型和范围使用默认的即可,用户名和密码是服务器的登录账号和密码,ID和描述自定义,注意:ID唯一不可重复,输入完成后确定将会进入如下界面,表示当前凭据添加成功。
配置远程机器---配置远程机器
找到“SSH remote hosts”,添加相应的服务器信息,包括hostname(IP地址)、port(端口)、Credentials(选择刚才添加的凭据),添加完成后点击右下角的“Check connection”测试当前IP和端口根据此凭据是否可以连接。当出现“Successfull connection”时即为连接成功,根据自己的实际情况再次添加其他主机(正式机器、测试机器、Harbor机器、gitlab机器等)。由于上边配置了gitlab这里可以不用配置。
到这里jenkins+gitlab+docker已完成连接,下边就可以建项目了。
5、新建项目
添加名称后,选择自由风格,确定即可。
源码管理这里选择git,不管是gitlab还是GitHub都支持,只要配置了公钥和私钥便不会报错。
在下面的构建中选择“增加构建步骤”>>>"excute shell",这里输入我写的shell脚本:
#!bin/bash
# Jenkins机器:编译完成后,build生成一个新版本的镜像,push到远程docker仓库
# Variables
JENKINS_WAR_HOME='/root/.jenkins/workspace/test'
DOCKERFILE_HOME1='/root/jenkins/test/1'
DOCKERFILE_HOME2='/root/jenkins/test/2'
HARBOR_IP='192.168.6.3'
REPOSITORIES1='jenkins/eladmin-system'
REPOSITORIES2='jenkins/eladmin-wc'
HARBOR_USER='admin'
HARBOR_USER_PASSWD='fymj@2021DK'
HARBOR_USER_EMAIL='gaohuazheng@sc-model.cn'
# Copy the newest war to docker-file directory.
\cp -f ${JENKINS_WAR_HOME}/eladmin-system-2.6.jar ${DOCKERFILE_HOME1}/
\cp -f ${JENKINS_WAR_HOME}/eladmin-wc-2.6.jar ${DOCKERFILE_HOME2}/
# Delete image early version.
sudo docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP}
IMAGE_ID=`sudo docker images | grep ${REPOSITORIES} | awk '{print $3}'`
if [ -n "${IMAGE_ID}" ];then
sudo docker rmi -f ${IMAGE_ID}
fi
# Build image.
cd ${DOCKERFILE_HOME1}
TAG=`date +%Y%m%d`
sudo docker build -t ${HARBOR_IP}/$REPOSITORIES1:${TAG} . &>/dev/null
# Push to the harbor registry.
sudo docker push ${HARBOR_IP}/$REPOSITORIES1:${TAG} &>/dev/null
cd ${DOCKERFILE_HOME2}
TAG=`date +%Y%m%d`
sudo docker build -t ${HARBOR_IP}/$REPOSITORIES2:${TAG} . &>/dev/null
# Push to the harbor registry.
sudo docker push ${HARBOR_IP}/$REPOSITORIES2:${TAG} &>/dev/null
上边我是一个gitlab仓库中有两个jar包,所以用了两个目录并且写了两个Dockerfile来将我的jar包制作成docker镜像,制作完docker镜像为其添加时间标签后登录私库并将自制的镜像上传到私库中去。
然后在点击"增加构建步骤”>>>“excute shell script on remote host using ssh”
选择后会提示你想要远程执行脚本的机器,根据自己的需求选择机器,只要前边配置正确便不会报错,如果有报错则需要再次缕缕前边的步骤是否出现了纰漏。
然后在command中添加shell脚本:
我的脚本内容如下:
#/bin/bash
# 拉取镜像,发布
HARBOR_IP='192.168.6.3'
REPOSITORIES1='jenkins/eladmin-system'
REPOSITORIES2='jenkins/eladmin-wc'
HARBOR_USER='admin'
HARBOR_USER_PASSWD='fymj@2021DK'
# 登录harbor
docker login -u ${HARBOR_USER} -p ${HARBOR_USER_PASSWD} ${HARBOR_IP}
# Stop container, and delete the container.
CONTAINER_ID=`docker ps | grep -v CONTAINER |awk '{print $1}'`
if [ -n "$CONTAINER_ID" ]; then
docker stop $CONTAINER_ID
docker rm $CONTAINER_ID
else #如果容器启动时失败了,就需要docker ps -a才能找到那个容器
CONTAINER_ID=`docker ps -a |grep -v CONTAINER | awk '{print $1}'`
if [ -n "$CONTAINER_ID" ]; then # 如果是第一次在这台机器上拉取运行容器,那么docker ps -a也是找不到这个容器的
docker rm $CONTAINER_ID
fi
fi
# Deleteeasy-springmvc-maven image early version.
IMAGE_ID=`sudo docker images | grep ${REPOSITORIES} | awk '{print $3}'`
if [ -n "${IMAGE_ID}" ];then
docker rmi ${IMAGE_ID}
fi
echo “容器ID检测/删除完成”
# Pull image.
TAG=`date +%Y%m%d`
echo 当前日期为:$TAG
sudo docker pull ${HARBOR_IP}/${REPOSITORIES1}:${TAG} &>/dev/null
sudo docker pull ${HARBOR_IP}/${REPOSITORIES2}:${TAG} &>/dev/null
echo "私有仓库镜像(Harbor-docker-images)拉取成功"
# Run.
docker run -d --name eladmin-system -p 8000:8000 ${HARBOR_IP}/${REPOSITORIES1}:${TAG}
docker run -d --name eladmin-wc -p 8020:8020 ${HARBOR_IP}/${REPOSITORIES2}:${TAG}
echo “成功运行镜像为容器,请访问测试”
意思是首先登录Harbor私库,然后检测当前运行的容器和docker镜像,如果有则删除,删除后自己定义一个时间标签,由于是前边的脚本执行成功后便执行此脚本,所示日期不变,所以标签相同,根据此标签去私库上拉取镜像并启动镜像为容器,运行是给容器定义了名称,端口。
6、构建项目
在进入项目中点击“build now”后下边出现绿色对号即为项目构建成功,此时可以在jenkins机器上查看获取的jar包,制作的镜像,去Harbor查看上传的镜像,远程执行脚本的机器上在私库中拉取的镜像,运行的容器。
此时通过浏览器访问可以发现有你想看到的内容。
如果项目没有构建成功,请按照上述步骤一次查验并找出错误修改shell脚本并再次构建直至构建成功。上述脚本在直接复制后使用可能会出错,需要根据自己的情况来写。
更多推荐
所有评论(0)