跨项目持续集成问题

在 CODING 企业版持续集成的使用中,每次都是只能在当前这一个项目进行持续集成,那么如何跨项目进行持续集成呢?

举个例子:有两个项目,分别 A 和 B,涉及到一些公共代码的管理, 抽取了一个公共项目叫 C,于是把这三个项目在 CODING 上分别建了三个仓库做管理,那么 A 和 B 的 pom.xml 中是会依赖 C 的,所以正常来说必须要先对 C 执行 mvn install 将这个 jar 包放入本地仓库,然后在去打包 A 和 B。那么在 A、B 执行 mvn package 命令的时候肯定会报错找不到依赖。

以下解决方案可以解决多项目持续集成问题。

解决方案

目录结构

Project
    |
    |--- C -> https://example.com/xxxx/C.git
    |     | ---pom.xml
    |--- A
    |     |--- pom.xml
    |--- B
    |     |--- pom.xml
    |---pom.xml
    |---Jenkensfile

 

挂载 C 项目

首先进入项目目录,执行下面命令

git submodule add https://example.com/xxxx/C.git C

 

父项目 Jenkinsfile

Jenkinsfile 将产生三个构建物,分别是 A, B, C

pipeline {
    agent {
        label "default"
    }
    stages  {
        
        stage("检出") {
            steps {
                sh 'ci-init'
                checkout(
                  [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
                  userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
                )
            }
        }

        stage("构建") {
            steps {
                echo "构建中..."
              	sh 'mvn package -Dmaven.test.skip=true' 
                archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true         	
                echo "构建完成."
            }
        }
    }
}

 

构建 C 项目

pipeline {
    agent {
        label "default"
    }
    stages  {
        
        stage("检出") {
            steps {
                sh 'ci-init'
                checkout(
                  [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
                  userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
                )
            }
        }

        stage("构建") {
            steps {
                echo "构建中..."
                dir(path: 'C') {
              		sh 'mvn package -Dmaven.test.skip=true' // mvn 示例
              		archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
              	}
                echo "构建完成."
            }
        }

        stage("测试") {
            steps {
                echo "单元测试中..."
                // 请在这里放置您项目代码的单元测试调用过程,例如:
                sh 'mvn test' // mvn 示例
                echo "单元测试完成."
                junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
            }
        }
    }
}

 

构建 A,B 项目

pipeline {
    agent {
        label "default"
    }
    stages  {
        
        stage("检出") {
            steps {
                sh 'ci-init'
                checkout(
                  [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
                  userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
                )
            }
        }

        stage("构建") {
            steps {
                echo "构建中..."
	            dir(path: 'A') {
    	                sh 'mvn package -Dmaven.test.skip=true' // mvn 示例
   		        archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
                    }
                echo "构建完成."
                
            }
        }

        stage("测试") {
            steps {
                echo "单元测试中..."
                // 请在这里放置您项目代码的单元测试调用过程,例如:
                sh 'mvn test' // mvn 示例
                echo "单元测试完成."
                // junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
            }
        }
    }
}

A 和 B 的 Jenkinsfile 基本相同。dir(path: ‘A’) 改为 dir(path: ‘B’)

相关文章