从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor

一、简介

前面在部署项目时,我们主要采用Jenkins推送jar包到指定服务器,再通过脚本命令让目标服务器对当前jar进行部署,这种方式在项目较多时,每个目标服务器都需要将jar包制作成自定义镜像再通过docker进行启动,重复操作比较多,会降低项目部署时间。

Docker官方提供了Registry镜像仓库,但是Registry的功能相对简陋。Harbor是VMware公司提供的一款镜像仓库,提供了权限控制、分布式发布、强大的安全扫描与审查机制等功能。
我们可以通过Harbor作为私有的Docker镜像仓库让Jenkins统一将项目打包并制作成Docker镜像发布到Harbor仓库中,只需要通知目标服务,让目标服务统一去Harbor仓库上拉取镜像并在本地部署即可。

二、安装Harbor

2.1 Amd64架构安装Harbor

下载Harbor安装包:https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz

使用tar -zxvf harbor-offline-installer-v2.3.4.tgz 命令解压。

在这里插入图片描述

解压后进入文件夹,官方提供了一个配置文件模版,使用命令复制cp harbor.yml.tmpl harbor.yml

编辑harbor.yml文件:
两处改动:

  1. 修改hostname
  2. 注释掉https

在这里插入图片描述

启动Harbor:执行./install.sh 命令。

由于博主机器是Mac M1芯片,是arm64架构,提示该镜像不支持,只支持linux/amd64。如果你的机器是linux/amd64架构的就没问题。
在这里插入图片描述

注意:如果不是arm64架构的同学可以直接跳过一下步骤。

cat /etc/centos-release
uname -sr

在这里插入图片描述

2.2 Arm64架构安装Harbor

构建Harbor-arm64 镜像的Github仓库:https://github.com/goharbor/harbor-arm

参考README.md文件进行安装:
在这里插入图片描述

# first step: clone harbor ARM code
git clone https://github.com/goharbor/harbor-arm.git

# execute build command:Download harbor source code
cd harbor-arm && make download

# compile redis:
make compile_redis

# Prepare to build arm architecture image data:
make prepare_arm_data

# Replace build arm image parameters:
make pre_update

# Compile harbor components:
make compile COMPILETAG=compile_golangimage

# Build harbor arm image:
make build GOBUILDTAGS="include_oss include_gcs" BUILDBIN=true NOTARYFLAG=true TRIVYFLAG=true CHARTFLAG=true GEN_TLS=true PULL_BASE_FROM_DOCKERHUB=false

以下记录一下博主在安装过程中遇到的问题:

2.2.1 找不到make命令

在这里插入图片描述

使用yum命令安装make

yum -y install make

2.2.2 找不到git命令

在这里插入图片描述
安装Git环境即可。

首先下载Git安装包,Git官网下载地址:https://git-scm.com/download/linux
然后通过tar -zxvf 命令进行解压。
进入目录后执行make configure命令。但是出现报错:
在这里插入图片描述

需要安装autoconf

#查看 autoconf、automake 对应的包
yum whatprovides autoconf automake
# 安装对应的包
yum -y install autoconf-2.69-27.el8.noarch
yum -y install automake-1.16.1-7.el8.noarch

在这里插入图片描述
重新执行以下命令安装Git:

make configure
./configure --prefix=/usr/local/git
make profix=/usr/local/git
make install

配置环境变量:

vim /etc/profile
export GIT_HOME=/usr/local/git
export PATH=$PATH:$GIT_HOME/bin

执⾏ git -v 查看安装后的版本即可:
在这里插入图片描述

2.2.3 执行make download和make compile_redis失败

执行make download命令无法访问git地址:
在这里插入图片描述

执行make compile_redis命令出现连接超时,拒绝连接:

正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|0.0.0.0|:443.

解决方法:

查看raw.githubusercontent.com解析出的ip,然后使用vim /etc/hosts配置主机的host即可
在这里插入图片描述

在这里插入图片描述
再次执行命令:

在这里插入图片描述

2.2.4 执行make compile_redis命令

执行make compile_redis命令成功

在这里插入图片描述

2.2.5 执行make prepare_arm_data命令

执行make prepare_arm_data命令
在这里插入图片描述

2.2.6 执行make pre_update命令

执行make pre_update命令
在这里插入图片描述

2.2.7 执行make compile COMPILETAG=compile_golangimage命令

执行make compile COMPILETAG=compile_golangimage命令
在这里插入图片描述

2.2.7 最后一步 构建出Harbor-arm镜像

执行make build GOBUILDTAGS="include_oss include_gcs" BUILDBIN=true NOTARYFLAG=true TRIVYFLAG=true CHARTFLAG=true GEN_TLS=true PULL_BASE_FROM_DOCKERHUB=false 命令。
过程时间会比较长。
在这里插入图片描述
完成之后使用docker images命令查看构建出的Harbor-arm镜像。
在这里插入图片描述

2.2.8 修改启动脚本文件

进入解压后的Harbor目录
在这里插入图片描述

修改install.sh文件和prepare文件:

  1. install.sh文件中的第63行注释,使用自己构建的arm镜像,不需要load Harbor离线安装包里面的镜像。
  2. 修改prepare文件的第60行,修改镜像的tag为dev-arm

在这里插入图片描述

修改前:

在这里插入图片描述

修改后:

在这里插入图片描述

2.2.9 启动

使用./install.sh命令启动,看到输出日志表示成功。
在这里插入图片描述

启动成功后,访问IP地址+80端口,看到Harbor的登录页面,说明我们支持arm64架构的Harbor版本部署成功。
(看起来非常的麻烦,博主曾经都想放弃了,但是最终部署成功以后还是有些成就感的,所以当你遇到什么解决不了的问题的时候希望你坚持下去,不要急躁)

在这里插入图片描述

默认的账号是admin,密码是在harbor.yml文件中配置的,默认是Harbor12345

在这里插入图片描述

三、Harbor使用方式

Harbor作为镜像仓库,主要的交互方式就是将镜像上传到Harbor上,以及从Harbor上下载指定镜像
在传输镜像前,可以先使用Harbor提供的权限管理,将项目设置为私有项目,并对不同用户设置不同角色,从而更方便管理镜像。

3.1 创建用户

User --》 NEW USER

在这里插入图片描述

3.2 构建私有项目

Projects --》 NEW PROJECT

在这里插入图片描述

3.3 给项目追加用户

在这里插入图片描述

在这里插入图片描述

3.4 发布镜像到Harbor

3.4.1 打标签

修改镜像Tag。
名称要求:harbor地址/项目名/镜像名:版本

#查找镜像
docker images|grep app
#给镜像打上标签
docker tag app:v1.0.0 192.168.153.131:80/repository/app:v1.0.0

在这里插入图片描述

3.4.2 修改daemon.json文件

harbor默认是https协议的,如果想要通过http协议拉取harbor的镜像需要修改**/etc/docker/daemon.json**文件。使用vim /etc/docker/daemon.json 命令修改daemon.json文件。

"insecure-registries": ["192.168.153.131:80"]

在这里插入图片描述

注意:修改后重启docker

systemctl daemon-reload
ystemctl restart docker

3.4.3 登录Hardor

docker login -u Joey -p Admin123456 192.168.153.131:80

遇到错误:
在这里插入图片描述

原因是因为我修改daemon.json文件文件后没有重启docker,重启docker后登录成功。

在这里插入图片描述

3.4.4 推送镜像

将镜像推送到Harbor仓库。

docker ps |grep app
docker push 192.168.153.131:80/repository/app:v1.0.0

在这里插入图片描述

在Harbor仓库查看,推送成功:
在这里插入图片描述

在这里插入图片描述

3.4.5 拉去镜像

将Harbor镜像仓库中的镜像拉取下来

# 登录Harbor仓库
docker login -u Joey -p Admin123456 192.168.153.131:80
# 拉取镜像
docker pull 192.168.153.131:80/repository/app:v1.0.0

在拉取镜像的时候也遇到了一个问题:
在这里插入图片描述

在这里插入图片描述

大家发现是哪里有问题了吗?
当Harbor的地址是192.168.153.131的时候,就会出现报错:Error response from daemon: Get "https://192.168.153.131/v2/": dial tcp 192.168.153.131:443: connect: connection refused
而地址为192.168.153.131:80的时候是成功的。

因为如果不加上80端口号,默认使用的https的443端口号。所以不要省略端口号

四、Jenkins整合Harbor

4.1 配置Jenkins的Docker环境

构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部官方推荐直接采用宿主机的Docker环境即可。
设置Jenkins容器使用宿主机Docker.
编辑Jenkins的docker-compose.yml文件: 添加宿主机docker映射

version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    ports:
      - 8080:8080
      - - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/
      - /usr/bin/docker:/usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/docker/daemon.json:/etc/docker/daemon.json

然后使用docker-compose up -d命令重新启动Jenkins。

4.2 配置构建命令

在Jenkins项目中的设置,构建步骤,添加执行shell,加入以下脚本。

#将target目录下的jar包移动到docker目录下
mv target/*.jar docker/app.jar
#使用docker build命令通过Dockerfile文件构建Docker镜像
docker build -t app:$tag docker/
# 登录Harbor仓库
docker login -u admin -p Harbor12345 192.168.153.131:80
# 给镜像打上标签
docker tag app:$tag 192.168.153.131:80/repository/app:$tag
#将镜像推送到Harbor
docker push 192.168.153.131:80/repository/app:$tag

在这里插入图片描述

4.3 添加构建后操作

通过SSH Publishers插件执行构建后操作,执行服务器上准备好的脚本文件deploy.sh

# 执行脚本命令
deploy.sh $harbor_url $harbor_project_name $project_name $tag $container_port $host_port

在这里插入图片描述

deploy.sh脚本

定义了Harbor仓库的地址、镜像Tag、容器端口、宿主机端口等参数。
这个脚本文件是检查目标容器是否启动,如果启动则停止容器,并删除镜像。
从Harbor仓库重新拉去镜像并启动。

harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
container_port=$5
host_port=$6
imageName=$harbor_url/$harbor_project_name/$project_name:$tag

containerId=`docker ps -a | grep ${
     
     project_name} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
    docker stop $containerId
    docker rm $containerId
    echo "Delete Container Success"
fi

imageId=`docker images | grep ${
     
     project_name} | awk '{print $3}'`

if [ "$imageId" != "" ] ; then
    docker rmi -f $imageId
    echo "Delete Image Success"
fi

docker login -u admin -p Harbor12345 $harbor_url

docker pull $imageName

docker run -d -p $host_port:$container_port --name $project_name $imageName

echo "Start Container Success"
echo $project_name

将脚本添加到环境变量中,使脚本可以在任意目录执行mv deploy.sh /usr/local/bin
给脚本赋可执行权限:chmod a+x deploy.sh

4.4 添加Jenkins参数

在Jenkins项目中的设置中,选择参数化构建过程,添加参数:
字符参数:harbor_url、harbor_project_name、project_name、host_port、container_port
Git参数:tag

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意,由于我们是通过Git标签构建的,所以在Maven进行构建之前需要增加一部切换分支的操作:
在maven构建之前切换git分支。

在这里插入图片描述

Git参数需要Jenkins安装Git Parameter插件
在这里插入图片描述

给仓库打上标签tag
在这里插入图片描述

4.5 通过参数构建

点击Build with Parameters开始构建,Git Parameter插件会查询远程Git仓库的分支和标签信息,我们选择v1.0.0 tag,其他参数默认即可,点击开始构建

在这里插入图片描述

在控制台输出查看运行日志:

在这里插入图片描述

在这里插入图片描述

Jenkins在完成构建后会执行构建后操作,会将这些参数传递给服务器上准备好的脚本文件,服务器执行脚本文件,从Harbor仓库上拉去Jenkins打包上传好的镜像,创建容器,启动服务。

Jenkins上传到Harbor仓库的镜像:

在这里插入图片描述

在这里插入图片描述

项目启动成功!

结束。

猜你喜欢

转载自blog.csdn.net/DreamsArchitects/article/details/128152868