El entorno de ejecución de Ruby

El entorno de ejecución de Ruby es la pila de software encargada de instalar el código y las dependencias de tu aplicación y, luego, ejecutarla en el entorno flexible.

  • La versión 3.2 se compila a través de buildpacks, que requiere que elijas un sistema operativo en el archivo app.yaml. Por ejemplo, para usar Ruby 3.2, debes especificar Ubuntu 22 como el sistema operativo.

  • La versión 3.1 y anteriores se compilan mediante Docker.

Para obtener la lista completa de las versiones de Ruby compatibles y la versión correspondiente de Ubuntu, consulta el programa de asistencia del entorno de ejecución.

Intérprete

Versiones nuevas del entorno de ejecución

Para la Versión 3.2, debes incluir elruntime_config yoperating_system configuración en tu app.yaml para especificar un sistema operativo.

Para usar Ruby 3.2, debes hacer lo siguiente:

  • Especifica una versión de Ruby en tu Gemfile.

    RUBY VERSION
      ruby 3.2.x
    
  • Instala la versión 420.0.0 o posterior de la CLI de gcloud. Puedes actualizar las herramientas de la CLI si ejecutas el comando gcloud components update. Para ver la versión instalada, puedes ejecutar el comando gcloud version.

  • Especifica la configuración operating_system en el archivo app.yaml:

      runtime: ruby
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
    

De manera opcional, puedes especificar una versión del intérprete de Ruby con un archivo .ruby-version en el directorio de tu aplicación. Por ejemplo,

3.2.2

Versiones anteriores

Para la versión 3.1 y anteriores del entorno de ejecución de Ruby, especifica una versión del intérprete de Ruby con un archivo .ruby-version en el directorio de tu aplicación.

Cuando este archivo está presente, el entorno de ejecución instala la versión solicitada de Ruby durante la implementación de tu app mediante rbenv. Si la versión solicitada no se puede instalar, App Engine muestra un mensaje de error durante la implementación.

Si no proporcionas un archivo .ruby-version, el entorno de ejecución de Ruby se establece de forma predeterminada en la versión 2.7. Ten en cuenta que el valor predeterminado puede cambiar en cualquier momento, por lo que se recomienda que tu app especifique una versión de Ruby.

Dependencias

El entorno de ejecución busca un archivo Gemfile en el directorio fuente de tu aplicación y usa Bundler para instalar cualquier dependencia antes de iniciar la aplicación. Para obtener más información acerca de cómo declarar y administrar los paquetes, consulta Usa bibliotecas de Ruby.

Cómo usar bibliotecas de C con Ruby

Para las bibliotecas de Ruby que requieren extensiones de C, los encabezados de la versión de Ruby actual y los siguientes paquetes de Ubuntu se instalan previamente en el 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

Estos paquetes permiten la instalación de las bibliotecas más populares de Ruby. Si la aplicación requiere otras dependencias del nivel del sistema operativo, deberás usar un entorno de ejecución personalizado basado en este entorno de ejecución para instalar los paquetes adecuados.

Inicio de la aplicación

El entorno de ejecución inicia la aplicación mediante el entrypoint definido en app.yaml. El punto de entrada debería iniciar un proceso que responda a solicitudes HTTP en el puerto definido por la variable de entorno PORT. Por ejemplo:

entrypoint: bundle exec rails server -p $PORT

La mayoría de las aplicaciones web usan un servidor web compatible con Rack, como Puma, Unicorn o Thin.

Debes agregar el servidor como una dependencia en el archivo de configuración Gemfile de tu aplicación. El entorno de ejecución instalará todas las dependencias antes de que se llame al punto de entrada.

source "https://rubygems.org"

gem "rack"
gem "puma"

Este es un ejemplo de un punto de entrada que usa Puma para una aplicación Rails:

entrypoint: bundle exec rails server Puma -p $PORT

Este es un ejemplo de un entrypoint que usa puma para cualquier aplicación Rack:

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

Para las aplicaciones que pueden controlar solicitudes sin un servidor de Rack, solo puedes ejecutar una secuencia de comandos de Ruby:

entrypoint: bundle exec ruby app.rb

Extiende el tiempo de ejecución

Puedes usar entornos de ejecución personalizados para agregar una funcionalidad adicional a la aplicación Ruby que se ejecuta en el entorno flexible de App Engine. Para configurar un entorno de ejecución personalizado, reemplaza la siguiente línea en tu archivo app.yaml:

runtime: ruby

por esta línea:

runtime: custom

También debes agregar los archivos Dockerfile y .dockerignore en el mismo directorio que contiene el archivo app.yaml.

Visita la documentación Entornos de ejecución personalizados para obtener información sobre cómo definir un Dockerfile en entornos de ejecución personalizados.

Variables de entorno

Las siguientes variables del entorno se configuran mediante el entorno de ejecución:

Variable del entorno Descripción
GAE_INSTANCE El nombre de la instancia actual.
GAE_MEMORY_MB La cantidad de memoria disponible para el proceso de la aplicación.
GAE_SERVICE El nombre del servicio especificado en el archivo app.yaml de la aplicación; si no se especifica ningún nombre, se configura como default.
GAE_VERSION La etiqueta de versión de la aplicación actual.
GOOGLE_CLOUD_PROJECT El ID del proyecto asociado con la aplicación, que se puede ver en la consola de Google Cloud.
PORT El puerto que recibirá las solicitudes HTTP.
RACK_ENV Se define en production.
RAILS_ENV Se define en production.
RAILS_SERVE_STATIC_FILES Se define en true.

Puedes definir variables de entorno adicionales con app.yaml.

Servidor de metadatos

Cada instancia de tu aplicación puede usar el servidor de metadatos de Compute Engine para consultar información sobre la instancia, incluidos el nombre del host, la dirección IP externa, el ID de instancia, los metadatos personalizados y la información de la cuenta de servicio. App Engine no permite definir metadatos personalizados para cada instancia, pero puedes definir los metadatos personalizados de todo el proyecto y leerlos desde tus instancias de App Engine y Compute Engine.

Esta función de ejemplo usa el servidor de metadatos a fin de obtener una dirección IP externa para las instancias que ejecutan la versión 3.1 y anteriores del entorno de ejecución de Ruby, y las instancias que ejecutan la versión 3.2 y posteriores. Ten en cuenta que debes actualizar tu archivo app.yaml para usar la versión nueva. Consulta el entorno de ejecución de Ruby para obtener más información sobre el uso de los nuevos entornos de ejecución.

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