基于Jenkins +docker+Harbor的CI/CD环境搭建

156 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情 1 安装Jenkins 检查jdk是否安装好

 java -version

显示如下

openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

这个是系统自带的open jdk 先删除

查看需要删除的jdk文件

rpm -qa | grep java 

执行删除命令

 rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.262.b10-0.el7_8.x86_64
 rpm -e --nodeps java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
 rpm -e --nodeps java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64
 rpm -e --nodeps javapackages-tools-3.4.1-11.el7.noarch
 rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.261-2.6.22.2.el7_8.x86_64

删除完成后,下载新版本jdk www.oracle.com/technetwork… 下载对应版本的jdk 例如: jdk1.8.0_291 将下载的jdk 在/usr/local/java 路径下解压 tar -zxvf ./jdk-8u291-linux-x64.tar.gz

编辑 vim /etc/profile 末尾输入

unset i
unset -f pathmunge

export JAVA_HOME=/usr/local/java/jdk1.8.0_291
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

执行 source /etc/profile刷新一下 再次验证是否安装成功 java -version jdk已经安装成功 检查docker是否安装好 docker -v 发现docker版本太低了 卸载掉旧版本

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

sudo yum update 安装一些必要的系统工具: sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加软件源: 1阿里云 sudo yum-config-manager --add-repo mirrors.aliyun.com/docker-ce/l… 2中科大 sudo yum-config-manager --add-repo mirrors.ustc.edu.cn/docker-ce/l…

yum list docker-ce --showduplicates|sort -r # 查询docker版本 yum install docker-ce-18.09.8 -y # 安装指定版本 我的命令:yum install docker-ce.x86_64 3:20.10.6-3.el7

安装完成 查看版本 docker -v

Docker version 20.10.6, build 370c289

拉取jenkins的docker镜像

docker pull jenkins/jenkins:lts

太慢了 果断换docker镜像源

vim /etc/docker/daemon.json

添加如下 {"registry-mirrors": [" docker.mirrors.ustc.edu.cn"]} 保存退出 重新拉 起飞 拉取完毕

systemctl start docker 启动docker 准备启动Jenkins

docker run --name my_jenkinsd
-u root
-v /etc/localtime:/etc/localtime
-v /home/llp/jenkins_home:/var/jenkins_home
-e JAVA_OPTS=-Duser.timezone=Asia/Shanghai
-v /usr/local/java/jdk1.8.0_291/bin/java:/usr/local/jdk
--name my_jenkinsd
-p 9090:8080
-d de181f8c70e8

PS :如果出现错误 docker invalid reference format. 检查命令中 是否有多余的空格 或者字符格式不正确

ps 1.查看jdk位置

which java

查看Jenkins目录是否挂载到centos中,有内容表示挂载成功

cd /home/llp/jenkins_home/

根据暴露的端口登录系统 在jenkins_home/secrets/initialAdminPassword 文件中记录着初始密码(对应我们创建容器的时候挂载的路径下的jenkins_home) 安装推荐的插件 在这里插入图片描述 等待系统自动进行安装 在这里插入图片描述 在这里插入图片描述 保存继续, 外部配置 配置JDK 配置地址 在这里插入图片描述 添加凭据 在这里插入图片描述 构建项目 手动拉取代码 接下来就是配置自动提交 参考网址 gitee.com/help/articl… www.cnblogs.com/Christine-t… (llp 123456) 421d3aac97492061fd227ef28d553569 如果插件下载慢或者没有对应的插件,点击高级->升级站点 updates.jenkins.io/update-cent… mirrors.tuna.tsinghua.edu.cn/jenkins/upd… mirror.xmission.com/jenkins/upd… 构建harbor私服 下载harbor 文件 github.com/goharbor/ha… 解压harbor文件

tar xf harbor-offline-installer-v2.1.0.tgz 

进入harbor文件夹 复制一个harbor.yml文件

cp harbor.yml.tmpl harbor.yml
vim harbor.yml

修改hostname 为本机地址,注释掉HTTPS相关内容 执行安装脚本安装

./install.sh 

执行结果 输入配置的ip 进行访问,然后新建一个公开的项目,名称是llp(后面会用到新建的项目名称) 在这里插入图片描述 配置docker私服,编辑daemon.json

vim etc/docker/daemon.json  

如何目录下没有daemon.json,只有daemon.json.rpmsave 复制创建一个daemon.json 添加私服地址(高版本docker中默认是daemon.json.rpmsave ) "insecure-registries":["192.168.0.112:8080"] 重新加载daemon.json,然后重新启动docker,重启compose ,后2个命令需要在harbor目录下执行

systemctl daemon-reload
systemctl restart docker
docker-compose down -v
docker-compose up -d

拉取一个hello-word镜像

docker pull hello-world:linux

重新对该镜像打一个标签,端口号必须要,端口号后紧跟刚刚创建的项目名称

docker tag hello-world:linux 192.168.0.112:8080/llp/h1:linux

推送镜像到项目中 docker push 192.168.0.112:8080/llp/h1:linux 如果提示没有权限,则开始登录

docker login 192.168.0.112:808

输入账号 密码进行登录 在代码实践中,遇到了很多坑,耽误了很久 ,记录一下 坑1:配置私服后启动失败 vim /usr/lib/systemd/system/docker.service vim /etc/docker/daemon.json 这2个文件中只能配置其中一个文件中的insecure-registry地址,如果同时配置 docker会启动失败,通过journalctl -xe 可以查看失败信息 坑2 报错connect: connection refused Get https://192.168.0.112/v2/: dial tcp 192.168.0.112:443: connect: connection refused Get https://192.168.0.112:80/v2/: http: server gave HTTP response to HTTPS client 原因:没有指定镜像要上传的地址,站点,端口缺失可能报这个错 坑3 推送报错tag不存在 推送时 docker push 192.168.0.112:8080/llp/h1 报错 tag does not exist: 192.168.0.112:8080/llp/h1:latest 但是通过docker images 是可以找到该镜像的 在这里插入图片描述 在核对一下错误信息,发现版本是latest不存在 我们的版本是linux 所以推送时加上版本号 docker push 192.168.0.112:8080/llp/h1:linux

使用Jenkins连接docker打包服务器,打包镜像 登录Jenkins 安装docker插件 docker或者docker plugin均可 在这里插入图片描述 进入系统配置 ->云 ,进入云配置页面 在这里插入图片描述 配置新的docker 云

在这里插入图片描述

进入docker镜像服务器111 配置docker允许2376端口访问

vim /usr/lib/systemd/system/docker.service 

在ExecStart=/usr/bin/dockerd -H 后添加 效果如图 在这里插入图片描述

将 docker 私服112的地址添加到daemon.json 的私有地址中 重启docker 查看端口是否启动

netstat -anp | grep 2376

在这里插入图片描述 在Jenkins中 将 tcp://192.168.0.111:2376 添加到Docker Host URI

进入Jenkins中的项目中,点击配置 在这里插入图片描述

在项目工程中添加dockerfile文件,准备提交代码

报错1 步骤 8/17:运行 dotnet restore "./JNTest.csproj" ---> 在 ff1a02e536ba 中运行 确定恢复项目... /usr/share/dotnet/sdk/3.1.410/NuGet.targets(128,5): 错误:无法加载源api.nuget.org/v3/index.js…] /usr/share/dotnet/sdk/3.1.410/NuGet.targets(128,5): 错误:资源暂时不可用 [/src/JNTest.csproj]

----------解决方案 配置docker dns,原因目标服务器的docker不能访问外网 报错2
error CS0579: Duplicate 'global::System.Runtime.Versioning.TargetFrameworkAttribute ----------解决方案 情况工程文件夹,obj内容由于前面排查错误干上去了 错误3 message":"invalid reference format: repository name must be lowercase" 目标名称改为小写 错误4 Build step 'Execute shell' marked build as failure 删除错误的构建shell脚本 错误5 Could not push image: Get https://192.168.0.112:8080/v2/: http: server gave HTTP response to HTTPS client 镜像服务器配置私服的"insecure-registries" 192.168.0.112:8080 ----------解决方案 错误6 无法推送图像:未经授权:未经授权访问存储库:llp/nettest,操作:推送:未经授权访问存储库:llp/nettest,操作:推送 ----------解决方案 配置harbor身份验证 配置登录密码 在这里插入图片描述

[NET Test] $ /bin/sh -xe /tmp/jenkins7219611313016484862.sh Finished: SUCCESS 进入Jenkins 安装 Publish Over SSH 插件 在这里插入图片描述 配置Publish Over SSH 在这里插入图片描述 点击新增添加服务器地址、用户名,点击高级 配置密码,测试链接成功 配置构建后操作 在这里插入图片描述 配置exec command

echo ‘========start============’
CONTAINER_NAME=nettest
docker pull 192.168.0.112/llp/$CONTAINER_NAME:v3
echo ‘========容器start============’
cid=$(docker ps -a|grep "$CONTAINER_NAME"|awk '{print $1}')
if [ "$cid"!="" ];then
   docker rmi -f $cid
   sleep 4s
fi
docker run -d --name $CONTAINER_NAME -p 8088:80 192.168.0.112/llp/$CONTAINER_NAME:v3
echo ‘========容器end=============’
docker run -d --name nettest -p 8088:80 192.168.0.112:8080/llp/nettest:v3

提交代码 访问成功 完成收工 进入发布服务器 构建成功 docker exec -it 42d606129885 /bin/bash 进入到指定容器的命令行中