持续集成交付CICD:Jenkins流水线操作Harbor仓库

目录

一、实验

1.Jenkins主节点安装Docker

2.Jenkins主节点安装Harbor

3.Jenkins从节点安装Docker

4.Jenkins流水线操作Harbor仓库

二、问题

1.Jenkins主节点登录Harbor仓库报错

2.Jenkins流水线里从节点操作docker报错

3.Jenkins流水线里从节点远程登录Harbor仓库报错


一、实验

1.Jenkins主节点安装Docker

(1)YUM安装Docker

目前 Docker 只能支持 64 位系统。

bash 复制代码
#关闭防火墙和selinux
 systemctl stop firewalld.service
 setenforce 0
 ​
 #安装依赖包
 yum install -y yum-utils device-mapper-persistent-data lvm2 
 --------------------------------------------------------------------------------------------
 #yum-utils:提供了 yum-config-manager 工具。
 #device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,
 它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
 #device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
 --------------------------------------------------------------------------------------------
 ​
 #设置阿里云镜像源
 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
 ​
 #安装 Docker-CE并设置为开机自动启动
 yum install -y docker-ce      #docker-ce-cli、containerd.io 会作为依赖包被安装
 ​
 systemctl start docker.service
 systemctl enable docker.service 

(2) 查看Docker信息

bash 复制代码
#查看 docker 版本信息
 docker version
 #注意:Yum安装默认安装最新版本,目前最新版本是24.0.7版本。
 ​
 #docker信息查看
 docker info

(3) 镜像加速下载

bash 复制代码
 浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置
 ​
 mkdir -p /etc/docker
 tee /etc/docker/daemon.json <<-'EOF'
 {
   "registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"]   #写入自己的加速器地址
 }
 EOF
 ​
 systemctl daemon-reload      #重新加载
 systemctl restart docker     #重启docker
 ​
 docker info   #查看是否启用了镜像加速

2.Jenkins主节点安装Harbor

(1)安装

bash 复制代码
#上传 docker-compose 和 harbor-offline-installer-v1.2.2.tgz 到 /opt 目录中
cd /opt
chmod +x docker-compose
mv docker-compose /usr/local/bin/
 
 
#部署 Harbor 服务
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
 
vim +5 /usr/local/harbor/harbor.cfg
--5行--修改,设置为Harbor服务器的IP地址或者域名
hostname = 192.168.204.15

cd /usr/local/harbor/
./install.sh

(2)登录harbor,创建项目

bash 复制代码
#在 Harbor 中创建一个新项目
(1)浏览器访问:http://192.168.204.15 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345
(2)输入用户名和密码登录界面后可以创建一个新项目。点击"+项目"按钮
(3)填写项目名称为"devops03",点击"确定"按钮,创建新项目

(3) 登录Harbor仓库上传镜像

bash 复制代码
# docker login -u admin -p Harbor12345 http://192.168.204.15

# docker pull maven

# docker tag maven:latest 192.168.204.15/devops03/devops03-maven-service:1.9.1

# docker push 192.168.204.15/devops03/devops03-maven-service:1.9.1

3.Jenkins从节点安装Docker

(1)YUM安装Docker

目前 Docker 只能支持 64 位系统。

bash 复制代码
#关闭防火墙和selinux
 systemctl stop firewalld.service
 setenforce 0
 ​
 #安装依赖包
 yum install -y yum-utils device-mapper-persistent-data lvm2 
 --------------------------------------------------------------------------------------------
 #yum-utils:提供了 yum-config-manager 工具。
 #device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,
 它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
 #device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
 --------------------------------------------------------------------------------------------
 ​
 #设置阿里云镜像源
 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
 ​
 #安装 Docker-CE并设置为开机自动启动
 yum install -y docker-ce      #docker-ce-cli、containerd.io 会作为依赖包被安装
 ​
 systemctl start docker.service
 systemctl enable docker.service 

(2) 查看Docker信息

bash 复制代码
#查看 docker 版本信息
 docker version
 #注意:Yum安装默认安装最新版本,目前最新版本是24.0.7版本。

(3) 镜像加速下载

bash 复制代码
 浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置
 ​
 mkdir -p /etc/docker
 tee /etc/docker/daemon.json <<-'EOF'
 {
   "registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"]  ,
   "insecure-registries": ["http://192.168.204.15"]

 }
 EOF
 ​
 systemctl daemon-reload      #重新加载
 systemctl restart docker     #重启docker
 ​
 docker info   #查看是否启用了镜像加速

指定私有镜像仓库地址

4.Jenkins流水线操作Harbor仓库

(1)GitLab的maven项目添加Dockerfile

(2) 修改Jenkins流水线代码,在回放中运行

bash 复制代码
@Library("mylib@master") _
import org.devops.*


def checkout = new Checkout()
def build = new Build()
def unittest = new UnitTest()
def sonar = new Sonar()

pipeline {
    agent { label "build"}

    options {
        skipDefaultCheckout true
    }
    stages{
        stage("Checkout"){
            steps{
                script {
                    println("GetCode")
                    checkout.GetCode("${env.srcUrl}","${env.branchName}")
                }
            }
        }
        stage("build"){
            steps{
                script{
                    println("Build")
                    sh "mvn clean package"
                }
            }

        }

        stage("UnitTest"){
            steps{
                script{
                    println("Test")
                    unittest.CodeTest("${env.buildTool}")
                }
            }

        }
        // stage("Upload"){
        //     steps{
        //         script{
        //             NexusUploadByPlugin("${env.artifactId}",
        //                     "target/maven-test-1.0-SNAPSHOT.jar",
        //                                 "${env.type}",
        //                                 "${env.groupId}",
        //                                 "${env.version}")
        //         }
        //     }
        // }
        stage("DockerBuild"){
            steps{
                script{
                    sh """
                        #登录镜像仓库
                        docker login -u admin -p Harbor12345 192.168.204.15
                        
                        #构建镜像
                        docker build -t 192.168.204.15/${JOB_NAME}:${env.branchName} .
                        
                        #上传镜像
                        docker push  192.168.204.15/${JOB_NAME}:${env.branchName}

                        #删除镜像
                        sleep 2
                        docker rmi 192.168.204.15/${JOB_NAME}:${env.branchName}
                        """

                }

            }

        }

    }
}

//NexusUploadByPlugin('devops-test','target/maven-test-1.0-SNAPSHOT.jar','jar','com.jenkins','1.1.2')

def NexusUploadByPlugin(artifactId,file,type,groupId,version ){
    nexusArtifactUploader artifacts: [[artifactId: artifactId,
                                       classifier: '',
                                       file: file,
                                       type: type]],
                          credentialsId: '318df1ad-083b-4158-ac88-2f584446563e',
                          groupId: groupId,
                          nexusUrl: '192.168.204.13:8081',
                          nexusVersion: 'nexus3',
                          protocol: 'http',
                          repository: 'mymavenrepo',
                          version: version
}

(3)Blue Ocean 查看

(4)查看日志

(5)查看Harbor

二、问题

1.Jenkins主节点登录Harbor仓库报错

(1)报错

(2)原因分析

为Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现错误。

(3)解决方法

bash 复制代码
 
解决方法:
1)在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问。 
vim /usr/lib/systemd/system/docker.service --13行--修改为
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.204.15 --containerd=/run/containerd/containerd.sock

2)或者修改为
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.204.15

3)重新加载system并重启docker
systemctl daemon-reload
systemctl restart docker.service

成功:

2.Jenkins流水线里从节点操作docker报错

(1)报错

bash 复制代码
[Pipeline] sh
+ docker login -u admin -p Harbor12345 192.168.204.15
/opt/jenkins03/workspace/devops03/devops03-maven-service@tmp/durable-8e4804f6/script.sh:行3: docker: 未找到命令

(2)原因分析

Jenkins从节点未安装docker

(3)解决方法

从节点安装docker

3.Jenkins流水线里从节点远程登录Harbor仓库报错

(1)报错

操作都是在 Harbor 服务器本地操作没有问题。如果其他客户端登录到 Harbor,就会报如下错误。

bash 复制代码
[Pipeline] sh
+ docker login -u admin -p Harbor12345 192.168.204.15
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://192.168.204.15/v2/": dial tcp 192.168.204.15:443: connect: connection refused

(2)原因分析

出现这问题的原因为Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。

(3)解决方法

方法一**:**解决办法是:在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问。

bash 复制代码
vim /usr/lib/systemd/system/docker.service
--13行--修改
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.204.15 --containerd=/run/containerd/containerd.sock
或
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.204.15

重启 Docker,再次登录

bash 复制代码
systemctl daemon-reload
systemctl restart docker

方法二:

创建daemon.json文件,添加配置。

bash 复制代码
 vim /etc/docker/daemon.json 
 {
   "registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"]  ,
   "insecure-registries": ["http://192.168.204.15"]

 }

重启 Docker,再次登录

bash 复制代码
systemctl daemon-reload
systemctl restart docker
相关推荐
Mr_Xuhhh42 分钟前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
朝九晚五ฺ8 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
Kkooe9 小时前
GitLab|数据迁移
运维·服务器·git
久醉不在酒10 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
虚拟网络工程师11 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
BLEACH-heiqiyihu11 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器
MXsoft61813 小时前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库
19004313 小时前
linux6:常见命令介绍
linux·运维·服务器
Camellia-Echo13 小时前
【Linux从青铜到王者】Linux进程间通信(一)——待完善
linux·运维·服务器
嚯——哈哈13 小时前
轻量云服务器:入门级云计算的最佳选择
运维·服务器·云计算