Задайте имя хоста в качестве переменной среды в приложении для проверки Heroku

Я использую функцию Review Apps, интегрированную с Github на Heroku. В одном из моих приложений я установил переменную среды HOST_NAME. Например, если сайт http://www.purplebinder.com, то HOST_NAME будет установлен в www.purplebinder.com. Он используется в нескольких местах, где мы работаем с файлами cookie и в наших транзакционных письмах.

Когда я открываю новый запрос на растяжение и разворачиваю приложение для обзора, HOST_NAME должен быть чем-то вроде purplebinder-pr-27.herokuapp.com.

Есть ли способ установить это значение автоматически? Документация Heroku на обзорные приложения говорит, что env var может наследовать значение из родительского приложения или быть жестко запрограммированным в app.json. Ни один из этих подходов не работает здесь, потому что значение должно быть разным каждый раз, а также отличается от родительского приложения.

Heroku также говорит, что env var можно установить "через генератор", но не вдаваясь в подробности о том, что это такое.

Этот вопрос может быть дубликатом Настройка ROOT_URL для приложений для просмотра, но никто не ответил на этот вопрос. Он также похож на Как получить имя приложения Heroku из приложения, но ответы там включали запуск script после того, как приложение было создано - здесь я бы хотел чтобы установить это значение как часть начальной сборки.

Ответ 1

Из https://devcenter.heroku.com/articles/github-integration-review-apps#heroku_app_name-and-heroku_parent_app_name:

Чтобы помочь в создании сценариев, доступны два специальных конфига. просмотрите приложения. Если вы укажете HEROKU_APP_NAME или HEROKU_PARENT_APP_NAMEв соответствии с требованиями или необязательными конфигурационными vars в вашем файле app.json, Heroku будет установите эти конфиги для нового имени приложения и родителя имя приложения соответственно. Затем они будут доступны для использования в postdeploy script, чтобы вы могли выполнять более продвинутую загрузку и конфигурации.

Вот пример файла app.json, который использует HEROKU_APP_NAME и HEROKU_PARENT_APP_NAME:

{
    "name":"Advanced App",
    "scripts": {
        "postdeploy": "rake db:setup && bin/bootstrap"
    },
    "env": {
        "HEROKU_APP_NAME": {
            "required": true
        },
        "HEROKU_PARENT_APP_NAME": {
            "required": true
        }
    }
}

Ответ 2

Если вы добавите heroku-buildpack-cli к своему родительскому приложению, тогда он позволяет вам устанавливать переменные среды из post-deploy script. Команда должна выглядеть примерно так:

heroku config:set HOST_NAME=${HEROKU_APP_NAME}.herokuapp.com --app ${HEROKU_APP_NAME}

Ответ 3

Здесь используется подход, игнорирующий app.json для установок Rails:

в относительном config/<environment>.rb. Я лично использую production.rb и размещаю только ссылки на него.

if ENV.fetch("HEROKU_APP_NAME", "").include?("staging-pr-")
  ENV["APPLICATION_HOST"] = ENV["HEROKU_APP_NAME"] + ".herokuapp.com"
  ENV["ASSET_HOST"] = "https://" + ENV["APPLICATION_HOST"]
  config.action_mailer.default_url_options = { host: ENV.fetch("APPLICATION_HOST") }
end
...

Это немного вводит в заблуждение, поскольку переменные среды heroku по-прежнему будут иметь старые переменные, но они работают.

Ответ 4

Вы также можете создать среду review для копирования приложения staging.rb или production.rb из config/environments. Это было бы полезно.

После добавления HEROKU_APP_NAME и HEROKU_PARENT_APP_NAME к вашему app.json, вы можете легко установить:

config.action_mailer.default_url_options = { host: "#{ENV['HEROKU_APP_NAME']}.herokuapp.com" }
config.action_mailer.asset_host = "http://#{ENV['HEROKU_APP_NAME']}.herokuapp.com"
config.action_controller.asset_host = "#{ENV['HEROKU_APP_NAME']}.herokuapp.com"
config.action_cable.url = "wss://#{ENV['HEROKU_APP_NAME']}.herokuapp.com/cable"