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

2023-12-13 05:45:27

目录

一、实验

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 位系统。

#关闭防火墙和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信息


#查看 docker 版本信息
 docker version
 #注意:Yum安装默认安装最新版本,目前最新版本是24.0.7版本。
 ?
 #docker信息查看
 docker info

(3)?镜像加速下载


 浏览器访问 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)安装

#上传 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,创建项目

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

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

# 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 位系统。

#关闭防火墙和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信息


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

(3)?镜像加速下载


 浏览器访问 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流水线代码,在回放中运行

@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)解决方法

 
解决方法:
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)报错

[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,就会报如下错误。

[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 访问。

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,再次登录

systemctl daemon-reload
systemctl restart docker

方法二:

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


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

 }

重启 Docker,再次登录

systemctl daemon-reload
systemctl restart docker

文章来源:https://blog.csdn.net/cronaldo91/article/details/134946244
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。