将 Rails 应用程序放在公共 git 中,保持私人详细信息的私密性

jro*_*ind 5 git ruby-on-rails github

我有一个 Rails 应用程序,它并不是真正的“可共享”应用程序,但我仍然想将其放在公共 git(hub) 存储库中。为什么?嗯,主要是因为我实际上想与在我的领域工作的其他感兴趣的人分享代码。免费的 github 存储库并没有什么坏处,但如果我实际上也不想共享代码,我当然会付费。

基本背景

因此,问题在于将“私密”详细信息保留在 git 存储库之外。什么是私人详细信息?嗯,Rails 在隔离它们方面做得非常好。有时它们是单独的文件,例如 ./config/database.yml,或一些其他特定于应用程序的(不是默认的 Rails)./config/x 文件。在其他情况下,遗憾的是,在其他所需的可共享文件中可能存在单行,但不确定这一点。

我现在要问的实际上并不是帮助找到 Rails3 应用程序中所有“私有”的地方。不,这只是基本问题的一些背景。

管理私人物品的简单方法

我实际上要求的是建议使用某种机制将私有内容保留在“其他地方”并将其合并到从公共 git 存储库中签出的应用程序中。

我知道基本的想法是“好吧,将它们保存在您选择的其他地方,然后将它们复制进去。” 但是,是的,在哪里?(另一个私有 git 存储库?共享文件系统?),以及如何管理“复制”?ruby/rails 人们喜欢自动化事物和自动化最佳实践,我认为必须有一个工具来实现这一点,或者至少有人对最佳实践有一些建议?

我想要的是

  • 它必须非常简单。如此简单,我可以为假设的几乎没有能力的同事留下说明,包括部署应用程序(将公共存储库与私有数据相结合),以及更改/添加/提交“私有数据”。

  • 它应该覆盖“私有数据”的整个文件,理想情况下还应该覆盖其他公共文件中的单行,尽管这可能不是必需的,但理想的工具/流程可以做到这一点。

  • 应用程序将在多个主机上部署/签出/设置,并且应该很容易在全新的主机上签出它,而无需在该主机上进行任何特殊设置。同样,对于任何主机帐户。与普通的 git checkout 一样,在这种情况下不是问题,对吗?

  • 快照/依赖管理。这是一个可能必须牺牲的东西,但那就太好了。私人配置有时会改变,对吧?通过普通的“单一 git 存储库”设置,您的私人数据将与所有其余代码一起进行快照和管理。很容易看出哪个版本的“私有数据”配置与其余代码的哪个版本相匹配,因为它是自动的——您对特定快照进行 git checkout,然后您就可以得到所有的状态代码包括该快照中的私有数据。最好通过“私有数据位于单独的位置”计划来保留此功能,因此仍然可以知道私有数据的版本与 git 快照到底是什么......但这可能不可行。** 这个要求首先让我想到“哦,只需使用 git 子模块,私有 git 存储库中的私有数据,公共 git 存储库通过 git 子模块链接到它。” 如果“私有数据”是单个目录(该目录的整个目录,并且只有该目录),那么这是可行的,但我不确定 Rails 应用程序是否属于这种情况。理想情况下,某些./config 可以共享,而私有数据可能位于其他地方。但我认为一种选择是确保所有私有数据都在“配置”中,并将所有配置保留为“私有”,即使您实际上并不需要这样做。如果有更好的解决方案,这并不理想,但我认为这是一种方法。

所以?

有任何想法吗?是否已经存在这方面的工具?那些都好?或者,如果不是工具,那么有关方法或最佳实践的建议?(如果我能找到一种优雅而强大的杀手级方法来做到这一点,我可能会编写一个工具来自动化它。现在,我什至仍然不确定“正确”的方法是什么。 )

小智 1

  • 将所有“私有”单行代码重构为 config/secrets.yml 中定义的常量,并将所有“秘密”文件重构为 config/secrets/ 中。将它们打包成 tar 球并私下分发给您的合作者。要对这些机密进行版本控制,请将 tar 球的 md5sum 保存在版本化文件中,例如 config/secrets.tar.md5。仅当 md5sum 与版本化的 md5sum 匹配时,编写一个 rake 任务,将 tar 球扩展到您的应用程序上。
  • 您可以使用对称密钥加密每个秘密文件,然后仅分发密钥,但这会将您的秘密公开(尽管以加密形式),并且依赖于每个人都正确使用 GPG 之类的东西。
  • 在第一种情况下,使用秘密部署应用程序就像将 tar 球移动到正确的位置并运行 rake 任务一样简单。
  • 您可以将 md5sum 包含在 tar 球的文件名中,这意味着从存储库中的 Secrets.tar.md5 版本中,您可以识别与该版本关联的特定机密 tar。