【问题标题】:Clone a repository during deployment on Heroku在 Heroku 上部署期间克隆存储库
【发布时间】:2018-02-18 22:52:41
【问题描述】:

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

  1. 克隆 PROJECTX 配置,
  2. 删除当前配置文件,并
  3. 将配置文件符号链接到 PROJECTX 配置文件

请注意,这必须在 Heroku 上完成。我也知道 Heroku 可以选择使用环境变量来维护配置,但这不是我想要的。

谢谢!

【问题讨论】:

  • 否 - 改用环境变量。 Heroku 有一个临时文件系统,因此您无法符号链接到其他存储库。
  • @max 我不能对所有配置使用环境变量。另外我认为应用程序配置不应该出现在环境变量中,因为维护而不是维护文件很乏味。

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


【解决方案1】:

不,不可能。

每个 dyno 都有自己的临时文件系统,带有一个新的副本 最近部署的代码。在测功机的生命周期中,它的运行 进程可以将文件系统用作临时暂存器,但不能 写入的文件对任何其他测功机中的进程可见,并且 dyno 停止或 重新启动。例如,任何时候更换测功机时都会发生这种情况,因为 应用程序部署和大约每天一次作为正常的一部分 测功机管理。
- 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 变量中的内容。您只需要在 ENV 中存储 API 密钥等机密。

其他非秘密配置,例如您对各种 gem 的设置,可以而且应该在 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。

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多