Skip to content

制品库平台实践-nexus

制品库平台实践-nexus

image-20230626204508801

目录

[TOC]

本节实践

实战名称
💘 实践:配置Maven代理仓库(测试成功)-2022.6.7
💘 实践:创建Maven本地仓库(依赖)-2022.6.10(测试成功)
💘 实践:创建Raw本地仓库(制品)(测试成功)-2022.6.10
💘 实践:使用管理页面上传制品(测试成功)-2023.6.27
💘 实践:使用mvn命令上传制品(自定义pom信息(灵活))-2022.6.11
💘 实践:直接读取pom文件(扩展)-2022.6.11(测试成功)
💘 实践:使用Jenkins插件上传制品(把信息写死)(测试成功)-2023.6.28
💘 实践:使用Jenkins插件上传制品(读取POM文件上传制品)(测试成功)-2023.6.28
💘 扩展: 可以在Jenkins页面添加参数, 让用户输入后进行发布(测试成功)-2023.6.28
💘 实践:Jenkins插件获取包路径-2023.6.29(测试成功)
💘 实践:CI综合实践-2023.6.29(测试成功)

1、Nexus基本功能简介

官网:https:apache-maven-3.8.5

image-20220605124450440

image-20230626220602062

image-20230626220704555

image-20220606080839726

来到一个java项目里,使用maven进行测试效果:

image-20220606083855937

此时会报一个错误的,这里我们要配置下权限:

这种公网的,我们一般不加权限:

image-20220606084007639

再次构建,观察效果:

image-20220606084415074

可以看到能够正常下载。

image-20220607071721941

测试成功。😘

2.搭建制品库(本地仓库 依赖包)

本地仓库:以Maven为例:

  • RELEASE类型仓库(存放制品稳定版) 这个里面的包一般是需要手动指定的;
  • SNAPSHOT类型仓库(存放制品开发版) 这个里面的包一般是自动生成版本号的;

image-20220610080531022

切记:release类型的仓库只能存放release版本的包。不能将release类型的包上传到snapshot仓库,同理snapshot类型的包也不能上传到release类型的仓库中。

  • 新建raw类型的仓库: raw可以理解为普通的文件存储;

raw格式就是一块普通的存储。(制品就传到这种类型的仓库里去)

image-20220610080614130

① 创建Maven本地仓库(依赖)

💘 实践:创建Maven本地仓库(依赖)-2022.6.10(测试成功)

image-20220610083123941

  • 创建仓库:

image-20220610083338652

选择hosted类型:

image-20220610083417572

  • 定义和配置仓库的信息: 名称、存储、是否允许重新上传:

image-20220610083543123

最后点击Create repositry

image-20220610083621800

  • 观察效果:

image-20220610083703091

image-20220610083719270

  • 同理,我们再创建一个devops4-release的本地仓库:

image-20220610083900543

image-20220610083916573

测试完成。😘

② 创建Raw本地仓库(制品)

💘 实践:创建Raw本地仓库(制品)(测试成功)-2022.6.10

image-20220610083947334

  • 创建仓库:

image-20220610084125579

选择raw(hosted)类型:

image-20220610084200083

填写仓库名,并创建:

image-20220610085056159

  • 观察效果:

image-20220610085108812

  • 模拟上传一个图片:

image-20220610085135142

image-20220610085239466

image-20220610085257865

测试结束。😘

4、CI流水线中集成制品库

1.使用管理页面上传制品

页面很方便上传,但是有时候不太好用...例如出现上传失败等问题(暂时无法解决,不同版本的nexus有些api不对应的坑)。

💘 实践:使用管理页面上传制品(测试成功)-2023.6.27
  • 我们来创建maven-devops6-releasemaven-devops6-snapshot2个maven仓库

image-20230627200855447

image-20230627201750863

  • 这次来手动上传下jenkins agent的agent.jar包。

image-20230627203113365

  • 先来模拟一次报错提示

image-20230627203350336

image-20230627203419478

我们指定jar包Version1.1.1-SNAPSHOT,但是我们往RELEASE类型的仓库上传,肯定就会报错的啦。

  • 我们改变下这里的Version字段内容,然后再次上传,观察下现象

image-20230627203640216

image-20230627203651629

image-20230627203728285

此时,就可以正常上传成功了。

2.使用maven指令上传制品

参考:https:defPushArtifactsByMvn(repoName,filePath){sh """mvn deploy:deploy-file \-DgeneratePom=false \-DrepositoryId="maven-hosted"\-Durl=http:-DpomFile=pom.xml \-Dfile="${filePath}""""}PushArtifactsByMvn("${params.repoName}","target/${pkg}")

① 方法1:使用mvn命令上传制品(自定义pom信息(灵活))

💘 实践:使用mvn命令上传制品(自定义pom信息(灵活))-2022.6.11
  • 实验环境
bash
sonatype/nexus3:3.53.0apache-maven-3.9.2
  • 实验软件(无)

  • 上传制品之前, 肯定得确定目标仓库是存在的。 如果不存在我们可以新建一个 hosted类型的maven仓库。

image-20220611074336030

  • 仓库已经有了, 需要更新maven的配置文件,在settings.xml中添加仓库的认证信息。如下:
groovy
<server><id>mymaven</id><username>admin</username><password>admin123</password></server>
bash
[root@devops ~]#vim /usr/local/apache-maven-3.8.5/conf/settings.xml<server><id>mymaven</id><username>admin</username><password>admin123</password></server>

image-20220611074718292

  • 上传制品前记得先要编译构建下的:
bash
[root@devops ~]#cd[root@devops ~]#cd devops4-maven-service-master[root@devops devops4-maven-service-master]#lsbuild.shmvnwmvnw.cmdpom.xmlREADME.mdsonar-project.propertiessrctarget[root@devops devops4-maven-service-master]#mvn clean package

image-20220611074901435

bash
[root@devops devops4-maven-service-master]#pwd/root/devops4-maven-service-master[root@devops devops4-maven-service-master]#lsbuild.shmvnwmvnw.cmdpom.xmlREADME.mdsonar-project.propertiessrctarget[root@devops devops4-maven-service-master]#ls target/classesdemo-0.0.1-SNAPSHOT.jardemo-0.0.1-SNAPSHOT.jar.originalmaven-archiver
  • 开始上传:

注意使用mvn deploy 发布时,-DrepositoryId参数的值要与上面配置文件中的<server>标签中的<id>一致。不然会出现401,用户认证失败的问题。

bash
mvndeploy:deploy-file-DgroupId=xxxxxx#pom中的groupId-DartifactId=xxxxxx#pom中的artifactId-Dversion=xxxxxx#pom中的版本号version-Dpackaging=xxxxxx#pom中打包方式-Dfile=xxxxxx#本地文件-Durl=xxxxxx#仓库url-DrepositoryId=xxxxxx#对应的是setting.xml(认证)

Maven上传报错, 401 可以确定是认证的错误。 需要检查认证信息。

bash
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy-file (default-cli) on project demo:Failed to deploy artifacts:Could not transfer artifact com.devops:zeyang:jar:1.1.1 from/to remote-repository (http:-DgroupId=com.devops \-DartifactId=xyy \-Dversion=1.1.1-snapshot \-Dpackaging=jar \-Dfile=target/demo-0.0.1-SNAPSHOT.jar \-Durl=http:-DrepositoryId=mymaven

image-20220611080206055

  • 我们再次修改下参数观察下效果:
bash
mvndeploy:deploy-file\-DgroupId=com.devops \-DartifactId=xyy \-Dversion=1.1.1-SNAPSHOT \-Dpackaging=jar \-Dfile=target/demo-0.0.1-SNAPSHOT.jar \-Durl=http:-DrepositoryId=mymaven#注意:默认是会生成pom文件的。#如果不想生成pom文件,则可以使用如下选项-DgeneratePom=false

这里的-Dversion=1.1.1-SNAPSHOTSNAPSHOT一定要大写才行的!否则会被认为是release类型的制品,当然也就不能上传到snapshot仓库了。

可以看到,本次上传成功了:

image-20220611080330752

备注:Pom文件就是个坐标。

image-20230627210305228

  • 验证:制品已经上传成功了。

image-20220611080424283

测试成功。😘

② 方法2:直接读取pom文件(扩展)

💘 实践:直接读取pom文件(扩展)-2022.6.11(测试成功)
  • 实验环境
  • 默认项目下是已经有pom.xml文件了:
bash
sonatype/nexus3:3.53.0apache-maven-3.9.2
  • 实验软件(无)
bash
[root@devops devops4-maven-service-master]#lsbuild.shmvnwmvnw.cmdpom.xmlREADME.mdsonar-project.propertiessrctarget[root@devops devops4-maven-service-master]#cat pom.xml

image-20220611082707223

  • 这里直接使用命令上传:
bash
mvndeploy:deploy-file\-DgeneratePom=true \-DrepositoryId=mymaven \-Durl=http:-DpomFile=pom.xml \-Dfile=target/demo-0.0.1-SNAPSHOT.jar

image-20220611082838359

image-20220611082849107

  • 验证:

image-20220611082956079

测试成功。😘

⚠️ FAQ:

release类型的仓库只能上传release版本的包。如果你尝试用snapshot包上传到release类型的仓库时会遇到这些错误的。

bash
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy-file (default-cli) on project demo:Failed to deploy artifacts:Could not transfer artifact com.example:demo:jar:0.0.1 from/to maven-hosted (http:<artifactId>myapp</artifactId><version>0.0.2-SNAPSHOT</version>//改成0.0.2-RELEASE

3.使用Jenkins插件上传制品

① 方法1:使用Jenkins插件上传制品(把信息写死)

💘 实践:使用Jenkins插件上传制品(把信息写死)(测试成功)-2023.6.28
  • 安装插件:

Nexus Aritifact Uploader

image-20220611151557186

  • 使用片段生成器生成DSL:

找一个pipeline项目,生成流水线脚本:

image-20230628071119368

新建一个nexus凭据:

image-20230628070803438

image-20230628071150459

生成代码:

groovy
nexusArtifactUploader artifacts:[[artifactId:'demo-app',classifier:'',file:'target/xxx.jar',type:'jar']],credentialsId:'3404937d-89e3-4699-88cf-c4bd299094ad',groupId:'com.devops6',nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:'maven-devops6-release',version:'1.1.1'

调整下格式:

groovy
nexusArtifactUploader artifacts:[[artifactId:'demo-app',classifier:'',file:'target/xxx.jar',type:'jar']],credentialsId:'3404937d-89e3-4699-88cf-c4bd299094ad',groupId:'com.devops6',nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:'maven-devops6-release',version:'1.1.1'
  • 这边来到jenkins的devops6-maven-service项目里,先跑一次流水线看下有问题没:

image-20230628071448543

image-20230628071703695

可以看到流水线是ok的。

  • 我们再来写一下流水线代码:
groovy
stage("PushArtifact"){steps{script{PushArtifactByPlugin()}}}defPushArtifactByPlugin(){nexusArtifactUploader artifacts:[[artifactId:'demo-app',classifier:'',file:'target/demo-0.0.1-SNAPSHOT.jar',type:'jar']],credentialsId:'3404937d-89e3-4699-88cf-c4bd299094ad',groupId:'com.devops6',nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:'maven-devops6-release',version:'1.1.1'}

image-20230628072038684

然后把这个代码放到上面项目的回放里,跑一次:

groovy
@Library("devops06@main") _defbuild =neworg.devops.Build()defsonar =neworg.devops.Sonar()currentBuild.displayName ="${env.branchName}-commitID"currentBuild.description ="Trigger by user jenkins \nbranch:${env.branchName}"pipeline {agent {label "build"}options {skipDefaultCheckout true} stages{stage("CheckOut"){steps{script{build.CheckOut()}}}stage("Build"){steps{script{build.Build()}}} stage("CodeScan"){when {environment name:'skipSonar',value:'false'}steps{script{sonar.SonarScannerByPlugin() }}}stage("PushArtifact"){steps{script{PushArtifactByPlugin()}}}}}defPushArtifactByPlugin(){nexusArtifactUploader artifacts:[[artifactId:'demo-app',classifier:'',file:'target/demo-0.0.1-SNAPSHOT.jar',type:'jar']],credentialsId:'3404937d-89e3-4699-88cf-c4bd299094ad',groupId:'com.devops6',nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:'maven-devops6-release',version:'1.1.1'}

image-20230628072431427

可以看到,上传制品成功了:

image-20230628072328051

image-20230628072347527

  • 下载制品,点击链接,下载就ok了。

image-20230628072506697

测试成功。😘

② 方法2:使用Jenkins插件上传制品(读取POM文件上传制品)

💘 实践:使用Jenkins插件上传制品(读取POM文件上传制品)(测试成功)-2023.6.28
  • devops6-maven-servicegitlab项目里编辑下pom.xml文件,添加packaging选项并提交。
bash
<packaging>jar</packaging>

image-20230628075950652

  • 编写pipeline代码
groovy
@Library("devops06@main") _defbuild =neworg.devops.Build()defsonar =neworg.devops.Sonar()currentBuild.displayName ="${env.branchName}-commitID"currentBuild.description ="Trigger by user jenkins \nbranch:${env.branchName}"pipeline {agent {label "build"}options {skipDefaultCheckout true} stages{stage("CheckOut"){steps{script{build.CheckOut()}}}stage("Build"){steps{script{build.Build()}}} stage("CodeScan"){when {environment name:'skipSonar',value:'false'}steps{script{sonar.SonarScannerByPlugin() }}}stage("PushArtifact"){steps{script{PushArtifactByPluginPOM()}}}}}defPushArtifactByPlugin(){nexusArtifactUploader artifacts:[[artifactId:'demo-app',classifier:'',file:'target/demo-0.0.1-SNAPSHOT.jar',type:'jar']],credentialsId:'3404937d-89e3-4699-88cf-c4bd299094ad',groupId:'com.devops6',nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:'maven-devops6-release',version:'1.1.1'}defPushArtifactByPluginPOM(){POM=readMavenPom file:'pom.xml'println(POM)println("GroupID:${POM.groupId}")println("ArtifactID:${POM.artifactId}")println("Version:${POM.version}")println("Packaging:${POM.packaging}")env.artifactId ="${POM.artifactId}"env.packaging ="${POM.packaging}"env.groupId ="${POM.groupId}"env.art_version ="${POM.version}"env.art_name ="${env.artifactId}-${env.art_version}.${env.packaging}"nexusArtifactUploader artifacts:[[artifactId:"${env.artifactId}",classifier:'',file:"target/${env.art_name}",type:"${env.packaging}"]],credentialsId:'3404937d-89e3-4699-88cf-c4bd299094ad',groupId:"${env.groupId}",nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:'maven-devops6-release',version:"${env.art_version}"}

image-20230628124328780

  • 在回放里运行

image-20230628124518879

image-20230628124446169

发现报错:

将项目里的pom文件改成RELEASE版本。

image-20230628124620477

改成

image-20230628124726497

然后再次运行:

image-20230628124841495

又一次报错,提示:status:400 Repository does not allow updating assets:maven-devops6-release

应该是nexus3仓库里之前已经存在了这个包。

我们这里再改下version:

image-20230628125003359

再次运行:

image-20230628125116468

image-20230628125100794

这次就运行成功了。

image-20230628125142740

  • 然后写到共享库里,再次运行测试

image-20230628133855172

image-20230628133845430

构建成功。

  • 也可以修改上面这个版本,利用函数传参来演示

pipeline代码:

groovy
@Library("devops06@main") _defbuild =neworg.devops.Build()defsonar =neworg.devops.Sonar()currentBuild.displayName ="${env.branchName}-commitID"currentBuild.description ="Trigger by user jenkins \nbranch:${env.branchName}"pipeline {agent {label "build"}options {skipDefaultCheckout true} stages{stage("CheckOut"){steps{script{build.CheckOut()}}}stage("Build"){steps{script{build.Build()}}} stage("CodeScan"){when {environment name:'skipSonar',value:'false'}steps{script{sonar.SonarScannerByPlugin() }}}stage("PushArtifact"){steps{script{pomData =readMavenPom file:'pom.xml'buName ="${JOB_NAME}".split("-")[0]repoName ="maven-${buName}-release"file ="target/${pomData.artifactId}-${pomData.version}.${pomData.packaging}"PushArtifactByPluginPOM(pomData.artifactId,file,pomData.packaging,pomData.groupId,repoName,pomData.version)}}}}}defPushArtifactByPlugin(){nexusArtifactUploader artifacts:[[artifactId:'demo-app',classifier:'',file:'target/demo-0.0.1-SNAPSHOT.jar',type:'jar']],credentialsId:'3404937d-89e3-4699-88cf-c4bd299094ad',groupId:'com.devops6',nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:'maven-devops6-release',version:'1.1.1'}defPushArtifactByPluginPOM(artifactId,file,type,groupId,repoName,version){println(artifactId)println("${file},${type},${groupId},${repoName},${version}")nexusArtifactUploader artifacts:[[artifactId:artifactId,classifier:'',file:file,type:type]],credentialsId:'3404937d-89e3-4699-88cf-c4bd299094ad',groupId:groupId,nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:repoName,version:version }

image-20230629091623624

image-20230629091707573

再次运行:

image-20230629091435615

image-20230629091413823

image-20230629091343925

发现这个方法也是ok的。(haha,函数方式感觉nb一点,那这里就采用函数方式了哦。😂)

然后把这部分代码放到共享库里,再次测试下:

image-20230629094435751

image-20230629094339247

image-20230629094451374

符合预期。

此时共享库里玩转代码如下: PushArtifact.groovy文件:

groovy
packageorg.devopsdefPushArtifactByPlugin(){nexusArtifactUploader artifacts:[[artifactId:'demo-app',classifier:'',file:'target/demo-0.0.1-SNAPSHOT.jar',type:'jar']],credentialsId:'3404937d-89e3-4699-88cf-c4bd299094ad',groupId:'com.devops6',nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:'maven-devops6-release',version:'1.1.1'}defPushArtifactByPluginPOM(artifactId,file,type,groupId,repoName,version){println(artifactId)println("${file},${type},${groupId},${repoName},${version}")nexusArtifactUploader artifacts:[[artifactId:artifactId,classifier:'',file:file,type:type]],credentialsId:'3404937d-89e3-4699-88cf-c4bd299094ad',groupId:groupId,nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:repoName,version:version }

Jenkinsfile文件:

groovy
@Library("devops06@main") _defbuild =neworg.devops.Build()defsonar =neworg.devops.Sonar()defpushartifact =neworg.devops.PushArtifact()currentBuild.displayName ="${env.branchName}-commitID"currentBuild.description ="Trigger by user jenkins \nbranch:${env.branchName}"pipeline {agent {label "build"}options {skipDefaultCheckout true} stages{stage("CheckOut"){steps{script{build.CheckOut()}}}stage("Build"){steps{script{build.Build()}}} stage("CodeScan"){when {environment name:'skipSonar',value:'false'}steps{script{sonar.SonarScannerByPlugin() }}}stage("PushArtifact"){steps{script{pomData =readMavenPom file:'pom.xml'buName ="${JOB_NAME}".split("-")[0]repoName ="maven-${buName}-release"file ="target/${pomData.artifactId}-${pomData.version}.${pomData.packaging}"pushartifact.PushArtifactByPluginPOM(pomData.artifactId,file,pomData.packaging,pomData.groupId,repoName,pomData.version)}}} }}

测试完成。😘

扩展: 可以在Jenkins页面添加参数, 让用户输入后进行发布

💘 扩展: 可以在Jenkins页面添加参数, 让用户输入后进行发布(测试成功)-2023.6.28

tstmp_20230629102803

测试过程如下:

  • 改写代码:

image-20220612085854177

groovy
@Library("mylib@main") _ importorg.devops.*defcheckout =newCheckout() defbuild =newBuild()defunittest =newUnitTest()defsonar =newSonar()defgitcli =newGitLab()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 "${env.buildShell}"}}}stage("CodeScan"){when {environment name:'skipSonar',value:'false'}steps{script{profileName ="${JOB_NAME}".split("-")[0]sonar.Init("${JOB_NAME}","java",profileName)commitID =gitcli.GetCommitID()groupName =profileNameprojectID =gitcli.GetProjectID("${JOB_NAME}",groupName)sonar.CodeScan("${env.branchName}",commitID,projectID)}}}stage("PushArtifact"){steps{script{buName ="${JOB_NAME}".split("-")[0]repoName ="${buName}-snapshot"file ="target/${env.artifactId}-${env.version}.${env.packaging}"PushArtifactByNexusPlugin(env.artifactId,file,env.packaging ,env.groupId,repoName,env.version)}}}}}defPushArtifactByNexusPlugin(artifactId,file,type,groupId,repoName,version){println(artifactId)println("${file},${type},${groupId},${repoName},${version}")nexusArtifactUploader artifacts:[[artifactId:artifactId,classifier:'',file:file,type:type]],credentialsId:'2b44f51a-2374-4275-aeed-b720f4fbf937',groupId:groupId,nexusUrl:'172.29.9.101:8081',nexusVersion:'nexus3',protocol:'http',repository:repoName,version:version }
  • 在流水线里添加字符参数和选项参数:

image-20220612090001655

image-20220612090013761

  • 开始构建:

image-20220612085627306

观察效果:

image-20220612085733756

可以看到制品被成功上传到制品库了:

image-20220612085656120

测试结束。😘

Jenkins插件获取包路径

发布其实就是下载制品,然后将制品发送到目标主机,最后通过脚本或者指令启动程序。

这个其实没多大意义。

💘 实践:Jenkins插件获取包路径-2023.6.29(测试成功)
  • 实验环境
bash
gitlab-ce:15.0.3-ce.0jenkins:2.346.3-2-lts-jdk11sonarqube:9.9.0-communitynexus3:3.53.0
  • 实验软件(无)

下面是下载制品的示例:

bash
curlhttp:tags:-"${RUNNER_TAG}"stage:pushartifact rules:-if:'$RUN_TYPE =="CI"'when:always-when:neverscript:|-if[[${PROJECT_TYPE} =="java"]];thenpkgName=`ls target/ | grep -e "jar$"`cd target/newPkgName=${CI_PROJECT_NAME}-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHORT_SHA}.jarfilePath=${CI_PROJECT_ROOT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_COMMIT_BRANCH}-${CI_COMMIT_SHORT_SHA}#Dir/buName/serviceName/version/serviceName-version.xxxmv ${pkgName} ${newPkgName}curl -X POST"http:-H "accept:application/json"\-H "Content-Type:multipart/form-data"\-F "raw.directory=${filePath}"\-F "raw.asset1=@${newPkgName};type=application/java-archive"\-F "raw.asset1.filename=${newPkgName}"-u admin:admin123elseecho "PROJECT_TYPE ERROR [java]"fi

📍 本次测试过程

image-20220620151909202

image-20220620151947603

  • 先跑一次流水线,看下效果:

image-20220620152352927

报错了:

image-20220620152415887

这里之前是配置过用户名和密码的了:

image-20220620152530009

image-20220620160306424

image-20220620160231714

后面还要看下这个容器:……要重装下的!!!!

image-20220620160632431

  • 这里先把代码扫描给跳过:

image-20220620160548403

再跑一次流水线:

image-20220620160701753

  • 现在开始写代码:

找一下gitlabci的预定义环境变量

image-20220620162129426

image-20220620163728227

image-20220620163747263

此时,在RELEASE-1.1.1里加一些代码,并提交:

image-20220620163837618

image-20220620163850033

image-20220620163924957

符合预期。

  • 此时有个问题,那么jenkins里再跑一次CD,会下载哪个包呢?

image-20220620164008701

可以看到拿的是最新那个包。

以上完整代码如下:

groovy
.pipelineInit:tags:-"${RUNNER_TAG}"stage:.prevariables:GIT_CHECKOUT:"true"##局部开启作业的代码下载script:-ls -l .cibuild:tags:-"${RUNNER_TAG}"stage:buildscript:-echo "${BUILD_SHELL}"-${BUILD_SHELL}artifacts:paths:-${ARTIFACT_PATH}.citest:tags:-"${RUNNER_TAG}"stage:testscript:-echo "${TEST_SHELL}"-${TEST_SHELL}# artifacts:# reports:# junit:${TEST_REPORTS}.codescan:tags:-"${RUNNER_TAG}"stage:codescanscript:|-/usr/local/sonar-scanner/sonar-scanner-4.7.0.2747-linux/bin/sonar-scanner \-Dsonar.login=${SONAR_USER} \-Dsonar.password=${SONAR_PASSWD} \-Dsonar.projectVersion=${CI_COMMIT_BRANCH}\-Dsonar.branch.name=${CI_COMMIT_BRANCH} \-Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA} \-Dsonar.gitlab.ref_name=${CI_COMMIT_BRANCH} \-Dsonar.gitlab.project_id=${CI_PROJECT_ID} \-Dsonar.dynamicAnalysis=reuseReports \-Dsonar.gitlab.failure_notification_mode=commit-status \-Dsonar.gitlab.url=http:-Dsonar.gitlab.user_token=${GITLAB_TOKEN} \-Dsonar.gitlab.api_version=v4.pushartifact:tags:-"${RUNNER_TAG}"stage:pushartifact script:|-if[[${PROJECT_TYPE} =="java"]];thenpkgName=`ls target/ | grep -e "jar$"`cd target/#Dir/buName/serviceName/version/serviceName-version.xxxmv ${pkgName} ${CI_PROJECT_NAME}-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHORT_SHA}.jarcurl -X POST"http:-H "accept:application/json"\-H "Content-Type:multipart/form-data"\-F "raw.directory=/${CI_PROJECT_ROOT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_COMMIT_BRANCH}-${CI_COMMIT_SHORT_SHA}"/\-F "raw.asset1=@${CI_PROJECT_NAME}-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHORT_SHA}.jar;type=application/java-archive"\-F "raw.asset1.filename=${CI_PROJECT_NAME}-${CI_COMMIT_BRANCH}-${CI_COMMIT_SHORT_SHA}.jar"-u admin:admin123elseecho "PROJECT_TYPE ERROR [java]"fi
groovy
include:-project:'devops4/devops4-gitlablib-service'ref:mainfile:-'/jobs/CI.yaml'workflow:rules:-if:$CI_PIPELINE_SOURCE=="web"when:always-if:$CI_COMMIT_BEFORE_SHA=="0000000000000000000000000000000000000000"when:never-when:alwaysvariables:GIT_CHECKOUT:"false"## 全局关闭作业代码下载BUILD_SHELL:"sh -x build.sh"## 构建命令TEST_SHELL:"/usr/local/apache-maven-3.8.5/bin/mvn test "## 测试命令ARTIFACT_PATH:"target