Ruby on Rails
Distribuzione di un'app Rails su Heroku
Ricerca…
Distribuzione della tua applicazione
Assicurati di essere nella directory che contiene l'app Rails, quindi crea un'app su Heroku.
$ heroku create example
Creating ⬢ example... done
https://example.herokuapp.com/ | https://git.heroku.com/example.git
Il primo URL dell'output, http://example.herokuapp.com , è la posizione in cui è disponibile l'app. Il secondo URL, [email protected]: example.git, è l'URL del repository git remoto.
Questo comando dovrebbe essere utilizzato solo su un repository git inizializzato. Il comando heroku create aggiunge automaticamente un git remote chiamato "heroku" che punta a questo URL.
L'argomento del nome dell'app ("esempio") è facoltativo. Se non viene specificato alcun nome app, verrà generato un nome casuale. Poiché i nomi delle app di Heroku si trovano in uno spazio dei nomi globale, è possibile che vengano già utilizzati nomi comuni, come "blog" o "wiki". È spesso più facile iniziare con un nome predefinito e rinominare l'app in un secondo momento.
Quindi, distribuisci il tuo codice:
$ git push heroku master
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.3.1
remote: -----> Installing dependencies using bundler 1.11.2
remote: Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
remote: Warning: the running version of Bundler is older than the version that created the lockfile. We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
remote: Fetching gem metadata from https://rubygems.org/..........
remote: Fetching version metadata from https://rubygems.org/...
remote: Fetching dependency metadata from https://rubygems.org/..
remote: Installing concurrent-ruby 1.0.2
remote: Installing i18n 0.7.0
remote: Installing rake 11.2.2
remote: Installing minitest 5.9.0
remote: Installing thread_safe 0.3.5
remote: Installing builder 3.2.2
remote: Installing mini_portile2 2.1.0
remote: Installing erubis 2.7.0
remote: Installing pkg-config 1.1.7
remote: Installing rack 2.0.1
remote: Installing nio4r 1.2.1 with native extensions
remote: Installing websocket-extensions 0.1.2
remote: Installing mime-types-data 3.2016.0521
remote: Installing arel 7.0.0
remote: Installing coffee-script-source 1.10.0
remote: Installing execjs 2.7.0
remote: Installing method_source 0.8.2
remote: Installing thor 0.19.1
remote: Installing multi_json 1.12.1
remote: Installing puma 3.4.0 with native extensions
remote: Installing pg 0.18.4 with native extensions
remote: Using bundler 1.11.2
remote: Installing sass 3.4.22
remote: Installing tilt 2.0.5
remote: Installing turbolinks-source 5.0.0
remote: Installing tzinfo 1.2.2
remote: Installing nokogiri 1.6.8 with native extensions
remote: Installing rack-test 0.6.3
remote: Installing sprockets 3.6.3
remote: Installing websocket-driver 0.6.4 with native extensions
remote: Installing mime-types 3.1
remote: Installing coffee-script 2.4.1
remote: Installing uglifier 3.0.0
remote: Installing turbolinks 5.0.0
remote: Installing activesupport 5.0.0
remote: Installing mail 2.6.4
remote: Installing globalid 0.3.6
remote: Installing activemodel 5.0.0
remote: Installing jbuilder 2.5.0
remote: Installing activejob 5.0.0
remote: Installing activerecord 5.0.0
remote: Installing loofah 2.0.3
remote: Installing rails-dom-testing 2.0.1
remote: Installing rails-html-sanitizer 1.0.3
remote: Installing actionview 5.0.0
remote: Installing actionpack 5.0.0
remote: Installing actionmailer 5.0.0
remote: Installing railties 5.0.0
remote: Installing actioncable 5.0.0
remote: Installing sprockets-rails 3.1.1
remote: Installing coffee-rails 4.2.1
remote: Installing jquery-rails 4.1.1
remote: Installing rails 5.0.0
remote: Installing sass-rails 5.0.5
remote: Bundle complete! 15 Gemfile dependencies, 54 gems now installed.
remote: Gems in the groups development and test were not installed.
remote: Bundled gems are installed into ./vendor/bundle.
remote: Bundle completed (31.86s)
remote: Cleaning up the bundler cache.
remote: Warning: the running version of Bundler is older than the version that created the lockfile. We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
remote: -----> Preparing app for Rails asset pipeline
remote: Running: rake assets:precompile
remote: I, [2016-07-08T17:08:57.046245 #1222] INFO -- : Writing /tmp/build_49ba6c877f5502cd4029406e981f90b4/public/assets/application-1bf5315c71171ad5f9cbef00193d56b7e45263ddc64caf676ce988cfbb6570bd.js
remote: I, [2016-07-08T17:08:57.046951 #1222] INFO -- : Writing /tmp/build_49ba6c877f5502cd4029406e981f90b4/public/assets/application-1bf5315c71171ad5f9cbef00193d56b7e45263ddc64caf676ce988cfbb6570bd.js.gz
remote: I, [2016-07-08T17:08:57.060208 #1222] INFO -- : Writing /tmp/build_49ba6c877f5502cd4029406e981f90b4/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css
remote: I, [2016-07-08T17:08:57.060656 #1222] INFO -- : Writing /tmp/build_49ba6c877f5502cd4029406e981f90b4/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css.gz
remote: Asset precompilation completed (4.06s)
remote: Cleaning assets
remote: Running: rake assets:clean
remote:
remote: ###### WARNING:
remote: No Procfile detected, using the default web server.
remote: We recommend explicitly declaring how to boot your server process via a Procfile.
remote: https://devcenter.heroku.com/articles/ruby-default-web-server
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> (none)
remote: Default types for buildpack -> console, rake, web, worker
remote:
remote: -----> Compressing...
remote: Done: 29.2M
remote: -----> Launching...
remote: Released v5
remote: https://example.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/example.git
* [new branch] master -> master
Se si utilizza il database nell'applicazione, è necessario migrare manualmente il database eseguendo:
$ heroku run rake db:migrate
Qualsiasi comando dopo la heroku run
verrà eseguito su un dyno Heroku. È possibile ottenere una sessione shell interattiva eseguendo:
$ heroku run bash
Assicurati di avere un banco prova con il tipo di processo Web:
$ heroku ps:scale web=1
Il comando heroku ps elenca i dynos in esecuzione della tua applicazione:
$ heroku ps
=== web (Standard-1X): bin/rails server -p $PORT -e $RAILS_ENV (1)
web.1: starting 2016/07/08 12:09:06 -0500 (~ 2s ago)
Ora puoi visitare l'app nel nostro browser con heroku open
.
$ heroku open
Heroku ti fornisce un URL Web predefinito nel dominio herokuapp.com
. Quando sei pronto per aumentare la produzione, puoi aggiungere il tuo dominio personalizzato.
Gestione degli ambienti di produzione e di staging per un Heroku
Ogni app di Heroku funziona in almeno due ambienti: su Heroku (chiameremo quella produzione) e sulla tua macchina locale (sviluppo). Se più di una persona sta lavorando sull'app, allora hai più ambienti di sviluppo, uno per macchina, di solito. Di solito, ogni sviluppatore avrà anche un ambiente di test per eseguire test. Sfortunatamente, questo approccio si rompe quando gli ambienti diventano meno simili. Windows e Mac, ad esempio, forniscono entrambi ambienti diversi rispetto allo stack Linux su Heroku, quindi non si può essere sempre sicuri che il codice che funziona nell'ambiente di sviluppo locale funzioni allo stesso modo quando lo si distribuisce in produzione.
La soluzione è avere un ambiente di staging che sia il più simile alla produzione possibile. Questo può essere ottenuto creando una seconda applicazione Heroku che ospita la tua applicazione di staging. Con la messa in scena, è possibile controllare il codice in un'impostazione di tipo produzione prima di averlo influenzato sugli utenti effettivi.
Partendo da zero
Supponiamo che tu abbia un'applicazione in esecuzione sul tuo computer locale e sei pronto per inviarla a Heroku. Dovremo creare ambienti remoti, allestimenti e produzione. Per prendere l'abitudine di spingere per la prima messa in scena, inizieremo con questo:
$ heroku create --remote staging
Creating strong-river-216.... done
http://strong-river-216.heroku.com/ | https://git.heroku.com/strong-river-216.git
Git remote staging added
Per impostazione predefinita, la CLI heroku crea progetti con un heroku git remote. Qui, stiamo specificando un nome diverso con il flag --remote, quindi spingendo il codice su Heroku e eseguendo i comandi contro l'app sembra un po 'diverso dal normale guru di push her goku:
$ git push staging master
...
$ heroku ps --remote staging
=== web: `bundle exec puma -C config/puma.rb``
web.1: up for 21s
Una volta che l'app di gestione temporanea è stata installata correttamente, puoi creare la tua app di produzione:
$ heroku create --remote production
Creating fierce-ice-327.... done
http://fierce-ice-327.heroku.com/ | https://git.heroku.com/fierce-ice-327.git
Git remote production added
$ git push production master
...
$ heroku ps --remote production
=== web: `bundle exec puma -C config/puma.rb
web.1: up for 16s
E con questo, hai la stessa base di codice in esecuzione come due app di Heroku separate: una di scena e una di produzione, configurate in modo identico. Ricorda che dovrai specificare quale app utilizzerai per il tuo lavoro quotidiano. Puoi usare flag '--remote' o usare git config per specificare un'app predefinita.