Menjalankan Rails di lingkungan Cloud Run

Pelajari cara men-deploy aplikasi Rails contoh ke Cloud Run dan cara mengintegrasikan database terkelola, penyimpanan objek, secret terenkripsi, dan pipeline build dengan komputasi serverless.

Men-deploy aplikasi Rails melibatkan pengintegrasian beberapa layanan bersama-sama untuk membentuk project yang kohesif. Tutorial ini mengasumsikan bahwa Anda sudah memahami pengembangan web Rails.

Tutorial ini memerlukan Ruby 3.0 atau yang lebih baru dan Rails 8 atau yang lebih baru.

Diagram yang menunjukkan arsitektur deployment.
Situs Rails ditayangkan dari Cloud Run, yang menggunakan beberapa layanan pendukung untuk menyimpan berbagai jenis data (informasi database relasional, aset media, secret konfigurasi, dan image container). Layanan backend diperbarui oleh Cloud Build sebagai bagian dari tugas build dan migrasi.

Tujuan

  • Membuat dan menghubungkan database Cloud SQL ke Active Record
  • Membuat dan menggunakan Secret Manager untuk menyimpan dan mengakses kunci utama Rails secara aman
  • Menghosting media dan file yang diupload pengguna di Cloud Storage dari Active Storage
  • Menggunakan Cloud Build untuk mengotomatiskan build dan migrasi database
  • Men-deploy aplikasi Rails ke Cloud Run

Biaya

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Instal Google Cloud CLI.

  6. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  7. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Instal Google Cloud CLI.

  12. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  13. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  14. Pastikan izin yang memadai tersedia untuk akun yang digunakan dalam tutorial ini.

Menyiapkan lingkungan Anda

Tutorial ini menggunakan beberapa layanan Google Cloud untuk menyediakan database, penyimpanan media, dan penyimpanan rahasia yang mendukung aplikasi Rails yang di-deploy. Siapkan lingkungan Anda dengan mengonfigurasi region untuk men-deploy layanan dan dengan meng-clone aplikasi Rails.

Menetapkan project dan region default

  1. Tetapkan konfigurasi project default untuk gcloud CLI dengan menjalankan perintah berikut:

    gcloud config set project PROJECT_ID
    

    Ganti PROJECT_ID dengan project ID Google Cloud Anda

  2. Konfigurasi region Anda:

    export REGION=REGION
    

    Ganti REGION dengan lokasi yang sesuai. Untuk efisiensi antar-layanan, semua layanan harus di-deploy di region yang sama. Untuk mengetahui informasi selengkapnya tentang region terdekat dengan Anda, lihat Produk yang tersedia berdasarkan lokasi.

Meng-clone aplikasi Rails

Kode untuk aplikasi contoh Rails ada di repositori GoogleCloudPlatform/ruby-docs-samples di GitHub.

  1. Buat clone repositori:

    git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
    
  2. Buka direktori yang berisi kode contoh dan jalankan perintah berikut untuk memastikan aplikasi disiapkan dengan benar menggunakan gem dan dependensi yang diperlukan:

    Linux/macOS

    cd ruby-docs-samples/run/rails
    bundle install
    

    Windows

    cd ruby-docs-samples\run\rails
    bundle install
    

Menyiapkan layanan pendukung

Tutorial ini menggunakan sejumlah layanan Google Cloud untuk menyediakan database, penyimpanan media, dan penyimpanan rahasia yang mendukung project Rails yang di-deploy. Layanan ini di-deploy di region tertentu. Untuk efisiensi antar-layanan, sebaiknya semua layanan di-deploy di region yang sama. Untuk mengetahui informasi selengkapnya tentang region terdekat dengan Anda, lihat Produk yang tersedia berdasarkan lokasi.

Menyiapkan instance Cloud SQL untuk PostgreSQL

Rails mendukung beberapa database relasional, termasuk beberapa yang ditawarkan oleh Cloud SQL. Tutorial ini menggunakan PostgreSQL, database open source yang umum digunakan oleh aplikasi Rails.

Bagian berikut menjelaskan pembuatan instance, database, dan pengguna database PostgreSQL untuk aplikasi Rails Anda.

Buat instance PostgreSQL

Konsol

  1. Di konsol Google Cloud , buka halaman Instance Cloud SQL.

    Buka halaman Instance Cloud SQL

  2. Klik Create Instance.

  3. Klik Pilih PostgreSQL.

  4. Di kolom Instance ID, masukkan nama untuk instance (INSTANCE_NAME).

  5. Di kolom Password, masukkan sandi untuk pengguna postgres.

  6. Gunakan nilai default untuk kolom lainnya.

  7. Klik Create Instance.

gcloud

  • Buat instance PostgreSQL:

    gcloud sql instances create INSTANCE_NAME \
        --database-version POSTGRES_12 \
        --tier db-f1-micro \
        --region REGION
    

    Ganti kode berikut:

    Proses pembuatan instance dan penyiapannya agar siap digunakan memerlukan waktu beberapa menit.

Buat database

Konsol

  1. Di Konsol Google Cloud , buka halaman Instance Cloud SQL.

    Buka halaman Instance Cloud SQL

  2. Pilih instance INSTANCE_NAME.

  3. Buka tab Database.

  4. Klik Create database.

  5. Dalam dialog Database name, masukkan DATABASE_NAME.

  6. Klik Create.

gcloud

  • Buat database dalam instance yang baru saja dibuat:

    gcloud sql databases create DATABASE_NAME \
        --instance INSTANCE_NAME
    

    Ganti DATABASE_NAME dengan nama untuk database di dalam instance.

Membuat pengguna

Buat sandi acak untuk pengguna database, dan tulis ke file bernama dbpassword:

cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1 > dbpassword

Konsol

  1. Di Konsol Google Cloud , buka halaman Instance Cloud SQL.

    Buka halaman Instance Cloud SQL

  2. Pilih instance INSTANCE_NAME.

  3. Buka tab Pengguna.

  4. Klik Add User Account.

  5. Di bagian dialog Built-in Authentication:

    1. Masukkan nama pengguna DATABASE_USERNAME.
    2. Masukkan konten file dbpassword sebagai sandi PASSWORD.
  6. Klik Tambahkan.

gcloud

  • Buat pengguna dalam instance yang baru dibuat dan tetapkan sandinya menjadi konten dbpassword:

    gcloud sql users create DATABASE_USERNAME \
       --instance=INSTANCE_NAME --password=$(cat dbpassword)
    

    Ganti DATABASE_USERNAME dengan nama pengguna di dalam instance.

Menyiapkan repositori Artifact Registry

Gunakan Artifact Registry untuk membuat repositori guna menyimpan image container Anda.

Konsol

  1. Di konsol Google Cloud , buka halaman Artifact Registry.

    Buka Artifact Registry

  2. Klik Create Repository.

  3. Masukkan:

    • Untuk Name, masukkan "cloud-run-source-deploy".
    • Untuk Format, pilih "Docker".
    • Untuk Region, pilih REGION.
  4. Pertahankan nilai default untuk kolom lainnya.

  5. Klik Create.

gcloud

  • Buat repositori Artifact Registry:

    gcloud artifacts repositories create cloud-run-source-deploy \
        --repository-format docker \
        --location REGION
    

Menyiapkan bucket Cloud Storage

Anda dapat menghosting aset statis Rails dan media yang diupload pengguna di penyimpanan objek yang sangat tersedia menggunakan Cloud Storage.

Konsol

  1. Di konsol Google Cloud , buka halaman Buckets Cloud Storage.

    Buka Buckets

  2. Klik Create.
  3. Di halaman Buat bucket, masukkan informasi bucket Anda. Untuk melanjutkan ke langkah berikutnya, klik Lanjutkan.
    1. Di bagian Mulai, lakukan tindakan berikut:
      • Masukkan nama yang unik secara global yang memenuhi persyaratan penamaan bucket.
      • Untuk menambahkan label bucket, luaskan bagian Label (), klik Tambahkan label, lalu tentukan key dan value untuk label Anda.
    2. Untuk Location, pilih opsi berikut: us-central1
    3. Di bagian Choose how to store your data, lakukan tindakan berikut:
      1. Di bagian Setel kelas default, pilih opsi berikut: Standard.
      2. Untuk mengaktifkan namespace hierarkis, di bagian Optimalkan penyimpanan untuk beban kerja intensif data, pilih Aktifkan namespace hierarkis di bucket ini.
    4. Di bagian Pilih cara mengontrol akses ke objek, pilih apakah bucket Anda menerapkan pencegahan akses publik atau tidak, lalu pilih metode kontrol akses untuk objek bucket Anda.
    5. Di bagian Pilih cara melindungi data objek, lakukan tindakan berikut:
      • Pilih salah satu opsi di bagian Perlindungan data yang ingin Anda tetapkan untuk bucket Anda.
        • Untuk mengaktifkan penghapusan sementara, klik kotak centang Kebijakan penghapusan sementara (Untuk pemulihan data), dan tentukan jumlah hari Anda ingin mempertahankan objek setelah penghapusan.
        • Untuk menyetel Pembuatan Versi Objek, klik kotak centang Pembuatan versi objek (Untuk kontrol versi), dan tentukan jumlah maksimum versi per objek dan jumlah hari setelah versi lama berakhir.
        • Untuk mengaktifkan kebijakan retensi pada objek dan bucket, klik kotak centang Retensi (Untuk kepatuhan), lalu lakukan hal berikut:
          • Untuk mengaktifkan Penguncian Retensi Objek, centang kotak Aktifkan retensi objek.
          • Untuk mengaktifkan Bucket Lock, centang kotak Setel kebijakan retensi bucket, lalu pilih satuan waktu dan durasi untuk periode retensi data Anda.
      • Untuk memilih cara mengenkripsi data objek Anda, luaskan bagian Enkripsi data (), lalu pilih metode Enkripsi data.
  4. Klik Create.

gcloud

  • Membuat bucket Cloud Storage. Untuk membuat nama bucket Cloud Storage yang unik, gunakan PROJECT_ID dan sufiks pilihan Anda, MEDIA_BUCKET_SUFFIX. Di Cloud Storage, nama bucket harus unik secara global.

    gcloud storage buckets create gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX \
        --location=REGION
    

Setelah membuat bucket, untuk membuat gambar yang diupload menjadi publik, ubah izin objek gambar agar dapat dibaca oleh semua orang.

Konsol

  1. Di konsol Google Cloud , buka halaman Buckets Cloud Storage.

    Buka Buckets

  2. Dalam daftar bucket, klik nama bucket yang ingin Anda tampilkan kepada publik.

  3. Pilih tab Permissions di dekat bagian atas halaman.

  4. Klik tombol Tambahkan anggota.

    Dialog Tambahkan anggota akan muncul.

  5. Di kolom Anggota baru, masukkan allUsers.

  6. Pada menu drop-down Pilih suatu peran, pilih sub-menu Cloud Storage, lalu klik opsi Storage Object Viewer.

  7. Klik Simpan.

Setelah dipublikasikan, ikon link akan muncul untuk setiap objek di kolom akses publik. Anda dapat mengklik ikon ini untuk mendapatkan URL objek.

Untuk mempelajari cara mendapatkan informasi error mendetail tentang operasi Ruby yang gagal di konsol Google Cloud , lihat Pemecahan masalah.

gcloud

  • Gunakan perintah gcloud storage buckets add-iam-policy-binding untuk membuat semua objek menjadi publik. Gunakan nilai untuk MEDIA_BUCKET_SUFFIX yang Anda gunakan saat membuat bucket.

    gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX \
        --member=allUsers --role=roles/storage.objectViewer
    

Menyimpan nilai rahasia di Secret Manager

Setelah layanan pendukung dikonfigurasi, Rails memerlukan informasi yang aman, seperti sandi, untuk mengakses layanan ini. Alih-alih memasukkan nilai ini langsung ke dalam kode sumber Rails, tutorial ini menggunakan Kredensial Rails dan Secret Manager untuk menyimpan informasi ini secara aman.

Membuat file kredensial terenkripsi dan menyimpan kunci sebagai rahasia Secret Manager

Rails menyimpan secret dalam file terenkripsi yang disebut 'config/credentials.yml.enc'. File dapat didekripsi dengan config/master.key lokal atau variabel lingkungan ENV["RAILS_MASTER_KEY"]. Dalam file kredensial, Anda dapat menyimpan sandi database instance Cloud SQL dan kunci akses lainnya untuk API eksternal.

Anda dapat menyimpan kunci ini dengan aman di Secret Manager. Kemudian, Anda dapat memberikan akses Cloud Run dan Cloud Build ke kunci dengan memberikan akses ke akun layanan masing-masing. Akun layanan diidentifikasi dengan alamat email yang berisi nomor project.

  1. Buat file config/credentials.yml.enc dengan perintah berikut:

    bin/rails credentials:edit
    

    Perintah ini akan membuat config/master.key jika tidak ada kunci utama yang ditentukan, dan membuat file config/credentials.yml.enc jika file tidak ada. Tindakan ini akan membuka file sementara di $EDITOR default Anda dengan konten yang didekripsi untuk ditambahkan ke secret.

  2. Salin dan tempel sandi database instance PostgreSQL yang baru dibuat dari file dbpassword ke dalam file kredensial:

    secret_key_base: GENERATED_VALUE
    gcp:
        db_password: PASSWORD
    

    Secret dapat diakses dengan Rails.application.credentials. Misalnya, Rails.application.credentials.secret_key_base harus menampilkan dasar kunci rahasia aplikasi dan Rails.application.credentials.gcp[:db_password] harus menampilkan sandi database Anda.

  3. config/credentials/yml.enc disimpan terenkripsi, tetapi config/master.key dapat disimpan di Secret Manager.

    Konsol

    1. Di konsol Google Cloud , buka halaman Secret Manager.

      Buka halaman Secret Manager

    2. Klik Create secret.

    3. Di kolom Name, masukkan nama untuk secret RAILS_SECRET_NAME.

    4. Dalam dialog Secret value, tempel nilai mater.key ke dalam kotak.

    5. Klik Create secret.

    6. Di halaman Secret details secret Anda, catat nomor project:

      projects/PROJECTNUM/secrets/RAILS_SECRET_NAME

    7. Di tab Izin, klik Tambahkan Anggota

    8. Di kolom New Members, masukkan PROJECTNUM-compute@developer.gserviceaccount.com, lalu tekan Enter.

    9. Di kolom New Members, masukkan PROJECTNUM@cloudbuild.gserviceaccount.com, lalu tekan Enter.

    10. Di menu drop-down Role, pilih Secret Manager Secret Accessor.

    11. Klik Simpan.

    gcloud

    1. Buat secret baru dengan nilai config/master.key:

      gcloud secrets create RAILS_SECRET_NAME --data-file config/master.key
      

      Ganti RAILS_SECRET_NAME dengan nama untuk secret baru.

    2. Untuk mengonfirmasi pembuatan secret, periksa secret:

      gcloud secrets describe RAILS_SECRET_NAME
      
      gcloud secrets versions access latest --secret RAILS_SECRET_NAME
      
    3. Dapatkan nilai nomor project:

      gcloud projects describe PROJECT_ID --format='value(projectNumber)'
      
    4. Berikan akses ke secret ke akun layanan Cloud Run:

      gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \
          --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \
          --role roles/secretmanager.secretAccessor
      

      Ganti PROJECTNUM dengan nilai nomor project.

    5. Berikan akses ke secret untuk akun layanan Cloud Build:

      gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \
          --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \
          --role roles/secretmanager.secretAccessor
      

      Di output, konfirmasi bahwa bindings mencantumkan dua akun layanan sebagai anggota.

Menghubungkan aplikasi Rails ke database dan penyimpanan produksi

Tutorial ini menggunakan instance PostgreSQL sebagai database produksi dan Cloud Storage sebagai backend penyimpanan. Agar Rails dapat terhubung ke database dan bucket penyimpanan yang baru dibuat, Anda harus menentukan semua informasi yang diperlukan untuk mengaksesnya dalam file .env. File .env berisi konfigurasi untuk variabel lingkungan aplikasi. Aplikasi akan membaca file ini menggunakan gem dotenv. Karena secret disimpan di credentials.yml.enc dan Secret Manager, .env tidak perlu dienkripsi karena tidak menyimpan kredensial sensitif.

  1. Untuk mengonfigurasi aplikasi Rails agar terhubung dengan database dan bucket penyimpanan, buka file .env.
  2. Ubah konfigurasi file .env menjadi berikut. Gunakan nilai MEDIA_BUCKET_SUFFIX yang Anda gunakan saat membuat bucket.

    PRODUCTION_DB_NAME: DATABASE_NAME
    PRODUCTION_DB_USERNAME: DATABASE_USERNAME
    CLOUD_SQL_CONNECTION_NAME: PROJECT_ID:REGION:INSTANCE_NAME
    GOOGLE_PROJECT_ID: PROJECT_ID
    STORAGE_BUCKET_NAME: PROJECT_ID-MEDIA_BUCKET_SUFFIX
    

    Aplikasi Rails kini disiapkan untuk menggunakan Cloud SQL dan Cloud Storage saat di-deploy ke Cloud Run.

Men-deploy aplikasi ke Cloud Run

Setelah layanan pendukung disiapkan, Anda kini dapat men-deploy aplikasi sebagai layanan Cloud Run.

  1. Dengan menggunakan cloudbuild.yaml yang disediakan, gunakan Cloud Build untuk membangun image, menjalankan migrasi database, dan mengisi aset statis:

    gcloud builds submit --config cloudbuild.yaml \
        --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAME
    

    Ganti SERVICE_NAME dengan nama layanan Anda. Build pertama ini membutuhkan waktu beberapa menit hingga selesai. Jika build kehabisan waktu, tingkatkan durasi waktu tunggu dengan memasukkan --timeout=2000s ke dalam perintah build.

  2. Setelah build berhasil, deploy layanan Cloud Run untuk pertama kalinya, dengan menetapkan region layanan, image dasar, dan instance Cloud SQL yang terhubung:

    gcloud run deploy SERVICE_NAME \
            --region REGION \
            --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/SERVICE_NAME \
            --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \
            --allow-unauthenticated
    

    Anda akan melihat output yang menunjukkan bahwa deployment berhasil, dengan URL layanan.

  3. Untuk melihat layanan yang di-deploy, buka URL layanan.

    Halaman landing album kucing.
    Jika URL layanan menampilkan Cat Photo Album, Anda berada di halaman beranda aplikasi.

  4. Coba upload foto baru. Jika foto berhasil diupload, berarti aplikasi Rails telah berhasil di-deploy.

    Contoh item album kucing
    Jika URL layanan menampilkan Cat Photo Album, Anda berada di halaman beranda aplikasi.

Mengupdate aplikasi

Meskipun langkah-langkah penyediaan dan deployment awal rumit, melakukan update adalah proses yang lebih sederhana:

  1. Jalankan skrip build dan migrasi Cloud Build:

    gcloud builds submit --config cloudbuild.yaml \
            --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAME
    
  2. Deploy layanan, dengan hanya menentukan region dan image:

    gcloud run deploy SERVICE_NAME \
            --region REGION \
            --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/SERVICE_NAME
    

Memahami kode

Aplikasi contoh Rails dibuat menggunakan perintah Rails standar. Perintah berikut membuat aplikasi cat_album dan menggunakan perintah scaffold untuk membuat model, pengontrol, dan tampilan untuk resource Foto:

rails new cat_album
rails generate scaffold Photo caption:text

Koneksi database

File config/database.yml berisi konfigurasi yang diperlukan untuk mengakses database Anda di lingkungan yang berbeda (pengembangan, pengujian, produksi). Misalnya, database produksi dikonfigurasi untuk berjalan di Cloud SQL untuk PostgreSQL. Nama dan nama pengguna database ditetapkan melalui variabel lingkungan dalam file .env, sedangkan sandi database disimpan di dalam file config/credentials.yml.enc, yang memerlukan RAILS_MASTER_KEY untuk mendekripsi.

Saat berjalan di Cloud Run (terkelola sepenuhnya), aplikasi terhubung ke instance PostgreSQL menggunakan soket yang disediakan oleh lingkungan Cloud Run. Saat aplikasi berjalan di mesin lokal, aplikasi terhubung ke instance PostgreSQL menggunakan proxy Auth Cloud SQL.

production:
  <<: *default
  database: <%= ENV["PRODUCTION_DB_NAME"] %>
  username: <%= ENV["PRODUCTION_DB_USERNAME"] %>
  password: <%= Rails.application.credentials.gcp[:db_password] %>
  host: "<%= ENV.fetch("DB_SOCKET_DIR") { '/cloudsql' } %>/<%= ENV["CLOUD_SQL_CONNECTION_NAME"] %>"

Media yang diupload pengguna dan disimpan di cloud

Rails menggunakan Active Storage untuk mengupload file ke penyedia penyimpanan. File config/storage.yml dan config/environments/production.rb menentukan Cloud Storage sebagai penyedia layanan di lingkungan produksi.

google:
  service: GCS
  project: <%= ENV["GOOGLE_PROJECT_ID"] %>
  bucket: <%= ENV["STORAGE_BUCKET_NAME"] %>
# Store uploaded files on the local file system (see config/storage.yml for options).
config.active_storage.service = :google

Otomatisasi dengan Cloud Build

File cloudbuild.yaml tidak hanya melakukan langkah-langkah build image yang umum (membuat image container dan mengirimkannya ke Artifact Registry), tetapi juga migrasi database Rails. Migrasi ini dilakukan menggunakan tugas Cloud Run, dengan perintah kustom sehingga container melakukan migrasi, bukan server web default.

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    entrypoint: 'bash'
    args: ["-c", "docker build --build-arg MASTER_KEY=$$RAILS_KEY -t ${_IMAGE_NAME} . "]
    secretEnv: ["RAILS_KEY"]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args: ["push", "${_IMAGE_NAME}"]

  - id: "apply migrations"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: /bin/bash
    secretEnv: ["RAILS_KEY"]
    args:
      - "-c"
      - |
        gcloud run jobs create migrate-job \
          --region ${_REGION} \
          --image ${_IMAGE_NAME} \
          --set-cloudsql-instances ${_CLOUD_SQL_CONNECTION_NAME} \
          --set-env-vars RAILS_MASTER_KEY=$$RAILS_KEY \
          --command bundle \
          --args exec,rails,db:migrate \
          --execute-now --wait && \
          gcloud run jobs delete  migrate-job --region ${_REGION} -q

options:
  dynamicSubstitutions: true

substitutions:
  _REGION: us-central1
  _SERVICE_NAME: rails-cat-album
  _INSTANCE_NAME: cat-album
  _SECRET_NAME: rails-master-key
  _AR_REPO_NAME: cloud-run-source-deploy
  _IMAGE_NAME: ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO_NAME}/${_SERVICE_NAME}
  _CLOUD_SQL_CONNECTION_NAME: ${PROJECT_ID}:${_REGION}:${_INSTANCE_NAME}

availableSecrets:
  secretManager:
  - versionName: projects/${PROJECT_ID}/secrets/${_SECRET_NAME}/versions/latest
    env: RAILS_KEY

images:
  - "${_IMAGE_NAME}"

Variabel penggantian digunakan dalam konfigurasi ini. Mengubah nilai dalam file secara langsung berarti tanda --substitutions dapat dihapus pada saat migrasi.

Dalam konfigurasi ini, hanya migrasi yang ada di direktori db/migrate yang diterapkan. Untuk membuat file migrasi, lihat Active Record Migrations.

Untuk membangun image dan menerapkan migrasi, konfigurasi Cloud Build memerlukan akses ke secret RAILS_MASTER_KEY dari Secret Manager. Kolom availableSecrets menetapkan versi secret dan variabel lingkungan yang akan digunakan untuk secret. Secret kunci utama diteruskan sebagai argumen dalam langkah image build, lalu ditetapkan sebagai RAILS_MASTER_KEY di Dockerfile saat membangun image.

ARG MASTER_KEY
ENV RAILS_MASTER_KEY=${MASTER_KEY}

Untuk memperluas konfigurasi Cloud Build agar mencakup deployment dalam satu konfigurasi tanpa harus menjalankan dua perintah, lihat Deployment berkelanjutan dari git menggunakan Cloud Build. Tindakan ini memerlukan perubahan IAM, seperti yang dijelaskan.

Pembersihan

  1. Di Konsol Google Cloud , buka halaman Manage resources.

    Buka Kelola resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.