jjzjj

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

Liu_Shihao 2024-01-19 原文

目录

一、简介

前面在部署项目时,我们主要采用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仓库的镜像:

项目启动成功!

结束。

有关从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor的更多相关文章

  1. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  2. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  3. jenkins部署1--jenkins+gitee持续集成 - 2

    前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon

  4. ruby-on-rails - Ruby/Rails 中的夏令时开始和结束日期 - 2

    我正在开发一个Rails应用程序,我需要在其中找到给定特定偏移量或时区的夏令时开始和结束日期。我基本上在我的数据库中保存了从用户浏览器接收到的时区偏移量(“+3”,“-5”),我想在它出现时修改它由于夏令时的变化。我知道Time实例变量有dst?和isdst方法,如果存储在它们中的日期在夏令时与否。>Time.new.isdst=>true但是使用它来查找夏令时的开始和结束日期会占用太多资源,而且我还必须为我拥有的每个时区偏移量执行此操作。我想知道更好的方法。 最佳答案 好的,基于你所说的和@dhouty'sanswer:您希望能够

  5. ruby-on-rails - phusion passenger 和 ruby​​ 1.9.1 已经开始工作了吗? - 2

    我有一台生产机器和一台开发机器,都运行ubuntu8.10并且都运行最新的phusionpassenger。当我在osx上的本地开发机器上使用ruby​​1.9.1时,我想知道外面的人是否已经在使用带有ruby​​1.9.1甚至1.9.2的phusionpassenger?如果是这样,请告诉我们您的设置!此外,有没有办法在apache上使用phusionpassenger同时运行ruby​​1.8.7(ree)和1.9.1?感谢您的指点,我在任何地方都找不到任何提示... 最佳答案 是的,从某些2.2.x版本开始就正式支持它,我不记

  6. ruby - Rails 3 - 我可以将开始日期设置为 date_select 方法吗? - 2

    date_select方法只能设置:start_year,但我想设置开始日期(例如3个月前的日期)(但没有这样的选项)。那么,我可以将开始日期设置为date_select方法吗?或者,要制作这样的选择框,我应该使用select_tag和options_for_select吗?或者,有什么解决办法吗?谢谢, 最佳答案 有可能……例如:start_year–设置年份选择的开始年份。默认为Time.now.year-5参见thisresource. 关于ruby-Rails3-我可以将开始日期

  7. ruby - 从特定索引开始迭代数组 - 2

    我想从特定索引开始遍历数组。我该怎么做?myj.eachdo|temp|...end 最佳答案 执行以下操作:your_array[your_index..-1].eachdo|temp|###end 关于ruby-从特定索引开始迭代数组,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/44151758/

  8. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

  9. ruby - Heroku - 如何开始工作人员(延迟工作)? - 2

    我有一些使用delayed_job的小程序。在我的本地主机上一切正常,但是当我将我的应用程序部署到Heroku并单击应该由delayed_job执行的链接时,没有任何反应,“任务”只是保存到表delayed_job中。Inthisarticleonherokublog写入时,执行delayed_job表中的任务,当运行此命令时rakejobs:work。但是我怎样才能运行这个命令呢?命令应该放在哪里?在代码中,还是从终端控制台? 最佳答案 如果您正在运行Cedar堆栈,请从终端控制台运行以下命令:herokurunrakejobs:

  10. node.js - 从未编写过任何自动化测试,我应该如何开始行为驱动开发? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。多年来,我一直在使用多种语言进行编程,并且认为自己总体上相当擅长。但是,我从未编写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有。我已经尝试开始为我的项目编写适当的测试套件。我可以看到在进行任何更改后能够自动测试项目中所有代码的理论值(value)。我可以看到像RSpec和Mocha这样的测试框架应该如何使设置和运行所述测试变得相当容易

随机推荐