GitLab CI父子POM构建失败求助:多微服务独立构建方案
解决GitLab CI中多微服务项目共享父POM的构建方案
方案一:利用GitLab内置Maven仓库共享父POM
这是适配Maven生态的标准方案,将父POM部署到GitLab自带的Maven仓库,让所有微服务项目从该仓库拉取依赖。
- 父项目CI配置:在父POM项目的
.gitlab-ci.yml中添加部署阶段,推送父构件到GitLab Maven仓库stages: - deploy deploy_parent_pom: stage: deploy image: maven:3.8.6-openjdk-11 script: - | cat > settings.xml << EOF <settings> <servers> <server> <id>gitlab-maven</id> <configuration> <httpHeaders> <property> <name>Job-Token</name> <value>${CI_JOB_TOKEN}</value> </property> </httpHeaders> </configuration> </server> </servers> <mirrors> <mirror> <id>gitlab-maven</id> <url>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors> </settings> EOF - mvn deploy -s settings.xml - 微服务项目CI配置:每个微服务项目构建前,配置GitLab Maven仓库作为依赖源,确保能拉取父POM
注意替换stages: - build build_service: stage: build image: maven:3.8.6-openjdk-11 script: - | cat > settings.xml << EOF <settings> <repositories> <repository> <id>gitlab-maven</id> <url>${CI_API_V4_URL}/projects/[父项目ID]/packages/maven</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <servers> <server> <id>gitlab-maven</id> <configuration> <httpHeaders> <property> <name>Job-Token</name> <value>${CI_JOB_TOKEN}</value> </property> </httpHeaders> </configuration> </server> </servers> </settings> EOF - mvn clean package -s settings.xml[父项目ID]为实际的父POM项目ID。
方案二:将父POM作为Git子模块引入各微服务项目
如果不想依赖远程仓库,可以把父POM项目作为子模块嵌入每个微服务项目,构建时直接使用本地父POM。
- 初始化子模块:在每个微服务项目根目录执行
git submodule add [父POM项目Git地址] parent-pom - CI构建配置:在微服务项目的
.gitlab-ci.yml中,先拉取子模块再执行构建
这种方式无需额外配置仓库,但父POM版本更新时,需要手动在每个微服务项目中更新子模块版本,或在CI中添加stages: - build build_service: stage: build image: maven:3.8.6-openjdk-11 script: - git submodule update --init --recursive - mvn clean package -Dmaven.repo.local=.m2/repositorygit submodule update --remote拉取最新版本(注意可能带来的稳定性风险)。
方案三:跨项目下载父POM制品并本地安装
利用GitLab制品功能,父项目构建后上传父POM构件,微服务项目CI通过API下载并安装到本地Maven仓库。
- 父项目CI配置:上传父POM构件作为制品
stages: - build - upload build_parent: stage: build image: maven:3.8.6-openjdk-11 script: - mvn clean package artifacts: paths: - target/*.pom - target/*.jar # 若父项目有打包Jar则保留 upload_artifacts: stage: upload dependencies: - build_parent script: - echo "父POM构件已作为制品上传" - 微服务项目CI配置:下载父项目制品并本地安装
注意替换括号中的参数为实际项目信息,比如父项目ID、构件名称、groupId等。stages: - prepare - build download_parent_pom: stage: prepare image: curlimages/curl:latest script: - | curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \ "${CI_API_V4_URL}/projects/[父项目ID]/jobs/artifacts/main/download?job=build_parent" \ -o parent-artifacts.zip - unzip parent-artifacts.zip - mvn install:install-file -Dfile=target/[父POM构件名称].pom -DgroupId=[父POM的groupId] -DartifactId=[父POM的artifactId] -Dversion=[父POM版本] artifacts: paths: - .m2/repository/[父POM的groupId路径] build_service: stage: build image: maven:3.8.6-openjdk-11 dependencies: - download_parent_pom script: - mvn clean package -Dmaven.repo.local=.m2/repository
内容的提问来源于stack exchange,提问作者Raju Reddy
相关产品推荐
相关产品推荐

