在部署期间将git版本号插入文件中

时间:2012-10-13 19:59:21

标签: git fabric

我认为我应该做的事情应该相当简单,但我似乎无法弄清楚如何让它发挥作用。

我想在html和javascript文件中嵌入一个唯一的版本号,原因有两个。第一个原因是我想确保在加载javascript文件时,如果有新版本,系统不会尝试使用缓存,但如果我可以使用

之类的东西调用它
 <script src="/app.js?v1.0.1-1-95425234"></script>

我几乎肯定能确保这种情况永远不会发生。第二个原因是我的远程错误记录,最好知道哪个版本的系统有错误,这样我就可以适当地修复它,但不必在每次部署时手动更新这个版本号。

我一路上遇到git describe,我认为它的输出值非常适合这个。

基本上我想在我的javascript和html文件中输入密钥,例如GIT-CURRENT-VERSION,并将其替换为git describe的输出

我在部署方法中使用了fabric,所以在我们抓住最新版本的git之后,这在服务器端会很有意义。

我怀疑sedgrep的某些组合可以解决这个问题,如果我能找到一个内容,那么添加到我的部署脚本会非常容易。< / p>

提前致谢!

3 个答案:

答案 0 :(得分:9)

我从未听说过fabric,但如果结构使用(或调用)git archive,那么您可以使用gitattributes。也就是说,您可以使用以下内容来创建HTML文件:

<script src="/app.js?$Format:%H$"></script>

在存储库顶部的.gitattributes中:

*.html    export-subst

然后,每当您使用git-archive创建存档时,$Format:%H$将被提交的哈希替换。您可以使用--pretty-format中的git-log提供的任何内容。

查看gitattributes或更好的手册: 8.2 Customizing Git - Git Attributes Pro Git一章以获取更多信息想法。

答案 1 :(得分:5)

您可以从已部署的git树的根目录执行以下操作:

export VERSION="$(git describe)"
find . -type f -print0 | xargs -0 sed -i "s/GIT-CURRENT-VERSION/$VERSION/g"

(这只是粗略的测试 - 谨慎使用。)

请注意,这将使您的树进行本地修改。

答案 2 :(得分:1)

沿着guettli的评论,我想我发布了我的最终结果。这是我的解决方案,基于Mark Longair的上述解决方案。

export DESCRIPTION="$(git describe)"
find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0 | xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g"

我会对我在这里做的事情做一点解释。

export DESCRIPTION="$(git describe)"获取git存储库当前状态的当前描述。有关详细信息,请查看git describe Manual Page

接下来,find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0您可以使用您的存储库路径替换[PATH]-regextype posix-extended -regex ".*\.(js|html)"通过您的目录下降并找到与".*\.(js|html)"定义的正则表达式匹配的所有文件。就我而言,我知道我只想在javascript或html文件中进行替换。最后xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g"告诉系统将CURRENT-GIT-DESCRIPTION替换为上面git describe定义的值。

在我的情况下,这非常有效,因为我使用fabric来部署到服务器,并且因为我希望实时发生更改,我所做的是更新存储库,然后复制它进入了系统的新部署。一旦系统准备就绪,我就摆脱了git数据文件,将其作为常规数据结构。现在我可以告诉系统使用新的构建,一切都准备好了。

希望能帮助其他人寻求类似的东西!