容器自动化部署--jenkins+gitlab+Harbor实现容器自动化部署

2022-02-15 21:06:11

这是我做的容器自动化部署架构图:

这里我把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脚本并再次构建直至构建成功。上述脚本在直接复制后使用可能会出错,需要根据自己的情况来写。

  • 作者:鲁南脚本小子
  • 原文链接:https://blog.csdn.net/FIRSTBLOODg/article/details/118180963
    更新时间:2022-02-15 21:06:11