返回总目录页

参数化pipeline,凭证管理,制品管理(jenkins)

 

参数化pipeline

使用parameters指令

pipeline {
    agent any
    parameters {
        booleanParam(defaultValue: true,description: '',name: 'userFlag')
    }
    stages {
        stage('foo') {
            steps {
                echo "flag: ${params.userFlag}"
            }
        }
    }
}

 

创建代码仓库

 添加文件

 新建Jenkinsfile文件

再次查看,有文件,左边有仓库菜单了

新建Jenkins流水线项目

 其它不用设置,就设置流水线这里

 获取仓库地址

 

 

 点击立即构建

 手动触发构建一次后,我们看下Jenkinsfile里设置的参数化构建是否已经同步到Jenkins项目中

 查看已经同步成参数化构建,并且有个参数

我们点击查看可以添加的参数有哪些

 我们看这里,立即构建变成了构建使用参数了。我们点击一下

 布尔值参数,默认true是勾选上的

 点击构建,查看这次构建日志。获取并打印参数值是true

 parameters指令支持的参数类型以及多参数

string字符串类型

pipeline {
    agent any
    parameters {
        string(name: 'DEPLOY_ENV',defaultValue: 'staging',description: '')
    }
    stages {
        stage('foo') {
            steps {
                echo "flag: ${params.userFlag}"
            }
        }
    }
}

上面的手动触发构建一次后,就同步现在修改后的Jenkinsfile参数配置

 点击构建。打印之前设置的布尔值变量,因为我们删除了,所以这个布尔值变量没了,这里获取为null。

 name就是参数变量名。我们修改为打印这个参数变量,

 再次点击构建一次,获取到我们设置的默认参数值

 text,多行文本类型,换行\n

pipeline {
    agent any
    parameters {
        text(name: 'DEPLOY_TEXT',defaultValue: 'One\nTwo\nThree\n',description: '')
    }
    stages {
        stage('foo') {
            steps {
                echo "flag: ${params.DEPLOY_TEXT}"
            }
        }
    }
}

手动触发构建,让新改的Jenkinsfile生效,下一次构建,就变成如下了

 点击构建并查看打印的变量

 

 BooleanParam 布尔型

我们上面的案例以及演示了布尔型的了,这里就不演示了

pipeline {
    agent any
    parameters {
        booleanParam(name: 'DEBUG_BUILD',defaultValue: true,description: '')
    }
    stages {
        stage('foo') {
            steps {
                echo "flag: ${params.DEBUG_BUILD}"
            }
        }
    }
}

choice,选择参数类型

pipeline {
    agent any
    parameters {
        choice(name: 'CHOICES', choices: 'dev\ntest\nstaging',description: '请选择部署的环境')
    }
    stages {
        stage('foo') {
            steps {
                echo "flag: ${params.CHOICES}"
            }
        }
    }
}

手动触发一次构建,同步Jenkinsfile配置,然后点击构建

 选一次测试进行构建

 查看Jenkins项目同步后配置

 file 文件类型

password 密码类型

pipeline {
    agent any
    parameters {
        password(name: 'PASSWORD', defaultValue: 'SECRET',description: 'A secret password')
    }
    stages {
        stage('foo') {
            steps {
                echo "flag: ${params.PASSWORD}"
            }
        }
    }
}

手动触发一次构建,然后点击构建,可以看的已经生效

 再次点击构建,查看结果,获取到密码

 查看同步的Jenkinsfile配置

 多参数

pipeline {
    agent any
    parameters {
        booleanParam(defaultValue: true,description: '',name: 'userFlag')
        string(name: 'DEPLOY_ENV',defaultValue: 'staging',description: '')
        text(name: 'DEPLOY_TEXT',defaultValue: 'One\nTwo\nThree\n',description: '')
        choice(name: 'CHOICES', choices: 'dev\ntest\nstaging',description: '请选择部署的环境')
        password(name: 'PASSWORD', defaultValue: 'SECRET',description: 'A secret password')
    }
    stages {
        stage('foo') {
            steps {
                echo "flag: ${params.PASSWORD}"
            }
        }
    }
}

手动触发构建一次,然后点击构建

 Jenkins项目配置

 

 

 由另外一个pipeline传参并触发

案例:

pipeline {
    agent any
    stages {
        stage ('build') {
            steps {
                build(
                    job:"parameters-example",
                    parameters: [
                        booleanParam(name: 'userFlag',value: false)
                    ]
                )
                echo 'Hello machangwei '
            }
        }
    }
}

 

 

下游pipeline是个参数化pipeline

pipeline {
    agent any
    parameters {
        booleanParam(name: 'userFlag', defaultValue: true,description: '')
    }
    stages {
        stage('foo') {
            steps {
                echo "flag: ${params.userFlag}"
            }
        }
    }
}

 

 

 创建上游pipeline的代码仓库

 创建上游pipeline流水线项目,使用上面新建的代码仓库

 

 修改上游pipeline,指定构建下游的参数化pipeline。

 此时查看下游的pipeline构建数字是16,

 然后点击构建上游的pipeline,看是否会触发构建这个下游pipeline,并且携带参数

报错了

 缺少逗号,修改后重新构建

 上游手动触发构建成功

 上游pipeline的日志输出,可以看到触发构建了下游pipeline,构建数字是17,

 可以看到,下游pipeline的确是运行了

 并且传递给下游的参数是false

 使用Conditional BuildStep 插件处理复杂的判断逻辑

可以用script里面根据参数进行判断,然后执行代码块。

pipeline {
    agent any
    parameters {
        choice(name: 'CHOICES', choices: 'dev\ntest\nstaging',description: '请选择部署的环境')
    }
    stages {
        stage('deploy to test') {
            steps {
                script {
                    if (params.CHOICES == 'test') {
                        echo "deploy to test"
                    }
                    if (params.CHOICES == 'dev') {
                        echo "deploy to dev"
                    }
                }
            }
        }
        stage('deploy to prod') {
            steps {
                script {
                    if (params.CHOICES == 'prod') {
                        echo "deploy to prod"
                    }
                    if (params.CHOICES == 'test') {
                        echo "machangwei test"
                    }

                }
            }
        }
    }
}

 

 

 选择测试,进行构建

 然后看到,两个阶段中,只有参数满足条件的代码块才执行了

 对比上面的输出,我们看下pipeline对应的内容

我们也可以用Conditional BuildStep插件,来写

插件地址 : https://plugins.jenkins.io/conditional-buildstep

 使用如下代码when进行判断

pipeline {
    agent any
    parameters {
        choice(name: 'CHOICES', choices: 'dev\ntest\nstaging',description: '请选择部署的环境')
    }
    stages {
        stage('deploy to test') {
            when {
                expression { return params.CHOICES == 'test' }
            }
            steps {
                echo "deploy to test for machangwei"
            }
        }
        stage('deploy to staging') {
            when {
                expression { return params.CHOICES == 'staging' }
            }
            steps {
                echo "deploy to staging for machangwei"
            }
        }
    }
}

选择测试进行构建

 when满足条件的,代码块执行。不满足的跳过

 在手动触发一次,这次选择staging

 满足是staging参数的,执行,不满足的跳过

 更复杂的判断条件

或逻辑

            when {
                // A or B
                expression { return A || B }
            }

与逻辑

            when {
                // A and B
                expression { return A && B }
            }

从文件中取值

            when {
                expression { return readFile('pom.xml').contains('mycomponent') }
            }

正则表示

            when {
                expression { return token ==~ /(?i)(Y|YES|T|TRUE|ON|RUN)/ }
            }

input步骤的简单用法

pipeline {
    agent any
    stages {
        stage('deploy') {
            steps {
                input message: "发布或停止"
                echo "deploy to test for machangwei"
            }
        }
    }
}

手动触发构建,卡在这里,

 需要点击发布或者停止。点击之后没有反应

 点了没反应,不知道是不是版本不行,这里启动状态好像也不行

 点击这里,进入插件的下载地址

 替换成低版本的,还是不行,暂时放弃

再来一次,不从阶段视图点击继续,其它页面点击

 到这个页面点击继续

 点击继续之后立马执行了

 可以看的pipeline已经执行结束

 再次构建一次35,然后这里点击终止

 可以看到,显示是终止

 阶段视图查看,deploy阶段是终止状态

 修改,加个echo,看点击继续和点击终止,是否如预期打印以及不打印machangwei

 继续

点继续,打印了,往下执行了

 点击终止

 点击终止,后面的都没执行,没有打印

 

input步骤的复杂用法

 还可以放到环境变量里面

environment {
     approvalMap = ''
}

pipeline {
    agent any
    stages {
        stage('pre deploy') {
            steps {
                script {
                    approvalMap = input(
                        message: "准备发布到哪个环境?",
                        ok: '确定',
                        parameters: [
                            choice(choices: 'dev\ntest\nprod',description: '发布到什么环境?',name: 'ENV'),
                            string(defaultValue: '',description: '', name: 'myparam')
                        ],
                        submitter: 'admin,admin2,machangwei,root,releaseGroup',
                        submitterParameter: 'APPROVER'
                    )
                }
            }
        }
        stage('deploy') {
            steps {
                echo "操作者是 ${approvalMap['APPROVER']}"
                echo "发布到什么环境?${approvalMap['ENV']}"
                echo "自定义参数: ${approvalMap['myparam']}"
            }
        }
    }
}

 

 点击确定之后,还是卡住没反应

 从这里输入试试

 这样了

 这个input的内容不出来了

点击恢复

 变成这个了

 看着像是运行结束了,完成了pipeline

 参数啥的的确是对的,但是不是从阶段视图这里点击完成的

 再次手动触发构建一次

 点确定之后还是没有反应

 

 点击确定之后,就完成了 

获取上游pipeline的信息

上游信息以参数的方式传给下游pipeline

                build job: 'all-in-one-deploy', parameters: [
                    string(name: 'DEPLOY_ENV', value: "${deploy_env}"),
                    string(name: 'triggerJobName', value: "${env.JOB_NAME}"),
                    string(name: 'triggerJobBuildNumber', value: "${env.BUILD_NUMBER}")
                ]

 

设置手动输入步骤超时后,pipeline自动终止

pipeline {
    agent any
    stages {
        stage('deploy') {
            steps {
                timeout(time: 1, unit: 'HOURS') {
                    input message: "发布或停止"
                }
            }
        }
    }
}

 

用户密码的凭证管理

pipeline {
    agent any
    stages {
        stage('deploy') {
            steps {
                withCredentials([usernamePassword(credentialsId: '104b2169-f64c-4c0d-a1d0-22e43914f73e', usernameVariable: 'username', passwordVariable: 'passwd')]){
                    echo "${username},${passwd}"
                }
                echo "machangwei"
            }
        }
    }
}

上面获取并打印这个凭证唯一id的用户和密码

 立即构建,打印结果如下

 

制品管理

使用maven发布制品到nexus中

 archiveArtifacts插件(这里没有用到): https://jenkins.io/doc/pipeline/steps/sore/#archiveartifacts-arch-ive-the-artifacts

 fork也就是以它重新创建一个新项目

 项目名加数字的时候,项目url自动加了个短横线

 为了保持一致,项目名称也加上一个-吧

 报错了,必须选一个命名空间

 之前项目好像都是用的这个

 

 成功fork

 清理项目目录,在pom.xml里面做修改

 pom.xml添加配置,指定私服

<distributionManagement>
        <repository>
            <id>user-release</id>
            <name>User Project Release</name>
            <url>http://10.0.0.25:9081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>user-snapshots</id>
            <name>User Project SNAPSHOTS</name>
            <url>http://10.0.0.25:9081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

 我们可以用这里面的settings.xml 配置 https://www.cnblogs.com/machangwei-8/p/18333786#_label2_1 ,也可以直接改Jenkins机器上的mvn-3.8.8工具的。我这里暂时先改mvn-3.8.8的

新增如下配置

<server>
      <id>user-snapshots</id>
      <username>admin</username>
      <password>123456</password>
    </server>
        <server>
      <id>user-release</id>
      <username>admin</username>
      <password>123456</password>
</server>    

 

修改

[root@mcw15 ~]# ls /var/lib/jenkins/tools/
hudson.tasks.Maven_MavenInstallation
[root@mcw15 ~]# ls /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/
mvn-3.8.8
[root@mcw15 ~]# ls /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/mvn-3.8.8/
bin  boot  conf  lib  LICENSE  NOTICE  README.txt
[root@mcw15 ~]# ls /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/mvn-3.8.8/conf/
logging  settings.xml  toolchains.xml
[root@mcw15 ~]# ls /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/mvn-3.8.8/conf/settings.xml 
/var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/mvn-3.8.8/conf/settings.xml
[root@mcw15 ~]# vim /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/mvn-3.8.8/conf/settings.xml
[root@mcw15 ~]# 

新增如下

 至于仓库地址,没有修改Jenkins上这个3.8.8工具的

 此时修改Jenkinsfile,使用3.8.8进行发布

pipeline {
    agent any
    tools {
        maven 'mvn-3.8.8'
    }
    stages {
        stage ('machangwei deploy') {
            steps {
                 sh 'mvn clean deploy  '
            }
        }
    }
}

 

 此时已经完成代码仓库和Jenkins配置的改动,还差创建这个仓库用的Jenkins项目

 新建流水线

 添加代码仓库的配置

 手动触发构建

 查看,这里下载的时候,虽然不是自己想的那个地方下载,但是上传我们打的包,却是如预期一样的

 

 我们看下这个上传的包名,是543-2.war,然后从私服里面查看对应的包

 我们可以看到,是第二个目录下的包,就是我们通过Jenkins这里的pipeline执行命令上传上去的。而第一个目录的包,是我们在Linux服务器上直接用mvn命令打包的,因为是同一份代码,虽然一个是放在代码仓库,但是拉取到Jenkins之后,执行mvn命令,跟之前第一次直接在Linux上执行命令是一样的。所以这里也是放在同一个目录下,有时间和其他标识分隔开这两个包

 

 

 给mvn-3.8.8工具配置,使用私服进行下载一些包

[root@mcw15 ~]# vim /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/mvn-3.8.8/conf/settings.xml

     <mirror>  
      <id>nexus-mirror</id>  
      <mirrorOf>*</mirrorOf>  
      <url>http://10.0.0.25:9081/repository/maven-public/</url>  
    </mirror>  

 再次手动触发构建一次Jenkins项目

 这次查看,部署的时候,开始打包的时候,需要的包直接从私服里面下载,

 打好的包上传到私服

 可以看到我们刚刚打的包,这里的清理机制,不知道应该怎么清理,应该不至于所有构建的包都要保留在这里吧,不清楚

 使用Nexus插件发布制品

Nexus Platform插件: https://plugins.jenkins.io/nexus-jenkins-plugin

上面链接有问题,直接从这里搜索一下

 

 还是一样,就是上面的链接,只是提示不存在了

 既然插件找不到了,那就这个方式的就算了。不看了

 @@使用Nexus管理Docker镜像

nexus中创建docker私有仓库以及手动上传和下载镜像

创建仓库

 进入docker(hosted)

 填写仓库名称,填写端口,下面运行匿名拉取镜像,不勾选,应该也就是禁用匿名拉取镜像

 其它的就用默认的吧

 此时可以看到这个仓库

 查看docker仓库的信息

 我们可以命令行看下,登录以及退出nexus上创建的docker镜像仓库。退出的时候指定私有仓库,不然默认退出的一般是官方的docker仓库

[root@mcw15 ~]# 
[root@mcw15 ~]# docker login -u admin -p 123456 http://10.0.0.25:8595
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://10.0.0.25:8595/v2/": http: server gave HTTP response to HTTPS client
[root@mcw15 ~]# docker login -u admin --password 123456 http://10.0.0.25:8595
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://10.0.0.25:8595/v2/": http: server gave HTTP response to HTTPS client
[root@mcw15 ~]# docker login -u admin --password 123456 http://10.0.0.25:8595
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://10.0.0.25:8595/v2/": http: server gave HTTP response to HTTPS client
[root@mcw15 ~]# docker login -u admin --password-stdin 123456 http://10.0.0.25:8595
"docker login" requires at most 1 argument.
See 'docker login --help'.

Usage:  docker login [OPTIONS] [SERVER]

Log in to a registry
[root@mcw15 ~]# docker logout
Removing login credentials for https://index.docker.io/v1/
[root@mcw15 ~]# docker logout http://10.0.0.25:8595
Removing login credentials for 10.0.0.25:8595
[root@mcw15 ~]# 

添加docker镜像加速器

[root@mcw15 ~]# vim /etc/docker/daemon.json
[root@mcw15 ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com","https://hub-mirror.c.163.com"]
}
[root@mcw15 ~]# systemctl daemon-reload 
[root@mcw15 ~]# systemctl restart docker
[root@mcw15 ~]# 

上面的发现都不能用,换成阿里云的吧,登录自己账号,然后找到下面位置

 这个还是不行,直接从别处下载一个导入本地吧。暂时

还是有一个可以的,参考地址:https://www.bilibili.com/read/cv36117553/?jump_opus=1

https://hub.atomgit.com
[root@mcw15 ~]# vim /etc/docker/daemon.json 
[root@mcw15 ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://hub.atomgit.com"]
}
[root@mcw15 ~]# systemctl daemon-reload 
[root@mcw15 ~]# systemctl restart docker 
[root@mcw15 ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@mcw15 ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
18399478396d: Pull complete 
Digest: sha256:464d422ce1d53ed615e3504ade7769f21b75fd5f9aeb2351229b8f4e650f26cc
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@mcw15 ~]# 

拉取镜像

[root@mcw15 ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@mcw15 ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
18399478396d: Pull complete 
Digest: sha256:464d422ce1d53ed615e3504ade7769f21b75fd5f9aeb2351229b8f4e650f26cc
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@mcw15 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
busybox      latest    949dfe7d4e59   8 months ago   4.26MB
[root@mcw15 ~]# 

目前我们的私有仓库是空的

镜像仓库地址:http://10.0.0.25:8595

 

打tag,私服里面docker镜像仓库的tag,推送失败

[root@mcw15 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
busybox      latest    949dfe7d4e59   8 months ago   4.26MB
[root@mcw15 ~]# docker tag busybox  10.0.0.25:8595/busybox:v1
[root@mcw15 ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
10.0.0.25:8595/busybox   v1        949dfe7d4e59   8 months ago   4.26MB
busybox                  latest    949dfe7d4e59   8 months ago   4.26MB
[root@mcw15 ~]# docker push 10.0.0.25:8595/busybox
Using default tag: latest
The push refers to repository [10.0.0.25:8595/busybox]
Get "https://10.0.0.25:8595/v2/": http: server gave HTTP response to HTTPS client
[root@mcw15 ~]#

修改,将10.0.0.25:8595加入到安全的仓库,这样就可以用http推送上去了,此时推送,是缺少认证。

[root@mcw15 ~]# vim /etc/docker/daemon.json 
[root@mcw15 ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://hub.atomgit.com"],
  "insecure-registries":["10.0.0.25:8595"]
}
[root@mcw15 ~]# systemctl daemon-reload 
[root@mcw15 ~]# systemctl restart docker
[root@mcw15 ~]# docker push 10.0.0.25:8595/busybox
Using default tag: latest
The push refers to repository [10.0.0.25:8595/busybox]
tag does not exist: 10.0.0.25:8595/busybox:latest
[root@mcw15 ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
10.0.0.25:8595/busybox   v1        949dfe7d4e59   8 months ago   4.26MB
busybox                  latest    949dfe7d4e59   8 months ago   4.26MB
[root@mcw15 ~]# docker push 10.0.0.25:8595/busybox:v1
The push refers to repository [10.0.0.25:8595/busybox]
c7821370666e: Preparing 
no basic auth credentials
[root@mcw15 ~]# 

登录私服里面的docker镜像仓库,并上传镜像,然后退出登录。如下,成功上传镜像仓库

[root@mcw15 ~]# docker login -u admin -p 123456 http://10.0.0.25:8595
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@mcw15 ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
10.0.0.25:8595/busybox   v1        949dfe7d4e59   8 months ago   4.26MB
busybox                  latest    949dfe7d4e59   8 months ago   4.26MB
[root@mcw15 ~]# docker push 10.0.0.25:8595/busybox:v1
The push refers to repository [10.0.0.25:8595/busybox]
c7821370666e: Pushed 
v1: digest: sha256:7e2646bb2a3110e5073a3ddb27095a705e7dabb74a3f3dd911bbd49f4da3fa24 size: 528
[root@mcw15 ~]# docker login http://10.0.0.25:8595
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@mcw15 ~]# docker push 10.0.0.25:8595/busybox:v1
The push refers to repository [10.0.0.25:8595/busybox]
c7821370666e: Layer already exists 
v1: digest: sha256:7e2646bb2a3110e5073a3ddb27095a705e7dabb74a3f3dd911bbd49f4da3fa24 size: 528
[root@mcw15 ~]# docker logout http://10.0.0.25:8595
Removing login credentials for 10.0.0.25:8595
[root@mcw15 ~]# docker push 10.0.0.25:8595/busybox:v1
The push refers to repository [10.0.0.25:8595/busybox]
c7821370666e: Preparing 
no basic auth credentials
[root@mcw15 ~]# 

我们可以看到,已经成功上传到nexus中的docker镜像仓库

 

 

从nexus上的docker镜像仓库里拉取镜像,

[root@mcw15 ~]# docker login -u admin -p 123456 http://10.0.0.25:8595
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@mcw15 ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
10.0.0.25:8595/busybox   v1        949dfe7d4e59   8 months ago   4.26MB
busybox                  latest    949dfe7d4e59   8 months ago   4.26MB
[root@mcw15 ~]# docker rm 10.0.0.25:8595/busybox:v1
Error response from daemon: No such container: 10.0.0.25:8595/busybox:v1
[root@mcw15 ~]# docker rmi 10.0.0.25:8595/busybox:v1
Untagged: 10.0.0.25:8595/busybox:v1
Untagged: 10.0.0.25:8595/busybox@sha256:7e2646bb2a3110e5073a3ddb27095a705e7dabb74a3f3dd911bbd49f4da3fa24
[root@mcw15 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
busybox      latest    949dfe7d4e59   8 months ago   4.26MB
[root@mcw15 ~]# docker pull 10.0.0.25:8595/busybox:v1
v1: Pulling from busybox
Digest: sha256:7e2646bb2a3110e5073a3ddb27095a705e7dabb74a3f3dd911bbd49f4da3fa24
Status: Downloaded newer image for 10.0.0.25:8595/busybox:v1
10.0.0.25:8595/busybox:v1
[root@mcw15 ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
10.0.0.25:8595/busybox   v1        949dfe7d4e59   8 months ago   4.26MB
busybox                  latest    949dfe7d4e59   8 months ago   4.26MB
[root@mcw15 ~]# docker logout http://10.0.0.25:8595
Removing login credentials for 10.0.0.25:8595
[root@mcw15 ~]# 

新一个镜像tag

[root@mcw15 ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
10.0.0.25:8595/busybox   v1        949dfe7d4e59   8 months ago   4.26MB
busybox                  latest    949dfe7d4e59   8 months ago   4.26MB
[root@mcw15 ~]# docker tag 10.0.0.25:8595/busybox:v1 10.0.0.25:8595/busybox:v2
[root@mcw15 ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
busybox                  latest    949dfe7d4e59   8 months ago   4.26MB
10.0.0.25:8595/busybox   v1        949dfe7d4e59   8 months ago   4.26MB
10.0.0.25:8595/busybox   v2        949dfe7d4e59   8 months ago   4.26MB
[root@mcw15 ~]# docker push 10.0.0.25:8595/busybox:v2
The push refers to repository [10.0.0.25:8595/busybox]
c7821370666e: Layer already exists 
v2: digest: sha256:7e2646bb2a3110e5073a3ddb27095a705e7dabb74a3f3dd911bbd49f4da3fa24 size: 528
[root@mcw15 ~]# 

可以看到多了一个v2版本

 @@pipeline中构建并发布docker镜像到nexus容器镜像仓库

创建凭证

上面的docker镜像仓库的账号密码, admin/123456

 

 创建Dockerfile

 

FROM busybox
RUN touch machangwei.txt

 

Jenkinsfile

pipeline {
    agent any
    environment {
        registry = "http://10.0.0.25:8595"
        registryCredential = 'dockernexus'
    }
    stages {
        stage ('machangwei build') {
            steps {
                 withDockerRegistry([
                     credentialsId: "${registryCredential}",
                     url: "${registry}"
                 ]) {
                    sh "docker build . -t ${registry}/machangweibusybox:v1"
                    sh "docker push ${registry}/machangweibusybox:v1"
                 }
            }
        }
    }
}

 

 构建失败

 没有这个

 

报错提示“没有这个步骤withDockerRegistry”表明Jenkins无法识别withDockerRegistry这个步骤。这通常是因为Jenkins环境中没有安装或配置相应的插件来提供这个步骤。

withDockerRegistry步骤是由CloudBees Docker Custom Build Environment插件或类似的插件提供的,它允许你在Pipeline脚本中配置Docker仓库的访问凭证。

 

 安装了一个好像还有依赖插件

 

 

 还是不行

 这个应该就是了

 

 

 

 上面的依赖下面的这个,已经解决,下面继续用那个步骤,手动触发构建一次试试,还是报错不行

 三个都安装的能用,

 然后再构建试试

 此时构建虽然失败,但是这个步骤已经是可以找到了

 现在只是镜像构建失败,没有权限

 先给Jenkins这里授个权,临时处理它没有权限的问题

[root@mcw15 plugins]# id jenkins
uid=996(jenkins) gid=994(jenkins) groups=994(jenkins)
[root@mcw15 plugins]# tail -2 /etc/sudoers
machangwei  ALL=(ALL) NOPASSWD: ALL 
jenkins  ALL=(ALL) NOPASSWD: /usr/bin/docker 
[root@mcw15 plugins]# 

改成sudo执行

 此时权限有了,再次构建但是tag无效

 把这里去掉

 

 再次构建,提示没有协议

 改一下,构建镜像这里不用http的,其它地方还有用带有http的

 这一次成功了

 执行成功

 服务器本地新增镜像

 已经成功上传nexus里的docker镜像仓库

 Jenkins服务退出docker登录

[root@mcw15 plugins]#  docker logout http://10.0.0.25:8595
Removing login credentials for 10.0.0.25:8595
[root@mcw15 plugins]# 
[root@mcw15 plugins]# docker images
REPOSITORY                         TAG       IMAGE ID       CREATED         SIZE
10.0.0.25:8595/machangweibusybox   v1        061222efa97a   5 minutes ago   4.26MB
10.0.0.25:8595/busybox             v1        949dfe7d4e59   8 months ago    4.26MB
10.0.0.25:8595/busybox             v2        949dfe7d4e59   8 months ago    4.26MB
busybox                            latest    949dfe7d4e59   8 months ago    4.26MB
[root@mcw15 plugins]# docker push 10.0.0.25:8595/machangweibusybox:v1
The push refers to repository [10.0.0.25:8595/machangweibusybox]
ae4144ba0c25: Preparing 
c7821370666e: Preparing 
no basic auth credentials
[root@mcw15 plugins]# 

再次构建一次,改成v2

 再次构建,报错了。也就是我们第一次成功,用的凭证没生效,而是用的Jenkins服务器,凭借它本身已经登录的仓库

先直接命令行登录 把,用这个步骤好像不能自己登录,不知道哪里的问题

 成功构建和上传镜像

 

 2也发布上来了

 没任何变动,再次构建一次

 还是这个镜像,不过更新时间变了

pipeline {
    agent any
    environment {
        registry = "http://10.0.0.25:8595"
        registryipport="10.0.0.25:8595"
        registryCredential = 'dockernexus'
    }
    stages {
        stage ('machangwei build') {
            steps {
                 withDockerRegistry([
                     credentialsId: "${registryCredential}",
                     url: "${registry}"
                 ]) {
                    sh "sudo docker login -u admin -p 123456 http://10.0.0.25:8595"
                    sh "sudo docker build . -t ${registryipport}/machangweibusybox:v2"
                    sh "sudo docker push ${registryipport}/machangweibusybox:v2"
                    sh "sudo docker logout http://10.0.0.25:8595"
                 }
            }
        }
    }
}

管理原始制品raw仓库

上传

pipeline {
    agent any
    environment {
        nexusRawUsernamePassword = credentials('nexusRaw')
    }
    stages {
        stage ('machangwei build') {
            steps {
                sh "curl --user '${nexusRawUsernamePassword}' --upload-file ./Dockerfile http://10.0.0.25:9081/repository/raw-example/${BUILD_NUMBER}/Dockerfile "
            }
        }
    }
}

下载

pipeline {
    agent any
    environment {
        nexusRawUsernamePassword = credentials('nexusRaw')
    }
    stages {
        stage ('machangwei build') {
            steps {
                sh "curl --user '${nexusRawUsernamePassword}' -o Dockerfile http://10.0.0.25:9081/repository/raw-example/${BUILD_NUMBER}/Dockerfile "
            }
        }
    }
}

 

创建仓库

 

 

 

 再多勾选一个

 新增凭证

 修改dockerfile

 构建成功

 

 查看仓库,已经成功上传。并且构建数字当成目录

 我们也可以从raw仓库下载

我们先将代码仓库的删除

 

 已经删除

 删除工作目录中的Dockerfile

 改成下载

 构建成功

 这命令显示的不对

 不过看的,的确是从raw仓库里面下载到工作目录了,因为我们的代码仓库已经没这个文件了的,所以肯定是nexus里下载过来的。再执行一次构建,日志输出命令,还是上面那样,估计就是显示问题

 感觉还是有点问题

 因为我们上面改错项目了,额

 删除分支

 

 删除,提交到主分支,刚刚就是这里,出现了问题

 下载构建数字17下的文件

 Jenkins本地删除

 立即构建,这次是下载,命令也是对的了

 也可以看的之前删除的,已经从raw仓库下载到Jenkins工作目录了

从其它pipeline中拷贝制品

方便生成版本号的Version Number插件

 

posted @ 2024-08-13 01:07  马昌伟  阅读(71)  评论(0编辑  收藏  举报
博主链接地址:https://www.cnblogs.com/machangwei-8/