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

news2024/11/16 19:32:52

目录

  • 一、简介
  • 二、安装Harbor
    • 2.1 Amd64架构安装Harbor
    • 2.2 Arm64架构安装Harbor
      • 找不到make命令
      • 找不到git命令
      • 执行make download和make compile_redis失败
      • 执行make compile_redis命令
      • 执行make prepare_arm_data命令
      • 执行make pre_update命令
      • 执行make compile COMPILETAG=compile_golangimage命令
      • 最后一步 构建出Harbor-arm镜像
      • 修改启动脚本文件
      • 启动
  • 三、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 命令解压。

在这里插入图片描述

解压后进入文件夹,官方提供了一个配置文件模版,使用命令复制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

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

找不到make命令

在这里插入图片描述

使用yum命令安装make

yum -y install make

找不到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 查看安装后的版本即可:
在这里插入图片描述

执行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即可
在这里插入图片描述

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

在这里插入图片描述

执行make compile_redis命令

执行make compile_redis命令成功

在这里插入图片描述

执行make prepare_arm_data命令

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

执行make pre_update命令

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

执行make compile COMPILETAG=compile_golangimage命令

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

最后一步 构建出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镜像。
在这里插入图片描述

修改启动脚本文件

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

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

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

启动

使用./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的时候是成功的。所以不要省略端口号

四、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仓库的镜像:

在这里插入图片描述

在这里插入图片描述

项目启动成功!

结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenCV-Python】教程:4-4 SIFT 介绍

OpenCV Python SIFT (尺度不变特征变换) 【目标】 SIFT算法SIFT特征点和描述子 【理论】 前面的章节中,我们提到了角点检测,例如Harris角点,他们是旋转不变的,因为,图像无论如何旋转,其角点特性不会发生…

世界杯8强盘点

2022年卡塔尔世界杯(英语:FIFA World Cup Qatar 2022)是第二十二届世界杯足球赛,是历史上首次在卡塔尔和中东国家境内举行、也是第二次在亚洲举行的世界杯足球赛。除此之外,卡塔尔世界杯还是首次在北半球冬季举行、首次…

docker(八)compose

compose 一 简介: 通过前面几篇文章,我们了解了docker的基本知识,docker帮我们解决了服务打包安装的问题,但是随着服务的不断增多带来了如下问题: 多次使用Dockerfile Build Image或者DockerHub拉取Image;需要创建多…

Spark 动态资源分配参数与源码原理分析

1.1.1、Dynamic Allocation 1.1.1.1 参数说明 1.2 版本 参数名及默认值含义spark.dynamicAllocation.enabled false是否开启动态资源分配,主要是基于集群负载分配executorspark.dynamicAllocation.executorIdleTimeout60sexecutor空闲时间达到规定值&#xff0c…

程序人生:化解互联网 “寒冬” 危机,我教你摆脱困境

三年反复的yi情,近20年史无前例的互联网裁员潮汹涌而至。 寒冬来袭,每一个职场打工人,都感到了寒意。 互联网企业大裁员的底层逻辑,一方面是受宏观环境影响(yq、互联网红利结束、政策变化等),…

ChatGPT震撼上市,AI也开始跟你卷了,来一起看看怎么用ChatGPT!!!

强大AI产品,ChatGPT震撼上市,程序员真的要失业了吗? 最近聊天机器人异常火爆,火爆到什么程度,卖个关子,下文解释。 OpenAI推出了ChatGPT,它能够回答各种各样的问题,包括生成代码&a…

Node.js学习下(70th)

一、Buffer 缓冲区 背景 1、浏览器没有储存图片文件等媒体文件的需求,JS 存的都是一些基本数据类型。 2、服务器需要存储图片/视频/音频等媒体文件,因此有了 Buffer 缓冲器。 1. Buffer 是什么 Buffer 是一个和数组类似的对象,不同是 Buf…

python代码学习1

\n 换行符号 \r 回车 \b 后退一个格 \t 制表符(4个字符为一组,当不字符被占有时,重新生成一个制表符。如果被占据,不满4个字符时,生成剩余部分空格。) #原字符 不希望字符串中转义字符起作用&#xff0…

FME Server 无代码环境中自动化您数据和应用集成工作流

专为现代企业打造 简化数据和应用程序集成,让您的数据为您所用。在FME Desktop中创作工作流,并使用 FME Server 将其自动化,以按计划或响应事件运行数据集成。 构建无代码 Web 应用程序,提供自助式数据提交和验证,并向…

Java学习之动态绑定机制

目录 举例说明 父类 子类 main类 运行结果 ​编辑 动态绑定 举例说明 父类 子类 main类 分析 运行结果 Java重要特性:动态绑定机制(非常重要) 举例说明 父类 class A {//父类public int i 10;public int sum() {return getI(…

2022年11月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2022年11月国产数据库大事件和重要产品发布消息。 文章目录11月国产数据库大事记(时间线)产品/版本发布兼容认证排行榜新增数据库11月国产数据库大事记(时间线) 11月1日,国际知名研究机构 IDC …

什么是内存对齐

内存对齐 什么是内存对齐为什么要内存对齐内存对齐的规则结构体中内存对齐 sizeof无嵌套有嵌套 iOS中对象内存对齐 iOS中获取内存大小方式 class_getInstanceSize()malloc_size() iOS中内存对齐 实际占用内存对齐方式系统分配内存对齐方式问题 内存优化 总结 内存对齐 什么…

基于C++的AGV机器人无线控制

1 AGV系统概述 1.1AGV原理 AGV行走控制系统由控制面板、导向传感器、方向电位器、状态指示灯、避障传感器、光电控制信号传感器、驱动单元、导引磁条、电源组成。 AGV的导引(Guidance)是指根据AGV导向传感器(Navigation)所得到…

基于FFmpeg进行rtsp推流及拉流(详细教程)

目录 1.1 Windows系统 1.2 Ubuntu 和 Debian 系统 1.3 CentOS 和 Fedora 系统 1.4 macOS系统 2. 安装rtsp-simple-server 3. FFmpeg推流 3.1 UDP推流 3.2 TCP推流 3.3 循环推流 4 拉流 4.1 ffplay/VLC拉流显示 4.2 FFmpeg拉流保存成视频 1. 安装FFmpeg FFmpeg 是一…

tftp服务/nfs服务/二进制工具集/uboot基础

一、什么是系统移植 1)系统移植就是给开发板搭建一个linux操作系统 2)从官方获取源码,进行配置和编译,生成板子需要的镜像文件 二、为什么系统移植 1)为后面学习驱动开发课程打基础 2)驱动开发工程师必…

入行4年,跳槽2次,在软件测试这一行我已经悟了!

近年来,软件测试行业如火如荼。互联网及许多传统公司对于软件测试人员的需求缺口逐年增大。然而,20年的疫情导致大规模裁员,让人觉得行业寒冬已经到来。软件测试人员的职业规划值得我们深思。 大家对软件测试行业比较看好,只是因…

【云服务器 ECS 实战】专有网络 VPC、弹性网卡的概述与配置

一、ECS 专有网络 VPC1. 传统经典网络与专有网络 VPC 对比2. 建立自己的专有网络 VPC二、弹性网卡1. 弹性网卡的概念与优势2. 弹性网卡的配置一、ECS 专有网络 VPC 阿里云在早期使用的是一种传统的网络模式,将所有的 ECS 云服务直接建立在传统网络层之上&#xff0…

【有营养的算法笔记】归并排序

👑作者主页:进击的安度因 🏠学习社区:进击的安度因(个人社区) 📖专栏链接:有营养的算法笔记 文章目录一、思路二、模板讲解三、模板测试四、加练 —— 逆序对的数量今天讲解的内容是…

[附源码]Python计算机毕业设计SSM加油站管理信息系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【论文笔记】InverseForm: A Loss Function for Structured Boundary-Aware Segmentation

论文 标题:InverseForm: A Loss Function for Structured Boundary-Aware Segmentation 收录于:CVPR 2021 论文:[2104.02745] InverseForm: A Loss Function for Structured Boundary-Aware Segmentation (arxiv.org) 代码:Git…