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里:
自己的构建机器要配置下这个:


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

- 先给它加进去看下效果:
来到devops4-maven-service,给它创建一个Dockerfile文件:

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

- 构建并观察效果


符合预期。😘
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}
📍 自己测试过程:
- 配置代码:
我这里为啥报了这个错误呢?
串行和并行都测试过了的啊:

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

再次尝试就可以了。。
记得上次老师没做过这个配置啊……
- 并行测试:


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

- 串行测试:





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

符合预期。😘
🍀 问题
- 问题现象
之前老版本harbor测试,都没报这个错误来着的;
新版本测试,为啥报这个错误了呢?
jenkins上都可以正常推送上去,但是gitlab-CI就有问题了;


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

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

- 最后发现,串行测试没问题,但是并行测试一直报这个错误……奇怪
Harbor REST API
http://192.168.1.200:8088/devcenter-api-2.0

Harbor API 实践【New】
| 💘 实践:Harbor API 实践(批量删除docker镜像)-2022.6.25 |
在Harbor中批量的创建一些标签

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

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

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镜像已经清空了】

📍 自己测试过程:
- 来到
devops4-maven-service仓库,创建一个新分支:

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


相同的镜像,harbor就自动给你归类了:
- 这里在做一个小小的改动:



- 创建一个jeninks job:
devops4-clean-harbor



- 安装插件

- 开始构建:

点击这个Input requested:


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

这里只是把tag给去掉了:

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

实验结束。
本次完整代码如下:
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是自带镜像删除策略的



