סביבת זמן הריצה של Ruby

זמן הריצה של Ruby הוא מחסנית התוכנה שאחראית להתקנת קוד האפליקציה והתלות שלה, ולאחר מכן להפעלת האפליקציה בסביבה הגמישה.

גרסאות Ruby

‫Ruby 4.0 (גרסת Preview) משתמש בbuildpacks. רשימה מלאה של גרסאות Ruby הנתמכות וגרסאות Ubuntu התואמות שלהן זמינה בלוח הזמנים של התמיכה בזמן ריצה.

כדי להשתמש בגרסת Ruby נתמכת, צריך:

  • מציינים גרסת Ruby בקובץ Gemfile.

    RUBY VERSION
      ruby "4.0.x"
    
  • מתקינים את גרסה 420.0.0 ואילך של ה-CLI של gcloud. אפשר לעדכן את כלי ה-CLI על ידי הרצת הפקודה gcloud components update. כדי לראות את הגרסה המותקנת, אפשר להריץ את הפקודה gcloud version.

  • מציינים את ההגדרה operating_system בקובץ app.yaml:

      runtime: ruby
      env: flex
    
      runtime_config:
          operating_system: "ubuntu24"
    
  • אפשר גם לציין גרסה של מתורגמן Ruby באמצעות קובץ .ruby-version בתיקיית האפליקציה. לדוגמה, 4.0.x.

גרסאות קודמות

כדי להשתמש ב-Ruby runtime בגרסה 3.1 ומגרסאות קודמות, צריך לציין גרסה של Ruby interpreter באמצעות קובץ .ruby-version בספריית האפליקציה.

אם הקובץ הזה קיים, סביבת זמן הריצה מתקינה את הגרסה המבוקשת של Ruby כשפורסים את האפליקציה באמצעות rbenv. אם אי אפשר להתקין את הגרסה המבוקשת, App Engine מציג הודעת שגיאה במהלך הפריסה.

אם לא מספקים קובץ .ruby-version, סביבת זמן הריצה של Ruby מוגדרת כברירת מחדל לגרסה 2.7. שימו לב: ברירת המחדל יכולה להשתנות בכל שלב, ולכן מומלץ לציין באפליקציה גרסת Ruby.

תמיכה בסביבות זמן ריצה אחרות של Ruby

אם אתם צריכים להשתמש בגרסת Ruby שלא נתמכת, אתם יכולים ליצור סביבת ריצה בהתאמה אישית ולבחור תמונת בסיס תקינה עם גרסת Ruby שאתם צריכים.

לגבי תמונות בסיס שסופקו על ידי Google או תמונות בסיס של Docker Ruby, אפשר לעיין במאמר יצירת סביבות ריצה בהתאמה אישית.

תלויות

סביבת זמן הריצה מחפשת קובץ Gemfile בספריית קובצי המקור של האפליקציה ומשתמשת ב-Bundler כדי להתקין את כל התלות לפני הפעלת האפליקציה. מידע נוסף על הצהרה על חבילות וניהול שלהן זמין במאמר שימוש בספריות Ruby.

שימוש בספריות C עם Ruby

בספריות Ruby שדורשות תוספי C, הכותרות של גרסת Ruby הנוכחית ושל חבילות Ubuntu הבאות מותקנות מראש במערכת.

  • 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

החבילות האלה מאפשרות להתקין את רוב ספריות Ruby הפופולריות. אם האפליקציה שלכם דורשת תלות נוספת ברמת מערכת ההפעלה, תצטרכו להשתמש בסביבת זמן ריצה בהתאמה אישית שמבוססת על סביבת זמן הריצה הזו כדי להתקין את החבילות המתאימות.

הפעלת האפליקציה

סביבת זמן הריצה מפעילה את האפליקציה באמצעות entrypoint שמוגדר ב-app.yaml. נקודת הכניסה צריכה להתחיל תהליך שמגיב לבקשות HTTP ביציאה שמוגדרת על ידי משתנה הסביבה PORT. לדוגמה:

entrypoint: bundle exec rails server -p $PORT

רוב אפליקציות האינטרנט משתמשות בשרת אינטרנט שתומך ב-Rack, כמו Puma,‏ Unicorn או Thin.

צריך להוסיף את השרת כתלות בקובץ התצורה Gemfile של האפליקציה. סביבת זמן הריצה תתקין את כל התלויות לפני הקריאה לנקודת הכניסה.

source "https://rubygems.org"

gem "rack"
gem "puma"

נקודת כניסה לדוגמה באמצעות puma לאפליקציית Rails:

entrypoint: bundle exec rails server Puma -p $PORT

דוגמה לנקודת כניסה באמצעות puma לכל אפליקציית Rack:

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

באפליקציות שיכולות לטפל בבקשות בלי שרת Rack, אפשר פשוט להריץ סקריפט Ruby:

entrypoint: bundle exec ruby app.rb

משתני סביבה

משתני הסביבה הבאים מוגדרים על ידי סביבת זמן הריצה:

משתנה סביבה תיאור
GAE_INSTANCE השם של המופע הנוכחי.
GAE_MEMORY_MB נפח הזיכרון שזמין לתהליך האפליקציה.
GAE_SERVICE שם השירות שצוין בקובץ app.yaml של האפליקציה, או אם לא צוין שם שירות, הוא מוגדר כ-default.
GAE_VERSION תווית הגרסה של האפליקציה הנוכחית.
GOOGLE_CLOUD_PROJECT מזהה הפרויקט שמשויך לאפליקציה, שמופיע במסוף Google Cloud
PORT היציאה שתקבל בקשות HTTP.
RACK_ENV ההגדרה היא production.
RAILS_ENV ההגדרה היא production.
RAILS_SERVE_STATIC_FILES ההגדרה היא true.

אפשר להגדיר משתני סביבה נוספים באמצעות app.yaml.

שרת מטא-נתונים

כל מופע של האפליקציה יכול להשתמש בשרת המטא-נתונים של Compute Engine כדי לשלוח שאילתות לגבי פרטי המופע, כולל שם המארח, כתובת ה-IP החיצונית, מזהה המופע, מטא-נתונים מותאמים אישית ופרטי חשבון השירות. ב-App Engine אי אפשר להגדיר מטא-נתונים מותאמים אישית לכל מופע, אבל אפשר להגדיר מטא-נתונים מותאמים אישית ברמת הפרויקט ולקרוא אותם מהמופעים של App Engine ו-Compute Engine.

הפונקציה לדוגמה הזו משתמשת בשרת המטא-נתונים כדי לקבל כתובת IP חיצונית של מופע.

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