背景
多模块的 maven 项目,抽象了通用的代码逻辑作为单独的 maven 模块,这样,不仅自己项目可以用,也可以提供依赖给其他项目用,那么这个时候需要将这个模块上传到 maven 私服,发布 maven 私服时,release 版本不支持覆盖,所以需要集成 ci 工具,给 maven 模块自动加上版本号,并自动完成 deploy 操作。本文方案依赖 maven 打包插件 flatten-maven-plugin,maven 版本要求大于等于 3.5.0maven 配置
1、将 root 模块的 version 变量化,如新增如下的版本号 properties 参数<modelVersion>4.0.0</modelVersion> <groupId>com.github.kl</groupId> <artifactId>demo</artifactId> <packaging>pom</packaging> <version>${revision}</version> <name>${project.artifactId}</name> <modules> <module>core</module> <module>common</module> <module>admin</module> </modules> <properties> <revision>1.0</revision> </properties>2、子模块依赖父模块,依然使用 {revision} 占位符代替,依赖子模块使用revision占位符代替,依赖子模块使用{project.version},如:
<modelVersion>4.0.0</modelVersion> <parent> <groupId>com.github.kl</groupId> <artifactId>demo</artifactId> <version>${revision}</version> </parent> <artifactId>core</artifactId> <packaging>jar</packaging> <name>${project.artifactId}</name> <dependencies> <dependency> <groupId>com.github.kl</groupId> <artifactId>common</artifactId> <version>${project.version}</version> </dependency> </dependencies>3、不纳入自动版本号的模块,指定 version,同时,这种模块也不需要 deploy 到私服,配置提过,如:
<modelVersion>4.0.0</modelVersion> <parent> <groupId>com.github.kl</groupId> <artifactId>demo</artifactId> <version>1.0</version> </parent> <artifactId>admin</artifactId> <packaging>jar</packaging> <name>${project.artifactId}</name> <properties> <maven.deploy.skip>true</maven.deploy.skip> </properties> <dependencies> <dependency> <groupId>com.github.kl</groupId> <artifactId>common</artifactId> <version>${project.version}</version> </dependency> </dependencies>4、root 模块添加支持外部传入版本号参数的构建插件 flatten-maven-plugin,添加私服仓库地址
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>flatten-maven-plugin</artifactId> <version>1.1.0</version> <configuration> <updatePomFile>true</updatePomFile> <flattenMode>resolveCiFriendliesOnly</flattenMode> </configuration> <executions> <execution> <id>flatten</id> <phase>process-resources</phase> <goals> <goal>flatten</goal> </goals> </execution> <execution> <id>flatten.clean</id> <phase>clean</phase> <goals> <goal>clean</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <distributionManagement> <repository> <id>repo</id> <url>https://nexus.dev.com/repository/maven-releases/</url> </repository> </distributionManagement>完成如上步骤后,deploy 时,就可以通过传入系统参数的方式,动态指定版本号,如:mvn deploy -Drevision=xxx
gitlab ci 配置
1、在项目根目录创建文件 .ci/settings.xml , 内容如下:<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>repo</id> <username>${env.NEXUS_REPO_USERNAME}</username> <password>${env.NEXUS_REPO_PASSWORD}</password> </server> </servers> </settings>这个文件配置了 repo 的 maven 私服仓库 server,因为这个配置跟随项目的 git 走的,为了防止用户名和密码泄露,从环境变量中获取(提前在 gitlab 里配置好)
2、在.gitlab-ci.yml 中新增 build-deploy 流程
build-deploy: stage: build-deploy image: maven:3.6.3-openjdk-8-slim only: - master - dev variables: MAVEN_OPTS: "-Xmx512m -Xms512m -Dmaven.repo.local=$CI_PROJECT_DIR/repository" script: - mvn -s .ci/settings.xml --batch-mode clean deploy -Drevision=1.0-${CI_PIPELINE_IID} artifacts: paths: - admin/target expire_in: 1 week cache: paths: - repository