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

目录

  • 一、简介
  • 二、安装Harbor
    • 2.1 Amd64架构安装Harbor
    • 2.2 Arm64架构安装Harbor
      • 2.2.1 找不到make命令
      • 2.2.2 找不到git命令
      • 2.2.3 执行make download和make compile_redis失败
      • 2.2.4 执行make compile_redis命令
      • 2.2.5 执行make prepare_arm_data命令
      • 2.2.6 执行make pre_update命令
      • 2.2.7 执行make compile COMPILETAG=compile_golangimage命令
      • 2.2.7 最后一步 构建出Harbor-arm镜像
      • 2.2.8 修改启动脚本文件
      • 2.2.9 启动
  • 三、Harbor使用方式
    • 3.1 创建用户
    • 3.2 构建私有项目
    • 3.3 给项目追加用户
    • 3.4 发布镜像到Harbor
      • 3.4.1 打标签
      • 3.4.2 修改daemon.json文件
      • 3.4.3 登录Hardor
      • 3.4.4 推送镜像
      • 3.4.5 拉去镜像
  • 四、Jenkins整合Harbor
    • 4.1 配置Jenkins的Docker环境
    • 4.2 配置构建命令
    • 4.3 添加构建后操作
      • deploy.sh脚本
    • 4.4 添加Jenkins参数
    • 4.5 通过参数构建

一、简介

前面在部署项目时,我们主要采用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 命令解压。

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第1张图片

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

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

  1. 修改hostname
  2. 注释掉https

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第2张图片

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

由于博主机器是Mac M1芯片,是arm64架构,提示该镜像不支持,只支持linux/amd64。如果你的机器是linux/amd64架构的就没问题。
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第3张图片

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

cat /etc/centos-release
uname -sr

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第4张图片

2.2 Arm64架构安装Harbor

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

参考README.md文件进行安装:
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第5张图片

# 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命令

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第6张图片

使用yum命令安装make

yum -y install make

2.2.2 找不到git命令

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第7张图片
安装Git环境即可。

首先下载Git安装包,Git官网下载地址:https://git-scm.com/download/linux。
然后通过tar -zxvf 命令进行解压。
进入目录后执行make configure命令。但是出现报错:
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第8张图片

需要安装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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第9张图片
重新执行以下命令安装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 查看安装后的版本即可:
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第10张图片

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即可
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第11张图片

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第12张图片
再次执行命令:

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第13张图片

2.2.4 执行make compile_redis命令

执行make compile_redis命令成功

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第14张图片

2.2.5 执行make prepare_arm_data命令

执行make prepare_arm_data命令
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第15张图片

2.2.6 执行make pre_update命令

执行make pre_update命令
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第16张图片

2.2.7 执行make compile COMPILETAG=compile_golangimage命令

执行make compile COMPILETAG=compile_golangimage命令
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第17张图片

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 命令。
过程时间会比较长。
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第18张图片
完成之后使用docker images命令查看构建出的Harbor-arm镜像。
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第19张图片

2.2.8 修改启动脚本文件

进入解压后的Harbor目录
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第20张图片

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

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第21张图片

修改前:

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第22张图片

修改后:

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第23张图片

2.2.9 启动

使用./install.sh命令启动,看到输出日志表示成功。
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第24张图片

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第25张图片

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第26张图片

三、Harbor使用方式

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

3.1 创建用户

User --》 NEW USER

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第27张图片

3.2 构建私有项目

Projects --》 NEW PROJECT

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第28张图片

3.3 给项目追加用户

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第29张图片

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第30张图片

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第31张图片

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"]

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第32张图片

注意:修改后重启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后登录成功。

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第33张图片

3.4.4 推送镜像

将镜像推送到Harbor仓库。

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第34张图片

在Harbor仓库查看,推送成功:
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第35张图片

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第36张图片

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

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第37张图片

大家发现是哪里有问题了吗?
当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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第38张图片

4.3 添加构建后操作

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

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第39张图片

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第40张图片
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第41张图片

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第42张图片

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第43张图片

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第44张图片

Git参数需要Jenkins安装Git Parameter插件
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第45张图片

给仓库打上标签tag
从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第46张图片

4.5 通过参数构建

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第47张图片

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

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第48张图片

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第49张图片

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

Jenkins上传到Harbor仓库的镜像:

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第50张图片

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor_第51张图片

项目启动成功!

结束。

你可能感兴趣的:(DevOps,jenkins,ci/cd,运维,devops,云原生)