如何将Jenkins声明式流水线生成的ZIP包上传至Maven仓库?
解决方案
问题根源
你之前的配置存在三个核心问题:
- Maven默认打包类型为JAR,未指定为ZIP,导致生成空JAR包
clean install会触发Maven重新构建,而非复用npm已生成的ZIP文件rtMavenDeployer的snapshotRepo指向了通用仓库,而非目标Maven快照仓库test-maven-snapshot-local
下面提供两种可行的配置方案:
方案一:通过Maven插件+rtMavenRun部署
1. 修正pom.xml配置
配置Maven识别ZIP打包类型,并关联已生成的ZIP文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 填写你的Maven坐标,版本需带-SNAPSHOT对应快照仓库 --> <groupId>com.yourcompany</groupId> <artifactId>arena-web-ruf</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>zip</packaging> <build> <plugins> <!-- 复制npm生成的ZIP到Maven构建目录 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <executions> <execution> <id>copy-zip</id> <phase>process-resources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}</outputDirectory> <resources> <resource> <directory>${project.basedir}</directory> <includes> <include>arena*.zip</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> <!-- 跳过默认JAR打包逻辑 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>default-jar</id> <phase>none</phase> </execution> </executions> </plugin> <!-- 配置部署插件指向ZIP文件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>3.1.1</version> <configuration> <packaging>zip</packaging> <file>${project.build.directory}/arena*.zip</file> </configuration> </plugin> </plugins> </build> </project>
2. 调整Jenkinsfile配置
修正仓库指向,并仅执行Maven部署动作:
// 保留原有npm构建流程 sh "npm install" sh "npm run build:qa" // ... 你的ZIP打包步骤 stage ('Artifactory Config') { steps { rtServer ( id: 'Artifactory', url: 'https://artifactory.fis.dev/artifactory', credentialsId: '9134676', timeout: 300 ) rtMavenDeployer ( id: "MAVEN_DEPLOYER", serverId: "Artifactory", releaseRepo: "test-maven-release-local", // 可选,对应你的Maven发布仓库 snapshotRepo: "test-maven-snapshot-local" // 目标Maven快照仓库 ) rtMavenResolver ( id: "MAVEN_RESOLVER", serverId: "Artifactory", releaseRepo: "apache-maven-remote", snapshotRepo: "apache-maven-remote" ) } } stage ('Deploy to Maven Repo') { steps { rtMavenRun ( tool: "maven-3.2.5", pom: 'pom.xml', goals: 'deploy', // 仅执行部署,跳过clean/install避免重复构建 deployerId: "MAVEN_DEPLOYER", resolverId: "MAVEN_RESOLVER" ) } } // 保留原有通用仓库上传步骤(如果需要) stage ('Upload to Generic Repo') { steps { rtUpload ( serverId: 'Artifactory', spec: '''{ "files": [ { "pattern": "arena*.zip", "target": "my-generic-snapshot-local/packages/" } ] }''', ) } } stage ('Build Info') { steps { rtBuildInfo ( maxBuilds: 50, deleteBuildArtifacts: true ) } }
方案二:直接用rtUpload上传到Maven仓库(更简洁)
如果不想配置Maven插件,可直接通过rtUpload将ZIP和pom文件上传到符合Maven规范的路径:
// 保留原有npm构建流程 sh "npm install" sh "npm run build:qa" // ... 你的ZIP打包步骤 stage ('Artifactory Config') { steps { rtServer ( id: 'Artifactory', url: 'https://artifactory.fis.dev/artifactory', credentialsId: '9134676', timeout: 300 ) } } // 上传到Maven仓库 stage ('Upload to Maven Repo') { steps { rtUpload ( serverId: 'Artifactory', spec: '''{ "files": [ { "pattern": "arena*.zip", "target": "test-maven-snapshot-local/com/yourcompany/arena-web-ruf/1.0.0-SNAPSHOT/arena-web-ruf-1.0.0-SNAPSHOT.zip" }, { "pattern": "pom.xml", "target": "test-maven-snapshot-local/com/yourcompany/arena-web-ruf/1.0.0-SNAPSHOT/arena-web-ruf-1.0.0-SNAPSHOT.pom" } ] }''', ) } } // 保留原有通用仓库上传和Build Info步骤 stage ('Upload to Generic Repo') { steps { rtUpload ( serverId: 'Artifactory', spec: '''{ "files": [ { "pattern": "arena*.zip", "target": "my-generic-snapshot-local/packages/" } ] }''', ) } } stage ('Build Info') { steps { rtBuildInfo ( maxBuilds: 50, deleteBuildArtifacts: true ) } }
注意替换com/yourcompany、1.0.0-SNAPSHOT为你的实际Maven坐标信息。
内容的提问来源于stack exchange,提问作者vel
相关产品推荐
相关产品推荐

