Il runtime Ruby

Il runtime Ruby è lo stack software responsabile installando il codice e le dipendenze dell'applicazione per poi eseguirle dell'applicazione nell'ambiente flessibile.

Versioni Ruby

Ruby 3.3 (anteprima) utilizza buildpacks. Per l'elenco completo delle Versioni Ruby e Ubuntu corrispondente la versione più recente, consulta la pianificazione del supporto del runtime.

Per utilizzare una versione Ruby supportata, devi:

  • Specifica una versione Ruby nel tuo Gemfile.

    RUBY VERSION
      ruby 3.3.x
    
  • Installa gcloud CLI versione 420.0.0 o successiva. Puoi aggiornare gli strumenti dell'interfaccia a riga di comando eseguendo il comando gcloud components update. Per visualizzare la versione installata, puoi eseguire il comando gcloud version.

  • Specifica l'impostazione operating_system nel file app.yaml:

      runtime: ruby
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
    
  • Facoltativamente, puoi specificare una versione dell'interprete Ruby utilizzando un file .ruby-version nella directory dell'applicazione. Ad esempio, 3.3.x

Versioni precedenti

Per utilizzare la versione 3.1 e precedenti del runtime Ruby, specifica una versione del un interprete usando un file .ruby-version nella directory dell'applicazione.

Se è presente questo file, il runtime installa la versione richiesta di Ruby quando esegui il deployment dell'applicazione rbenv. Se non è possibile installare la versione richiesta, App Engine mostra un errore durante il deployment.

Se non fornisci un file .ruby-version, per impostazione predefinita il runtime Ruby sarà Versione 2.7. Tieni presente che l'impostazione predefinita può cambiare in qualsiasi momento, quindi è consigliabile che la tua app specifichi una versione Ruby.

Supporto per altri runtime Ruby

Se devi utilizzare una versione Ruby non supportata, puoi creare una runtime personalizzato e seleziona un'immagine di base valida con la versione Ruby che ti serve.

Per le immagini di base fornite da Google Immagini di base Docker di Docker, consulta la sezione Creazione di runtime personalizzati.

Dipendenze

Il runtime cerca un elemento Gemfile nella directory di origine dell'applicazione e utilizza Bundler per installare le eventuali dipendenze prima di avviare l'applicazione. Per ulteriori informazioni per la dichiarazione e la gestione dei pacchetti, vedi Utilizzo delle librerie Ruby.

Utilizzo delle librerie C con Ruby

Per le librerie Ruby che richiedono estensioni C, le intestazioni per la versione Ruby attuale e le seguenti I pacchetti Ubuntu sono preinstallati sul sistema.

  • autoconf
  • build-essential
  • ca-certificates
  • cmake
  • curl
  • file
  • git
  • imagemagick
  • libcurl3
  • libcurl3-gnutls
  • libcurl4-openssl-dev
  • libffi-dev
  • libgdbm-dev
  • libgit2-dev
  • libgmp-dev
  • libicu-dev
  • libjemalloc-dev
  • libjemalloc1
  • libmagickwand-dev
  • libmysqlclient-dev
  • libncurses5-dev
  • libpq-dev
  • libqdbm-dev
  • libreadline6-dev
  • libsqlite3-dev
  • libssl-dev
  • libxml2-dev
  • libxslt-dev
  • libyaml-dev
  • libz-dev
  • systemtap
  • tzdata

Questi pacchetti consentono l'installazione delle librerie Ruby più popolari. Se la tua applicazione richiede ulteriori dipendenze a livello di sistema operativo, runtime personalizzato basato su questo runtime per installare i pacchetti appropriati.

Avvio dell'applicazione

Il runtime avvia l'applicazione utilizzando il criterio entrypoint definito in app.yaml. Il punto di ingresso deve avviare un processo risponde alle richieste HTTP sulla porta definita dalla variabile di ambiente PORT. Ad esempio:

entrypoint: bundle exec rails server -p $PORT

La maggior parte delle applicazioni web utilizza un server web supportato da Rack come Puma, Unicorn o Sottile.

Devi aggiungere il server come dipendenza nell'elemento Gemfile dell'applicazione di configurazione del deployment. Il runtime installerà tutte le dipendenze prima viene chiamato il punto di ingresso.

source "https://rubygems.org"

gem "rack"
gem "puma"

Un esempio di punto di ingresso che utilizza puma per un'applicazione Rails:

entrypoint: bundle exec rails server Puma -p $PORT

Un esempio di punto di ingresso che utilizza puma per qualsiasi applicazione Rack:

entrypoint: bundle exec rackup -s Puma -p $PORT

Per le applicazioni in grado di gestire le richieste senza un server rack, è sufficiente eseguire uno script ruby:

entrypoint: bundle exec ruby app.rb

Variabili di ambiente

L'ambiente di runtime imposta le seguenti variabili di ambiente:

Variabile di ambiente Descrizione
GAE_INSTANCE Il nome dell'istanza attuale.
GAE_MEMORY_MB La quantità di memoria disponibile per il processo di richiesta.
GAE_SERVICE Il nome del servizio specificato nel campo app.yaml dell'applicazione o, se non viene specificato alcun nome di servizio, viene impostato su default.
GAE_VERSION L'etichetta della versione dell'applicazione corrente.
GOOGLE_CLOUD_PROJECT L'ID progetto associato alla tua applicazione, visibile in la console Google Cloud
PORT La porta che riceverà le richieste HTTP.
RACK_ENV Impostata su production.
RAILS_ENV Impostata su production.
RAILS_SERVE_STATIC_FILES Impostata su true.

Puoi impostare altre variabili di ambiente con app.yaml.

Server metadati

Ogni istanza dell'applicazione può utilizzare Server di metadati di Compute Engine per ottenere informazioni sull'istanza, tra cui nome host, Indirizzo IP, ID istanza, metadati personalizzati e informazioni sull'account di servizio. App Engine non consente di impostare metadati personalizzati per ogni istanza, ma puoi impostare metadati personalizzati a livello di progetto e leggerlo dalle tue istanze App Engine e Compute Engine.

Questa funzione di esempio utilizza il server di metadati per ottenere un indirizzo IP esterno di per eseguire un'istanza.

require "sinatra"
require "net/http"

get "/" do
  uri = URI.parse(
    "http://metadata.google.internal/computeMetadata/v1" +
    "/instance/network-interfaces/0/access-configs/0/external-ip"
  )

  request = Net::HTTP::Get.new uri.path
  request.add_field "Metadata-Flavor", "Google"

  http = Net::HTTP.new uri.host, uri.port

  response = http.request request

  "External IP: #{response.body}"
end