在Heroku上部署期间克隆存储库

时间:2017-09-10 16:46:54

标签: ruby-on-rails heroku heroku-toolbelt heroku-cli

我有一个Rails项目 PROJECTX ,它在Heroku上托管。为了存储生产配置和文件,我使用不同的存储库 PROJECTX-config 。有可能:

  1. 克隆PROJECTX-config,
  2. 删除当前配置文件,
  3. 符号链接配置文件到PROJECTX-config文件
  4. 请注意,这必须在Heroku上完成。另外我知道Heroku可以选择使用环境变量来维护配置,但这不是我想要的。

    谢谢!

1 个答案:

答案 0 :(得分:2)

不可能。

  

每个dyno都有自己的短暂文件系统,并带有新的副本   最近部署的代码。在dyno的一生中它的运行   进程可以使用文件系统作为临时暂存器,但没有   写入的文件对任何其他dyno和中的进程可见   写入的任何文件将在dyno停止时丢弃   重新启动。例如,每次更换dyno时都会发生这种情况   应用程序部署和大约每天一次作为正常的一部分   dyno management。
   - https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem

或者至少没有没有像setupe这样的Rube Goldberg机器,你设置某种自动化(如提交后挂钩)来合并repo A和repo B并将结果推送到heroku。

  

另外我认为应用配置不应该出现在环境变量中,因为维护而不是维护文件是很繁琐的。

Heroku在这里不同意。

  

处理此类配置变量的传统方法是放置它们   在源下 - 在某种属性文件中。这是个   容易出错的过程,对于开源来说尤其复杂   通常需要维护单独(和私有)分支的应用程序   特定于应用的配置   更好的解决方案是使用环境   变量,并保持密码不在代码中。在传统的主机或   在本地工作,您可以在bashrc文件中设置环境变量。上   Heroku,你使用配置变量。    - https://devcenter.heroku.com/articles/config-vars

虽然您可能高估了实际需要存储在ENV vars中的内容。您只需要在ENV中存储秘密,例如API密钥。

其他非秘密配置,您可以并且应该在config/initializers设置各种宝石的设置。

如果您仍然认为使用GUI非常糟糕,请使用您解析并用于设置ENV变量的YAML文件:

require 'yaml'

yaml = YAML.load_file(File.join(__dir__, 'conf.yml'))

def create_key(*components)
  components.join('_').upcase
end

env_vars = yaml["production"].each_with_object({}) do |(key,value), memo|
  key_components = [key]
  if value.kind_of? Hash
    value.each_pair do |k,v|
      memo[create_key(*key_components.dup.push(k))] = v
    end
  else
    memo[create_key(*key_components)] = value
  end
end.each do |k,v|
  system("heroku config:set #{k}=#{v}")
  puts "Setting #{k} = #{v}; #{ $? }"
end

或者您甚至可以将序列化表单(JSON或YAML)存储在单个env var中 - 但总大小限制为32kb。

相关问题