2

假设有一个 monorepo,在不同的目录中有几个可独立构建的 python 包,格式如下所示,其中foobar是可独立构建的。

现在假设有人将代码推送到托管它的 git 存储库,并且代码修订仅存在于bar包中。如果詹金斯接受了推送,詹金斯有没有办法检测哪个包被改变了,只构建和部署改变的包,例如bar

或者,无论推送了哪些更改,让 Jenkins 在一个 monorepo 中重建/重新部署所有包是否只是标准做法?

root/
 └ src/
    ├ foo/
    │  ├ requirements.txt
    │  ├ setup.py
    │  └ foo/
    │     ├ __init__.py
    │     ├ module1.py
    │     ├ ...
    │     └ moduleN.py
    .
    .
    .
    └ bar/
       ├ requirements.txt
       ├ setup.py
       └ bar/
          ├ __init__.py
          ├ module1.py
          ├ ...
          └ moduleN.py
4

2 回答 2

3

我也一直在寻找这个。我从 Pinterest 找到了一个博客条目,他们在其中使用Pants

https://medium.com/@Pinterest_Engineering/building-a-python-monorepo-for-fast-reliable-development-be763781f67

在一部分中,他们说:

Pants 为我们的软件包提供快速、可重复的构建。Pants 在其目标上执行增量构建,因此仅重新构建更改的模块,从而加快构建过程。在虚拟环境中运行所有构建目标可确保构建可重现。

尽管 Pants 在 Windows 上不起作用,但这对我来说看起来不错。

于 2019-01-07T23:22:49.213 回答
2

我也一直在寻找这个问题的答案。使用参数来指定哪个包已更改的手动作业是一种方法,但它不是很好。

另一种选择是尝试检测发生了什么变化,我也不喜欢,但这是我发现的一个 git repo,它有一个脚本可以做到这一点https://github.com/slimm609/monorepo-gitwatcher

我希望那里有更好的解决方案,我在 Shazam ( https://blog.shazam.com/python-microlibs-5be9461ad979 ) 上找到了一个博客在谈论它,听起来他们已经解决了他们的问题。我已发表评论,试图对此部分进行澄清。

我对这些解决方案中的任何一个都不感到兴奋,但目前我想不出或找到更好的解决方案!

编辑:Jorge 对 Shazam 文章的回复提到他们通过使用特定名称标记 repo 来解决它,并向 Jenkins 指示要在 monorepo 中构建哪些包。它不是完全自动化的,但我想这取决于你愿意投入多少时间以及它发生的频率!

于 2018-11-27T08:34:35.550 回答