hugo-teek is loading...

harbor ci-cd

最后更新于:

CI流水线中制品库集成

镜像规范

业务/服务:commitId

镜像上传

 1docker login 192.168.1.200:8088
 2Username: admin
 3Password:
 4WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
 5Configure a credential helper to remove this warning. See
 6https://docs.docker.com/engine/reference/commandline/login/#credentials-store
 7
 8Login Succeeded
 9
10docker tag nginx:1.9.1 192.168.1.200:8088/devops03/devops03-maven-service:1.9.1
11docker push 192.168.1.200:8088/devops03/devops03-maven-service:1.9.1

镜像下载

1docker pull 192.168.1.200:8088/devops03/devops03-maven-service:1.9.1

CI流水线集成

💘 实践:harbor CI流水线中制品库集成(测试成功)-2022.6.25

1.Jenkins

 1pipeline {
 2    agent {
 3        label "build"
 4    }
 5
 6    stages {
 7        stage("DockerBuild"){
 8            steps{
 9                script{
10                  imageName = "${env.buName}/${env.serviceName}"
11                  imageTag = "${env.branchName}-${env.commitID}"
12                  sh """
13                    #登录镜像仓库
14                    docker login -u admin -p Harbor12345 192.168.1.200:8088
15
16                    # 构建镜像
17                    docker build -t 192.168.1.200:8088/${imageName}:${imageTag} .
18
19                    # 上传镜像
20                    docker push 192.168.1.200:8088/${imageName}:${imageTag}
21
22                    # 删除镜像
23                    sleep 2
24                    docker rmi 192.168.1.200:8088/${imageName}:${imageTag}
25                  """
26                    }
27                }
28            }
29        }
30    }
31}
  • 我们先手动上传下镜像到harbor里:

自己的构建机器要配置下这个:

image-20220625093812765

image-20220622195053609

  • 来到devops4-maven-service项目,创建一个dockerfile:

image-20220622125010468

  • 先给它加进去看下效果:

来到devops4-maven-service,给它创建一个Dockerfile文件:

image-20220622204230686

再将本次代码拷贝到共享库里,看下效果:

image-20220625093948367

  • 构建并观察效果

image-20220625094016308

image-20220625094056616

符合预期。😘

2.GitLabCI

 1.dockerbuild:
 2  tags:
 3    - "${RUNNER_TAG}"
 4  stage: dockerbuild
 5  rules:
 6    - if: '$RUN_TYPE == "CI"'
 7      when: always
 8    - when: never
 9  script:
10    |- 
11      imageName=${CI_PROJECT_ROOT_NAMESPACE}/${CI_PROJECT_NAME}:${CI_COMMIT_BRANCH}-${CI_COMMIT_SHORT_SHA}
12      #登录镜像仓库
13      docker login -u admin -p Harbor12345 192.168.1.200:8088
14      # 构建镜像
15      docker build -t 192.168.1.200:8088/${imageName} .
16      # 上传镜像
17      docker push 192.168.1.200:8088/${imageName}
18      # 删除镜像
19      sleep 2
20      docker rmi 192.168.1.200:8088/${imageName}

📍 自己测试过程:

  • 配置代码:

我这里为啥报了这个错误呢?

串行和并行都测试过了的啊:

image-20220622223135142

估计是自己的gitlab-runner用户权限不对,这里在上面配置上sudo:

image-20220622223239055

再次尝试就可以了。。

记得上次老师没做过这个配置啊……

  • 并行测试:

image-20220625095136020

image-20220625095115653

奇怪啊,老师,当时记得是并行测试时有问题的……

image-20220622224015158

  • 串行测试:

image-20220625094806647

image-20220622223051587

image-20220622223113240

image-20220625094710138

image-20220625094722925

注意:因为前面jenkins那里已经上传了一个相同镜像,所以这里只显示为一个;

image-20220625094732707

符合预期。😘

🍀 问题

  • 问题现象

之前老版本harbor测试,都没报这个错误来着的;

新版本测试,为啥报这个错误了呢?

jenkins上都可以正常推送上去,但是gitlab-CI就有问题了;

image-20220624083013179

image-20220624082349516

We trust you have received the usual lecture from the local System

18Administrator. It usually boils down to these three things:

19 #1) Respect the privacy of others.

20 #2) Think before you type.

21 #3) With great power comes great responsibility.

22sudo: no tty present and no askpass program specified

image-20220624083222447

  • 这里测试都是可以使用sudo命令的啊……

image-20220624082625679

  • 最后发现,串行测试没问题,但是并行测试一直报这个错误……奇怪

Harbor REST API

http://192.168.1.200:8088/devcenter-api-2.0

image-20220622224741601

Harbor API 实践【New】

💘 实践:Harbor API 实践(批量删除docker镜像)-2022.6.25

在Harbor中批量的创建一些标签

image-20220622224924231

创建一个Jenkins作业, 不需要配置任何参数。 只需要把Jenkinfile内容放进去。

image-20220622224942117

jenkinsfile内容:

  • 通过API 获取所有的tag标签列表。
  • 将标签信息用INPUT交互式的展示。
  • 调用删除接口,删除镜像标签。

image-20220622225008544

 1import groovy.json.JsonSlurper
 2
 3/*
 4清理docker镜像
 5
 61. 获取镜像列表
 72. 用户选择删除
 83. 调用api删除
 9
10*/
11pipeline {
12    agent {
13        label "build"
14    }
15
16    stages{
17
18        stage("GetTags"){
19            steps{
20                script{
21                    env.projectName = "acmp"
22                    env.repoName = "acmp-nginx-service"
23                    env.result = GetArtifactTag(env.projectName, env.repoName)
24                    env.result = env.result - '[' - ']'
25                }
26            }
27        }
28
29        stage("Clean"){
30            steps{
31                script{
32
33                    def result = input  message: "是否删除${env.projectName}项目的${env.repoName}这些标签:", 
34                                        parameters: [extendedChoice(defaultValue: "${env.result}", 
35                                                                    multiSelectDelimiter: ',', 
36                                                                    name: 'taga', 
37                                                                    quoteValue: false, 
38                                                                    saveJSONParameterToFile: false, 
39                                                                    type: 'PT_CHECKBOX', 
40                                                                    value: "${env.result}", 
41                                                                    visibleItemCount: 20)]
42                    println("${result}")
43                    // println("Delete  ${taga}, doing.......")
44                    // tags = "${taga}" - '[' - ']'
45
46                    for(t in result.split(',')){
47                        println("Delete >>>>" + t.trim())
48                        DeleteArtifactTag(env.projectName,env.repoName, t.trim())
49                    }
50                }
51            }
52
53        }
54    }
55}
56
57
58// 删除镜像tag
59def DeleteArtifactTag(projectName,repoName, tagName){
60    harborAPI = "http://192.168.1.200:8088/api/v2.0/projects/${projectName}/repositories/${repoName}"
61    apiURL = "artifacts/${tagName}/tags/${tagName}"
62    sh """ curl -X DELETE "${harborAPI}/${apiURL}" -H "accept: application/json"  -u admin:Harbor12345 """
63}
64
65// 获取镜像的所有标签
66// acmp-nginx-service
67def GetArtifactTag(projectName,repoName ){
68    harborAPI = "http://192.168.1.200:8088/api/v2.0/projects/${projectName}/repositories/${repoName}"
69    apiURL = "artifacts?page=1&page_size=10"
70    response = sh returnStdout: true, script:  """curl -X GET "${harborAPI}/${apiURL}" -H "accept: application/json" -u admin:Harbor12345 """
71    response = readJSON text: """${response - "\n"}""" 
72    tags = []
73    for (t in response[0].tags){
74        tags << t.name
75    }
76
77    return tags
78}

最终效果:【Harbor镜像已经清空了】

image-20220622225105218

📍 自己测试过程:

  • 来到devops4-maven-service仓库,创建一个新分支:

image-20220622225247292

然后在jenkins里跑一次流水线:

image-20220622225353117

image-20220625095502517

相同的镜像,harbor就自动给你归类了:

  • 这里在做一个小小的改动:

image-20220622225554432

image-20220622225621449

image-20220625095611789

  • 创建一个jeninks job:

devops4-clean-harbor

image-20220623141411891

image-20220623141351548

image-20220623141402534

  • 安装插件

image-20220625100829901

  • 开始构建:

image-20220625095746943

点击这个Input requested:

image-20220625095816020

image-20220625095837790

老师这里当时好像也是只选择了一个镜像,次问题暂且搁置吧……🤣

image-20220625095921089

这里只是把tag给去掉了:

image-20220625095951183

但是,再跑一次的话就会报错……

image-20220625100035069

实验结束。

本次完整代码如下:

 1import groovy.json.JsonSlurper
 2
 3/*
 4清理docker镜像
 5
 61. 获取镜像列表
 72. 用户选择删除
 83. 调用api删除
 9
10*/
11pipeline {
12    agent {
13        label "build"
14    }
15
16    stages{
17
18        stage("GetTags"){
19            steps{
20                script{
21                    env.projectName = "${env.repoName}".split("-")[0]
22                    env.result = GetArtifactTag(env.projectName, env.repoName)
23                    env.result = env.result - '[' - ']'
24                }
25            }
26        }
27
28        stage("Clean"){
29            steps{
30                script{
31
32                    def result = input  message: "是否删除${env.projectName}项目的${env.repoName}这些标签:", 
33                                        parameters: [extendedChoice(defaultValue: "${env.result}", 
34                                                                    multiSelectDelimiter: ',', 
35                                                                    name: 'taga', 
36                                                                    quoteValue: false, 
37                                                                    saveJSONParameterToFile: false, 
38                                                                    type: 'PT_CHECKBOX', 
39                                                                    value: "${env.result}", 
40                                                                    visibleItemCount: 20)]
41                    println("${result}")
42                    // println("Delete  ${taga}, doing.......")
43                    // tags = "${taga}" - '[' - ']'
44
45                    for(t in result.split(',')){
46                        println("Delete >>>>" + t.trim())
47                        DeleteArtifactTag(env.projectName,env.repoName, t.trim())
48                    }
49                }
50            }
51
52        }
53    }
54}
55
56
57// 删除镜像tag
58def DeleteArtifactTag(projectName,repoName, tagName){
59    harborAPI = "http://172.29.9.103:8088/api/v2.0/projects/${projectName}/repositories/${repoName}"
60    apiURL = "artifacts/${tagName}/tags/${tagName}"
61    sh """ curl -X DELETE "${harborAPI}/${apiURL}" -H "accept: application/json"  -u admin:Harbor12345 """
62}
63
64// 获取镜像的所有标签
65// acmp-nginx-service
66def GetArtifactTag(projectName,repoName ){
67    harborAPI = "http://172.29.9.103:8088/api/v2.0/projects/${projectName}/repositories/${repoName}"
68    apiURL = "artifacts?page=1&page_size=10"
69    response = sh returnStdout: true, script:  """curl -X GET "${harborAPI}/${apiURL}" -H "accept: application/json" -u admin:Harbor12345 """
70    response = readJSON text: """${response - "\n"}""" 
71    tags = []
72    for (t in response[0].tags){
73        tags << t.name
74    }
75
76    return tags
77}

注意:harbor是自带镜像删除策略的

image-20220623082730430

image-20220625100917874

推荐使用微信支付
微信支付二维码
推荐使用支付宝
支付宝二维码
最新文章

文档导航