我正在将多个存储库转换为单个存储库的过程中,由于将多个存储库结构转换为一个存储库,因此我们选择的CI工具是Jenkins。出现了2个主要问题。


由于每次提交都必须运行所有构建/测试,因此构建/测试时间已大大增加。通过使用构建工具可以部分缓解这种情况,在我们的案例中,我们不再使用Buck。
运行与提交的代码相关的所有测试之后,每个项目都有一个部署Jenkinsfile。我如何才能仅为需要重新部署的项目触发Jenkinsfiles?如果我能够这样做,这是正确的做法吗?


评论

您的构建挂钩如何实现?您是否使用Jenkins轮询存储库?您是否在每次提交时都安装了git钩子?

我们在每次提交时都放置了githooks

#1 楼


获取已更改文件的列表,并使用该列表确定要运行的测试。
在运行时加载外部Groovy脚本以运行您的部署。


评论


请复制链接中的相关位,并将其张贴在引号中,以防止如果该链接被弃用,则该信息将丢失。也许您也可以添加自己的个人观点:您会选择什么选项,为什么?

– 030
19年7月27日在9:53



#2 楼

您可以将“ when”块与内置的“ changeset”条件结合使用,以有条件地仅运行monorepo管道的某些阶段。来自when.changeset文档:

changeset-
如果构建的SCM变更集包含一个或多个与给定字符串或glob匹配的文件,则执行该阶段。示例:当{changeset“ ** / *。js”}

以下是使用此策略的示例Jenkinsfile:

pipeline {
    agent any
    stages {
        stage('build matchengine') {
            when {
                changeset "**/matchengine/*.*"
            }
            steps {
                echo 'building match engine'
            }
        }
        stage('build posttrade') {
            when {
                changeset "**/posttrade/*.*"
            }
            steps {
                echo 'building post trade'
            }
        }
    }
}


,适用到如下所示的monorepo项目结构:

 .(my-project)
   |-- Jenkinsfile
   |-- matchengine
   |-- posttrade
   |-- serverless
   |-- ui


此策略无法扩展到较小的代码库,因为很难跟踪哪些模块相互依赖。使用像Bazel这样的构建系统会更好。您的CI作业只需发出一个bazel构建///(构建所有内容),然后Bazel将计算实际需要构建的内容以及需要测试的内容。此外,甚至存在诸如rules_docker和rules_k8s之类的淡褐色规则,它们可以计算需要重建哪些容器并将其推送到容器注册表,以及哪些应用程序需要重新部署到Kubernetes。

评论


不幸的是,变更集不包含变更请求中的所有变更,仅包含最后两次提交之间的增量。但是自定义检查很容易实现。

–芒果
20-2-16在9:25