首页 > 解决方案 > Jenkins Mercurial 如何从构建中包含的所有变更集中获取所有文件

问题描述

我对 Jenkins 很陌生,但是随着我的项目开始增长,对完整 CI 的需求也在增加。所以我希望有一个部署任务,如果所有通过,它将运行。现在,由于我在服务器上使用 PHP,我不想通过 SSH 发布每个构建的整个应用程序。我只想推送已更改的文件。现在在詹金斯我可以得到修订,但它只向我显示最新的修订。我目前正在使用批处理文件来获取变量值。我需要的是构建中的变更集列表,因为可能不止一个。然后使用 hg log -r %1:%2 --template "{file_mods}{file_adds}\n" 使用 from 和 too 来获取列表。

无论如何,我都愿意实现这个 groovy/powershell 或 bat 文件。但是这方面的任何指导都会有所帮助,因为我在浏览有关该主题的文章时有些迷失。我会认为这将是一件常见的事情,所以也许我错过了一些东西。

提前致谢

院长

标签: phpjenkinsmercurial

解决方案


只是肮脏的想法,而不是现成的解决方案

注释

我只想推送已更改的文件

明显的问题|补充:“......自/this point in history/以来发生了变化”。您必须以某种方式存储这些数据(部署的最新变更集)并将其提供给 Jenkins 工作

使用 hg log -r %1:%2 --template "{file_mods}{file_adds}\n" 使用

不,您甚至可以在第一步使用命令,该命令将为您准备所需的文件树,并且您拥有它:阅读hg help archive

提示

  1. 您可以标记每个通过的测试和部署的变更集,以便以后获得此信息。您真的可以使用任何格式的标签(因为无论使用什么名称,最新标签总是可以检测为“最新”),我建议选择模式,这将产生唯一的 ID(只是在处理过程中不那么令人头疼),但您可以有类似的东西hg tag -f DEPLOY(-f 用于重新使用标签的现有名称,不是最好的样式,但可能)

  2. 通过在最后一步为任何标签模式成功部署(而不是构建)添加标签,您始终可以拥有一组更改集以在下次部署:它的范围从最新标签到提示。这将是

    -r "last(tag()):tip"

  3. 毕竟,你有命令,它构建要部署的文件树,比如

    hg archive "-Iset:status('last(tag())', 'tip', added() or modified())" -X .hgtags -rtip -tfiles "PATH/TO/ROOT/OF/TREE"

(注意:set构造定义变更集范围内的所有文件, readhg help filesetslast(tag()), tip我们从上面 p.2 开始的范围,added() or modified()定义必须添加哪些类型来设置:所有更改,-X .hgtags从存档文件 hgtags 中排除,自上次标记修订以来修改,但现场不需要)

  1. 您仍然有一个未解决的问题:如果您在工作目录中有文件,在开发过程中被删除,您也以某种方式在 prod-server 上将其删除(hg archive无法处理)
  2. 由于第 3-4 页,我建议考虑“简单的部署方式”:您可以(?)在站点端克隆存储库,使用工作目录作为站点根目录,在这个用例中将新版本部署到站点将非常容易,因为

ssh $SERVER

cd $SIE-ROOT$

hg up


推荐阅读