Il runtime Ruby

Il runtime Ruby è lo stack software responsabile dell'installazione del codice e delle dipendenze dell'applicazione, nonché dell'esecuzione dell'applicazione nell'ambiente flessibile.

Versioni Ruby

Ruby 3.3 utilizza buildpack. Per l'elenco completo delle versioni di Ruby supportate e della relativa versione di Ubuntu, consulta la pianificazione del supporto del runtime.

Per utilizzare una versione di Ruby supportata, devi:

  • Specifica una versione di Ruby in Gemfile.

    RUBY VERSION
      ruby 3.3.x
    
  • Installa la versione 420.0.0 o successive di gcloud CLI. Puoi aggiornare gli strumenti CLI 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"
    
  • Se vuoi, 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 l'ambiente di runtime Ruby versione 3.1 e precedenti, specifica una versione dell'interprete Ruby utilizzando un file .ruby-version nella directory dell'applicazione.

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

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

Supporto di altri runtime Ruby

Se devi utilizzare una versione di Ruby non supportata, puoi creare un runtime personalizzato e selezionare un'immagine di base valida con la versione di Ruby di cui hai bisogno.

Per le immagini di base fornite da Google o per le immagini di base Docker Ruby, consulta Creare runtime personalizzati.

Dipendenze

Il runtime cerca un file Gemfile nella directory di origine dell'applicazione e utilizza Bundler per installare eventuali dipendenze prima di avviare l'applicazione. Per ulteriori informazioni su come dichiarare e gestire i pacchetti, consulta Utilizzare le librerie Ruby.

Utilizzo delle librerie C con Ruby

Per le librerie Ruby che richiedono estensioni C, le intestazioni per la versione Ruby corrente e i seguenti pacchetti Ubuntu sono preinstallati nel 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ù diffuse. Se la tua applicazione richiede dipendenze aggiuntive a livello di sistema operativo, dovrai utilizzare un runtime personalizzato basato su questo runtime per installare i pacchetti appropriati.

Avvio dell'applicazione

Il runtime avvia l'applicazione utilizzando il entrypoint definito in app.yaml. Il punto di contatto deve avviare un processo che 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 Thin.

Devi aggiungere il server come dipendenza nel file di configurazione Gemfile della tua applicazione. Il runtime installerà tutte le dipendenze prima che venga chiamato il punto di contatto.

source "https://rubygems.org"

gem "rack"
gem "puma"

Un esempio di punto di contatto 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 che possono gestire le richieste senza un server Rack, puoi semplicemente eseguire uno script Ruby:

entrypoint: bundle exec ruby app.rb

Variabili di ambiente

Le seguenti variabili di ambiente vengono impostate dall'ambiente di runtime:

Variabile di ambiente Descrizione
GAE_INSTANCE Il nome dell'istanza corrente.
GAE_MEMORY_MB La quantità di memoria disponibile per la procedura di richiesta.
GAE_SERVICE Il nome del servizio specificato nel file app.yaml dell'applicazione oppure, se non è specificato alcun nome del 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 nella console Google Cloud
PORT La porta che riceverà le richieste HTTP.
RACK_ENV Impostato su production.
RAILS_ENV Impostato su production.
RAILS_SERVE_STATIC_FILES Impostato su true.

Puoi impostare altre variabili di ambiente con app.yaml.

Server dei metadati

Ogni istanza dell'applicazione può utilizzare il server di metadati di Compute Engine per eseguire query sulle informazioni relative all'istanza, tra cui il nome host, l'indirizzo IP esterno, l'ID istanza, i metadati personalizzati e i dati dell'account di servizio. App Engine non ti consente di impostare metadati personalizzati per ogni istanza, ma puoi impostare metadati personalizzati a livello di progetto e leggerli dalle istanze App Engine e Compute Engine.

Questa funzione di esempio utilizza il server di metadati per ottenere un indirizzo IP esterno di 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