Пробный экземпляр на Heroku

85

Я хотел бы иметь возможность отправлять код dev.myapp.comдля тестирования, а затем www.myapp.comдля производственного использования. Возможно ли это с Heroku?

Том Леман
источник

Ответы:

142

Ваш интерфейс к Heroku, по сути, является веткой Git. Гем Heroku выполняет некоторую работу через свой API, но в вашем репозитории Git это просто новая удаленная ветка.

heroku create yourapp # production
git br -D heroku # delete the default branch

heroku create staging-yourapp # staging
git br -D heroku # delete the default branch

После того, как вы настроите несколько приложений на Heroku, вы сможете настроить свой репозиторий Git следующим образом:

git remote add staging git@heroku.com:staging-yourapp.git
git push origin staging

git remote add production git@heroku.com:yourapp.git
git push origin production

Обычно я работаю в «рабочей» ветке и использую Github в качестве своего мастера.

Предполагая, что это так, ваш рабочий процесс развертывания, вероятно, будет выглядеть примерно так:

git co -b working
# do some work

# push to github:
git co master
git merge working
git push

# push to staging:
git co staging
git merge master
git push origin staging

# push to production
git co production
git merge master
git push origin production
Люк Байес
источник
Спасибо - это имеет смысл (я отстой в git). Вопрос: Предположим, я работаю над какими-то актуальными изменениями на «краю» ветки. Как я могу отправить эту ветку в staging-myapp, не затрагивая myapp (который в настоящее время работает в главной ветке)? Делает git push staging edge work?
Tom Lehman
Чтобы начать работу, вам нужно просто объединить край со своей промежуточной веткой и нажать на нее. Ваша производственная ветвь отделена и чиста. Вы всегда можете разветвить его и внести изменения, которые только сливаются туда.
Люк Байес,
5
Вместо того, чтобы создавать приложения с удаленной веткой «heroku» по умолчанию и после ее удаления, вы можете использовать гораздо более heroku create yourapp --remote your-remote
удобное
2
После того, как вы это настроите, все ваши herokuкоманды должны включать --app stagingили --app production. Есть ли способ установить значение по умолчанию? (Вопрос в качестве комментария b / c кажется слишком целенаправленным, чтобы быть полноценным SO-вопросом.)
Пол А. Юнгвирт
3
@PaulAJungwirth Чтобы установить приложение Heroku по умолчанию, используйте что-то вроде «git config heroku.remote staging». Подробнее в документации Heroku на странице devcenter.heroku.com/articles/multiple-environments .
grifaton 03
10

Ключевой частью исходного вопроса является привязка промежуточного приложения к поддомену (dev.myapp.com) основного приложения (www.myapp.com). Об этом не говорится ни в одном из ответов.

Шаг 1. Настройте производственную ('myapp') и промежуточную ('staging-myapp') версии вашего приложения, как указано в ответе Люка Байеса.

Шаг 2. В системе управления доменом (например, GoDaddy):

Create a CNAME record:  dev.myapp.com 
that points to:   proxy.heroku.com

Шаг 3. Настройте Heroku для маршрутизации dev.myapp.com на staging-myapp:

heroku domains:add dev.myapp.com --app staging-myapp

После того, как запись CNAME успеет распространиться, вы сможете запустить свое промежуточное приложение на dev.myapp.com.

Дон Литэм
источник
1
как насчет контроля доступа, чтобы он не отображался в Google и т. д., и люди не натыкались на него и не думали, что это настоящая вещь? какие-нибудь хорошие решения?
brittohalloran
Да, самый простой способ - пропустить шаг GoDaddy и получить доступ к «dev»-версии вашего приложения непосредственно из домена Heroku, используя URL-адрес Heroku. (например, stormy-lake-5483.heroku.com. ) Однако, если вы хотите, чтобы "dev" находился вне вашего домена, как описано здесь, вы всегда можете установить файл robots.txt, чтобы сообщить google, bing, et. al. чтобы не индексировать ваш сайт разработчиков. Это поможет сохранить его подальше от поисковых систем.
Дон Литэм
Я закончил тем, что добавил к себе before_filterловушку, чтобы application_controllerпоймать ВСЕ на постановке и заставить пользователя войти в систему как администратор, а затем установить файл cookie администратора, чтобы я мог видеть приложение с точки зрения «неадминистратора». Работает неплохо для меня.
brittohalloran
8

Вы должны проверить heroku_san

Он неплохо справляется с жонглированием окружением на героку.

Jlfenaux
источник
7

Теперь все проще. Вот как вы это делаете ...

Создайте приложение для каждой среды

$ heroku create myapp --remote production
$ heroku create myapp-staging --remote staging

Это создаст именованные удаленные репозитории для каждого приложения, которые вы можете увидеть в .git/config.

Теперь вы можете использовать переключатели --app или --remote для нацеливания на конкретное приложение:

$ heroku info --app myapp-staging
$ heroku info --remote staging

Установить среду Rails

Для приложений Rails Heroku по умолчанию использует «производственную» среду . Если вы хотите, чтобы ваше промежуточное приложение запускалось в промежуточной среде, создайте среду в своем проекте и установите соответствующие переменные среды RAILS_ENV и RAKE_ENV в приложении:

$ heroku config:set RACK_ENV=staging RAILS_ENV=staging --remote staging

Настроить среду

Если у вас есть другие переменные конфигурации, вам также необходимо передать их для каждой среды.

$ heroku config:set AWS_KEY=abc --remote staging
$ heroku config:set AWD_SECRET=123 --remote staging
...etc

Это огромная боль, поэтому я просто использую свой гем snappconfig и запускаю

$ rake heroku:config:load[myapp-staging]

чтобы загрузить файлы конфигурации YAML моего проекта в Heroku.

Развернуть

Теперь вы просто нажимаете на Heroku вот так:

$ git push staging master
$ git push production master

и выполните миграцию следующим образом:

$ heroku run rake db:migrate --remote staging
$ heroku run rake db:migrate --remote production

(См. Раздел Управление несколькими средами для приложения | Центр разработки Heroku для получения дополнительной информации и ярлыков.)

Ярин
источник
Установка RAILS_ENVи RACK_ENVк stagingобескураживает Heroku: «Это может быть заманчивым , чтобы создать другую пользовательскую среду , такие как„постановка“и создать конфиг / сред / staging.rb и развернуть в приложение Heroku с RAILS_ENV = стадирования Это не является хорошей практикой. . Вместо этого мы рекомендуем всегда работать в производственном режиме и изменять любое поведение, задав переменные конфигурации. " Подробнее об этом здесь: devcenter.heroku.com/articles/…
Коэн.
@ Koen: По моему опыту, попытки управлять сложными конфигурациями Rails без контекста сред совершенно непрактичны, будь то на Heroku или в других случаях. Если у вас есть полный набор строк подключения, ключей API и т. Д. Для вашего промежуточного приложения и еще один для вашего производственного приложения, вы действительно собираетесь устанавливать эти переменные конфигурации индивидуально для каждого? Это просто напрашивается на проблемы - здесь Heroku дает плохой совет.
Ярин
Спасибо. Я ищу постановку, которая действительно получает реальный URL, возможно, с commithash. Я думаю, что Zeit Now или Netlify упростили эту задачу.
Polv