Il runtime Ruby

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

  • La versione 3.2 è creata utilizzando buildpacks, che richiede di scegliere un sistema operativo nel file app.yaml. Ad esempio, per utilizzare Ruby 3.2, devi specificare Ubuntu 22 come sistema operativo.

  • Le versioni 3.1 e precedenti sono state create utilizzando Docker.

Per l'elenco completo delle versioni di Ruby supportate e le versioni di Ubuntu corrispondenti, consulta la pianificazione del supporto per l'esecuzione.

Interprete

Nuove versioni di runtime

Per la versione 3.2, devi includere le impostazioni runtime_config e operating_system nel file app.yaml per specificare un sistema operativo.

Per utilizzare Ruby 3.2, devi:

  • Specifica una versione Ruby in Gemfile.

    RUBY VERSION
      ruby 3.2.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"
    

Se vuoi, puoi specificare una versione dell'interprete Ruby utilizzando un file .ruby-version nella directory dell'applicazione. Ad esempio:

3.2.2

Versioni precedenti

Per il runtime Ruby 3.1 e versioni 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, per impostazione predefinita il runtime Ruby è 2.7. Tieni presente che il valore predefinito può cambiare in qualsiasi momento, perciò è consigliabile che per la tua app sia specificata una versione Ruby.

Dipendenze

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

Utilizzo delle librerie C con Ruby

Per le librerie Ruby che richiedono estensioni C, le intestazioni della versione attuale di Ruby 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 a livello di sistema operativo aggiuntive, dovrai utilizzare un 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 in risposta 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 dell'applicazione. Il runtime installerà tutte le dipendenze prima della chiamata del punto di ingresso.

source "https://rubygems.org"

gem "rack"
gem "puma"

Ecco un esempio di punto di ingresso in cui viene utilizzato puma per un'applicazione Rails:

entrypoint: bundle exec rails server Puma -p $PORT

Ecco un esempio di punto di ingresso in cui viene utilizzato 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

Estendere il runtime

Puoi utilizzare runtime personalizzati per aggiungere ulteriori funzionalità a un'app Ruby in esecuzione nell'ambiente flessibile di App Engine. Per configurare un runtime personalizzato, sostituisci la seguente riga nel file app.yaml:

runtime: ruby

con questa riga:

runtime: custom

Devi anche aggiungere i file Dockerfile e .dockerignore nella stessa directory che contiene il file app.yaml.

Consulta la documentazione sui runtime personalizzati per scoprire come definire un Dockerfile in un runtime personalizzato.

Variabili di ambiente

Le seguenti variabili di ambiente sono 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 il processo di applicazione.
GAE_SERVICE Il nome del servizio specificato nel file app.yaml della tua applicazione oppure, se non viene specificato alcun nome, il nome è impostato su default.
GAE_VERSION L'etichetta della versione dell'applicazione corrente.
GOOGLE_CLOUD_PROJECT L'ID progetto associato all'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 variabili di ambiente aggiuntive con app.yaml.

Server metadati

Ogni istanza dell'applicazione può utilizzare il server di metadati di Compute Engine per eseguire query sull'istanza, tra cui nome host, indirizzo IP esterno, 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 leggerli dalle istanze di App Engine e Compute Engine.

Questa funzione di esempio utilizza il server di metadati per ottenere un indirizzo IP esterno per le istanze che eseguono il runtime Ruby versione 3.1 e precedenti e per le istanze che eseguono la versione 3.2 e successive. Tieni presente che devi aggiornare il file app.yaml per utilizzare la nuova versione. Per saperne di più sull'utilizzo dei nuovi runtime, consulta Runtime Ruby.

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