Jak*_*ith 12 git unit-testing pre-commit-hook
好吧,这就是场景:开发团队希望确保所有新代码都符合定义的编码标准,并且所有单元测试都在接受提交之前通过.这是诀窍,所有测试都需要在专用测试机器上运行,我们无权修改git服务器,因此必须使用每台开发机器上的本地提交挂钩来完成.
虽然规格非常严格(例如我们没有切换到Windows或颠覆),但这是一个现实问题,所以如果你有一个几乎适合的解决方案,那就有一些灵活性.
--no-verify选项绕过测试.问题:让测试服务器与本地环境同步以运行测试的最佳方法是什么?某种与新提交的git补丁的hash-to-hash匹配?完全跳过Git并做一个rsync吗?还有别的吗?
2013年7月7日更新:即使提到远程回购,我还是自己站了起来.关键是不要阻止代码被推送到共享/远程仓库,以防止本地提交发生.在这种情况下,这是否被认为是最佳实践并不是真正的重点,因为这是针对所有想要这些功能的小型开发团队所特有的.问题是关于实现目标的最佳方式.
oni*_*ake 12
本地提交挂钩绝对不是你想要的.
您的要求是"我们无权修改git服务器,因此必须使用每台开发机器上的本地提交挂钩",这完全是假的.您可以随时设置另一个您可以完全控制的"测试远程"存储库(然后将与您无法控制的git服务器同步).
设置此测试远程后,您可以添加挂钩以在任何推送上运行测试.git push test-remote my-branch为获得测试结果而打字的努力非常少.
还可以查看Jenkins,gitlab等...
2013年8月7日后更新:
所以你真的想在远程服务器上进行一些"测试"以防止提交.如果要根据提交本身的内容进行阻止,请使用pre-commit钩子.有关如何获取已更改文件的列表,请参阅此问题. 获得这些更改的文件后,可以使用scp或将它们运行到远程服务器rsync并运行测试命令ssh.
如果需要检查提交消息,请使用commit-msg钩子.
这是一个关于钩子的好教程:http://git-scm.com/book/en/Customizing-Git-Git-Hooks
它还提到了为什么它可能是一个坏主意的几个原因.
它们通常用于执行某些策略,但重要的是要注意这些脚本在克隆期间不会传输.您可以在服务器端强制执行策略以拒绝不符合某些策略的提交推送,但完全取决于开发人员在客户端使用这些脚本.因此,这些是帮助开发人员的脚本,它们必须由它们设置和维护,尽管它们可以随时被它们覆盖或修改.
eck*_*kes 12
简短回答:
答案很长:
由于一些奇怪的本地钩子而无法进行提交对我来说似乎很奇怪:你必须将提交(即保存更改)与发布此提交分开.
虽然pre-receive在git服务器上有一个钩子你提到强制执行你的规则是完全合理的,但对于你的开发者的回购来说这将是戏剧性的:每次他们想要保存他们的工作,尝试一些新的东西,他们会先在他们可以进行提交之前完善他们的代码.
这会适得其反:人们会觉得像在坏日子回来时,他们必须承诺什么的回购,每个人都可以看到他们的错误,坏的编码风格等等.您将失去DVCS为您提供的自由:廉价的分支,本地历史,同时维护生产代码的中央回购.
在执行本地提交时不要强制执行任何操作.
添加自定义 git 命令:
post-receive挂钩或ssh)创建一个名为的可执行文件git-test-n-commit并将其放在您的路径中:
#!/bin/bash
echo "Committing results..."
git commit "$@"
echo "Pushing to remote testing server..."
git push remote-server-git-url remote-branch -f
echo "Running tests"
ssh remote-server 'cd my_repo; run-my-tests' ||
(echo "Tests failed, undoing commit" && git reset HEAD^)
Run Code Online (Sandbox Code Playgroud)
然后git commit ARGS,开发人员可以调用,而不是调用git test-n-commit ARGS。如果测试通过,代码将保持提交状态。如果测试失败,就好像从未提交过一样。
| 归档时间: |
|
| 查看次数: |
9160 次 |
| 最近记录: |