从shell脚本增量部署

时间:2010-06-18 16:09:05

标签: bash deployment mercurial

我有一个项目,我不得不使用ftp作为将文件部署到实时服务器的方法。 我正在使用linux进行开发,因此我将一个bash脚本整合在一起,该脚本可以备份ftp服务器的内容, 删除ftp上的所有文件,并从mercurial存储库上传所有新文件。 (并负责用户上传的文件和文件夹,并进行部署后的更改等)

它运行良好,但项目开始变得足够大,使部署过程太长。

我想修改脚本以查找已更改的文件,并仅部署修改后的文件。 (备份是好的atm)

我使用mercurial作为VCS,所以我的想法是以某种方式从它中的两个修订版之间请求更改的文件,迭代更改的文件, 并上传每个修改过的文件,并删除每个删除的文件。

我可以使用hg log -vr rev1:rev2,从输出中,我可以使用grep / sed / etc创建已更改的文件。

两个问题:

我听过解析ls输出导致精神错乱的恐怖故事,所以我的猜测是这同样适用于此, 如果我尝试解析hg log的输出,变量将进行分词和各种变换。

hg log没有告诉我文件被修改/添加/删除。区分已修改和已删除的文件将是最少的。

那么,这样做的正确方法是什么?我正在使用yafc作为ftp客户端,以防万一需要,但愿意切换。

1 个答案:

答案 0 :(得分:3)

您可以使用自定义样式为您解析。

hg log --rev rev1:rev2 --style mystyle

然后将其传递给sort -u以获取唯一的文件列表。文件“mystyle”看起来像这样:

changeset = '{file_mods}{file_adds}\n'
file_mod = '{file_mod}\n'
file_add = '{file_add}\n'

mods和添加模板是修改或添加的文件。已删除文件的file_delsfile_del模板类似。

或者,您可以使用hg status -ma --rev rev1-1:rev2在修改/添加文件之前添加 M A 。您需要传递一个不同的修订版本,比rev1少一个,因为它是自“基线”以来的状态。删除的文件类似 - 您需要-d标志,并在每个删除的文件之前添加 D