参数化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插件