如何减少类似构建配置的重复?

时间:2013-07-09 20:52:01

标签: teamcity

我有几个项目,我希望在单独的构建配置中使用略微不同的配置:

  • VCS源代码和构建触发器(即唯一的区别是项目根目录的子目录使用)
  • 构建步骤(前几个是完全相同的,但最后几个可能会有所不同,具体取决于运行单元测试的方式,依赖性等)。

就是这样。我查看了构建配置模板,但似乎不允许灵活地指定自定义构建步骤额外的VCS根目录。

实际上,我只是希望不必手动将初始项目的构建配置中的(几个)构建步骤复制到多个配置中,并且在事情发生变化时必须将它们全部维护。似乎应该有更好的解决方案?

2 个答案:

答案 0 :(得分:3)

我也想知道这一点,但我在网上找到的内容表明你赞成冗余,而不是试图在你的多个分支或项目中重用一个配置。

然而,所有这些都发布在版本8之前,这引入了提取meta-runner

的能力

他们的博客from April 13, 2013提供了很好的摘要,说明它们是什么以及它们与模板的区​​别。

  

元流道

     Meta Runner是一个强大的功能,为定制TeamCity提供了一种很有前途的新方法,使其更加以人为本。为了理解它,让我们考虑一个例子。

     

想象一下,您在不同的构建配置中反复使用了一些重复的任务。该任务被定义为一个或多个构建步骤,基于内置的运行程序,如Ant或命令行。您很可能希望在多个构建配置中轻松地重复使用此任务。您无法使用模板执行此操作,因为模板会强制您在不同配置之间共享相同的设置,这并非总是可行。我们建议的解决方案是从这些步骤中提取Meta-runner,看看它在发行说明中是如何工作的。

我还没有实现这个,但我很快就会测试它。这让我觉得你应该能够将存储库作为参数传递,但我不确定。

答案 1 :(得分:0)

我已经为此苦苦挣扎了一段时间,并开发了一种管理它的工具,我称之为Dictator Builder

很长时间以来,我们一直在与“模板”项目合作。基本上,它是一个具有可正常运行的应用程序的存储库,其中包含所需的所有构建配置。就像react-boilerplate一样。我们有几个模板项目,针对我们开发的每种类型的应用程序。

此问题使复制的代码与模板项目保持同步。

我现在将模板代码打包在一个“独裁者”中。像这样: https://github.com/tomasbjerre/dictator-react-boilerplate/tree/master/dictatables/static-files/react-boilerplate

独裁者决定将某些静态文件复制到指定文件夹的根目录。

{
  "message": "Copy react-boilerplate",
  "actions": [
    {
      "copyFrom": "react-boilerplate",
      "target": "."
    }
  ]
}

独裁者可以像npx dictator-react-boilerplate@version这样的命令行运行。它将决定当前的工作目录,通常是应用程序中的代码库。可以通过代码库在.dictatorconfig.json文件中进行配置。也许选择不由某些部分决定:

{
  "ignore": [
    "/app",
    "/package.json",
    "/package-lock.json",
    "/Changelod.md"
  ]
}

因此,模板中的大多数构建配置都只是复制到指定的代码库中。并且app文件夹和其他内容仍由代码库管理。

克隆后,该文件夹如下所示:

app
coverage
.dictatorconfig.json
docs
.gitignore
internals
LICENSE.md
node_modules
package.json
README.md
server

npm install之后或npx dictator-react-boilerplate@version之后,它看起来像:

.all-contributorsrc
app
appveyor.yml
babel.config.js
Changelog.md
CODE_OF_CONDUCT.md
CONTRIBUTING.md
coverage
.dictatorconfig.json
docs
.editorconfig
.eslintrc.js
.gitattributes
.gitignore
internals
jest.config.js
LICENSE.md
node_modules
.nvmrc
package.json
package-lock.json
.prettierignore
.prettierrc
README.md
server
.stylelintrc
.travis.yml