Heroku スターターガイド (Ruby)
はじめに
このチュートリアルでは、Ruby アプリをデプロイする方法を簡単に紹介します。
少し時間を取って仕組みを学び、Heroku を最大限に活用できるようにしましょう。
このチュートリアルでは、以下が用意されていることを前提としています。
- 確認済みの Heroku アカウント
- ローカルにインストールされた Ruby 3.0.1。Ruby および Rails のインストールについては、OS X、Windows、Linux のガイドを参照してください。
- ローカルにインストールされた Bundler。
gem install bundler
を実行します。 - Eco dyno プランのサブスクリプション (推奨)
Windows をお使いの場合は、「Heroku スターターガイド (Ruby) (Microsoft Windows)」を参照してください。このガイドでは、Windows 環境に適したツールを使っています。
Windows 用ガイドを使わない場合、bundle install
を実行することはできません。場合によっては、OpenSSL と Puma Web サーバーを手動でインストールする必要があります。
まず、OpenSSL をダウンロードします。次に、ダウンロードした lzma を 7Zip で展開してから、tar ファイルを C:\openssl
に展開します。
ファイルが正しい場所に格納されていることを確認します。
$ dir c:\openssl
bin include lib ssl
次に、以下を実行します。
$ gem install puma -- --with-opt-dir=c:\openssl
上記の処理が終了したら、以下を実行します。
$ bundle update puma
Heroku dyno、Heroku Postgres、および Heroku Data for Redis の無料プランは 2022 年 11 月 28 日で提供を終了します。
低料金プランを使用してこのチュートリアルを完了することをお勧めします。資格のある学生の皆様は、新しい Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
設定する
Heroku CLI には、一般によく使われている Git というバージョン管理システムが必要です。Git がまだインストールされていない場合は、先に進む前に次の手順を完了してください。
このステップでは、Heroku Command Line Interface (CLI) をインストールします。CLI は、アプリケーションの管理やスケール、アドオンのプロビジョニング、アプリケーションログの表示、アプリケーションのローカル実行に使用します。
お使いのプラットフォーム用のインストーラをダウンロードし、実行してください。
$ brew tap heroku/brew && brew install heroku
インストールしたら、コマンドシェルで heroku
コマンドを使用できます。
heroku login
コマンドを使って Heroku CLI にログインします。
$ heroku login
heroku: Press any key to open up the browser to login or q to exit
› Warning: If browser does not open, visit
› https://cli-auth.heroku.com/auth/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as me@example.com
このコマンドにより、Web ブラウザで Heroku ログインページが開きます。ブラウザですでに Heroku にログインしている場合は、ページに表示されている[Log in] (ログイン) ボタンをクリックします。
この認証は、heroku
と git
コマンドが正常に動作するために必要な操作です。
外部の HTTP/HTTPS サービスへの接続にプロキシの使用が必要なファイアウォールを使っている場合は、heroku
コマンドを実行する前に、ローカルの開発環境で HTTP_PROXY
または HTTPS_PROXY
環境変数を設定できます。
アプリを準備する
このステップでは、Heroku にデプロイできるサンプルアプリケーションを準備します。
Heroku をはじめて使う場合は、 Heroku が提供するサンプルアプリケーションを使ってこのチュートリアルを行うことをお勧めします。
ただし、デプロイする既存のアプリケーションを用意してある場合は、 Heroku へのデプロイを準備する方法について、この記事を 参照してください。
サンプルアプリケーションをクローンして、Heroku にデプロイするコードのローカルバージョンを作成するには、ローカルのコマンドシェルまたはターミナルで次のコマンドを実行します。
$ git clone https://github.com/heroku/ruby-getting-started.git
$ cd ruby-getting-started
これで、シンプルなアプリケーションと、Ruby の依存関係マネージャである bundler が使用する Gemfile
ファイルを格納した、正常な Git リポジトリを準備できました。
アプリをデプロイする
このステップでは、アプリを Heroku にデプロイします。
Ruby ビルドパックにより、Mini Heroku Postgres データベースがアプリ用に自動プロビジョニングされます。Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。詳細は、こちらを参照してください。資格のある学生の皆様は、Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
Heroku でアプリを作成すると、Heroku でソースコードを受け取ることができるよう準備できます。
$ heroku create
Creating app... done, ⬢ polar-inlet-4930
http://polar-inlet-4930.herokuapp.com/ | https://git.heroku.com/polar-inlet-4930.git
Git remote heroku added
アプリを作成すると、heroku
という名前の git リモートリポジトリも作成され、ローカルの git リポジトリと関連付けられます。
Heroku によってランダムなアプリ名 (この場合は polar-inlet-4930
) が生成されます。パラメータを渡して独自のアプリ名を指定することもできます。
コードをデプロイします。
$ git push heroku main
Enumerating objects: 365, done.
Counting objects: 100% (365/365), done.
Delta compression using up to 8 threads
Compressing objects: 100% (204/204), done.
Writing objects: 100% (365/365), 71.57 KiB | 35.79 MiB/s, done.
Total 365 (delta 141), reused 358 (delta 136)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.7.4
remote: -----> Installing dependencies using bundler 2.2.21
....
remote: Asset precompilation completed (5.73s)
remote: Cleaning assets
remote: Running: rake assets:clean
remote: -----> Detecting rails configuration
remote:
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote: Default types for buildpack -> console, rake
remote:
remote: -----> Compressing...
remote: Done: 74.3M
remote: -----> Launching...
remote: Released v6
remote: https://polar-inlet-4930.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/polar-inlet-4930.git
* [new branch] main -> main
アプリケーションがデプロイされました。
アプリ名で生成された URL にあるアプリを開きます。 次のショートカットを使うと、簡単に Web サイトを開くことができます。
$ heroku open
ログを表示する
Heroku では、すべてのアプリと Heroku コンポーネントの出力ストリームを、時系列のイベントストリームに集約してログを作成するため、1 か所ですべてのイベントを確認できます。
実行中のアプリに関する情報を表示するには、ログコマンドの 1 つである、heroku logs --tail
を使います。
$ heroku logs --tail
2019-09-18T14:10:10.769652+00:00 heroku[web.1]: Starting process with command `bundle exec puma -C config/puma.rb`
2019-09-18T14:10:13.134654+00:00 app[web.1]: [4] Puma starting in cluster mode...
2019-09-18T14:10:13.134680+00:00 app[web.1]: [4] * Version 4.1.1 (ruby 2.4.4-p296), codename: Fourth and One
2019-09-18T14:10:13.134682+00:00 app[web.1]: [4] * Min threads: 5, max threads: 5
2019-09-18T14:10:13.134685+00:00 app[web.1]: [4] * Environment: production
2019-09-18T14:10:13.134689+00:00 app[web.1]: [4] * Process workers: 2
2019-09-18T14:10:13.134722+00:00 app[web.1]: [4] * Preloading application
2019-09-18T14:10:15.517611+00:00 app[web.1]: [4] * Listening on tcp://0.0.0.0:48362
2019-09-18T14:10:15.785166+00:00 heroku[web.1]: State changed from starting to up
ブラウザで再びアプリケーションを表示すると、別のログメッセージが生成されます。
ログのストリーム出力を停止するには、Control+C
を押します。
Procfile を定義する
Procfile は、アプリケーションのルートディレクトリにあるテキストファイルです。このファイルを使って、アプリの起動時に実行するコマンドを明示的に宣言します。
先ほどデプロイしたサンプルアプリの Procfile
は、次のようになっています。
web: bundle exec puma -C config/puma.rb
単一のプロセスタイプの web
と、その実行に必要なコマンドを宣言しています。 ここでは、web
という名前が重要です。 これは、このプロセスタイプを Heroku の HTTP ルーティングスタックにアタッチし、デプロイ後に Web トラフィックを受信することを宣言しています。 ここで使われているコマンドは、puma (Web サーバー) を実行し、設定ファイルを渡しています。
Procfile には追加のプロセスタイプを含めることができます。 たとえば、アイテムをキューから外す処理を実行するバックグラウンドプロセスを追加で宣言できます。
アプリをスケールする
現在、アプリは単一の Web dyno で実行されています。 dyno とは、Procfile
で指定されているコマンドを実行する軽量のコンテナのようなものです。
実行されている dyno の数を確認するには、ps
コマンドを使います。
$ heroku ps
=== web (Eco): `bundle exec puma -C config/puma.rb`
web.1: up 2015/05/12 11:28:21 (~ 4m ago)
デフォルトでは、アプリは Eco dyno でデプロイされます。Eco dyno はアイドル状態 (トラフィックを何も受信しない状態) が 30 分続くとスリープします。 スリープすると、スリープ解除するときの最初のリクエスト時に数秒の遅延が発生します。その後のリクエストは正常に処理されます。 Eco dyno は、月ごとに割り当てられるアカウント別の Eco dyno 時間を消費します。割り当て時間が残っている限り、Eco アプリはすべて稼働し続けます。
dyno がスリープしないようにするには、「dyno タイプ」の記事で紹介されている Basic または Professional の dyno タイプにアップグレードできます。たとえば、アプリを Professional dyno に移行すると、Heroku に特定の数の dyno の実行を指示するコマンドを実行し、各 dyno で Web プロセスタイプを実行させて、アプリを簡単にスケールすることができます。
Heroku でアプリケーションをスケールするとは、実行する dyno の数を変更することを意味します。 Web dyno の数を 0 にスケールしてみます。
$ heroku ps:scale web=0
ブラウザのタブで更新ボタンを押してアプリにアクセスするか、heroku open
コマンドを使ってブラウザのタブで開きます。 リクエストに応答できる Web dyno がないので、エラーメッセージが表示されます。
もう一度スケールしてみましょう。
$ heroku ps:scale web=1
アプリの依存関係を宣言する
Heroku では、アプリのルートディレクトリに Gemfile
ファイルがあると、そのアプリを Ruby アプリと認識します。
デプロイしたデモ用アプリには、事前に次のような Gemfile
が用意されています。
source 'https://rubygems.org'
ruby '>= 2.5', '< 3.1'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.2.3'
# Use postgresql as the database for Active Record
gem 'pg', '~> 0.18'
# Use SCSS for stylesheets
gem 'sass-rails'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier'
...
Gemfile
ファイルでは、アプリケーションと一緒にインストールする必要がある依存関係を指定します。 このファイルを使うと、Heroku でアプリケーションを実行するときに使用される Ruby のバージョンを判断することもできます。
アプリをデプロイすると、Heroku はこのファイルを読み出し、bundle install
コマンドを使って適切なバージョンの Ruby と依存関係を一緒にインストールします。
アプリをローカルで実行するには、依存関係も事前にローカルにインストールする必要があります。 この Gemfile には、pg
という依存関係があります。これは、Postgres をローカルでインストールすることで解決できます。 先に進む前に Postgres をインストールしてください。
コマンド which psql
を実行するとコマンドラインに値が表示される場合は、Postgres が正しくインストールされています (実際の出力内容は異なる場合があります)。
$ which psql
/usr/local/bin/psql
次に、ローカルディレクトリで bundle install
を実行して依存関係をインストールし、アプリをローカルで実行できるようにシステムを準備します。
$ bundle install
Using rake 12.3.3
Using concurrent-ruby 1.1.5
Using i18n 1.6.0
....
Using turbolinks 5.2.0
Using uglifier 4.1.20
Your bundle is complete!
依存関係がインストールされたら、アプリをローカルで実行する準備は完了です。
アプリをローカルで実行する
お使いの開発環境でアプリをローカル実行するには、若干の作業が必要です。 Rails では通常データベースが必要です。このサンプルアプリケーションでは Postgres を使用しています。ローカルでのインストールについては、こちらの手順を参照してください。
Rails アプリでもデータベースを使用するので、rake コマンドを使って適切なデータベースとテーブルを作成する必要があります。
$ bundle exec rake db:create db:migrate
== 20140707111715 CreateWidgets: migrating ====================================
-- create_table(:widgets)
-> 0.0076s
== 20140707111715 CreateWidgets: migrated (0.0077s) ===========================
heroku local
コマンドを使ってアプリケーションをローカルで起動します。このコマンドは、Heroku CLI の一部としてインストールされています。
$ heroku local web
2:25:39 PM web.1 | [69863] Puma starting in cluster mode...
2:25:39 PM web.1 | [69863] * Version 4.1.1 (ruby 2.6.3-p62), codename: Fourth and One
2:25:39 PM web.1 | [69863] * Min threads: 5, max threads: 5
2:25:39 PM web.1 | [69863] * Environment: development
2:25:39 PM web.1 | [69863] * Process workers: 2
2:25:39 PM web.1 | [69863] * Preloading application
2:25:40 PM web.1 | [69863] * Listening on tcp://0.0.0.0:5000
2:25:40 PM web.1 | [69863] Use Ctrl-C to stop
2:25:40 PM web.1 | [69863] - Worker 0 (pid: 69864) booted, phase: 0
2:25:40 PM web.1 | [69863] - Worker 1 (pid: 69865) booted, phase: 0
Heroku と同じように、heroku local
も Procfile
を確認して実行する内容を判断します。
Web ブラウザで「http://localhost:5000」を開きます。ローカルで実行されているアプリが表示されます。
アプリのローカル実行を停止するには、CLI で Ctrl
+C
を押して終了します。
ローカルの変更をプッシュする
このステップでは、アプリケーションへのローカルでの変更を Heroku に反映させる方法を学びます。 例として、アプリケーションを変更して依存関係を追加し、それを使用するコードも追加します。
Gemfile
を編集して gem 'cowsay'
という行を追加し、cowsay
gem の依存関係を含めます。
source 'https://rubygems.org'
ruby '>= 2.5', '< 3.1'
gem 'cowsay'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.2.3'
...
この gem を使用するように app/views/welcome/index.erb
を編集します。ファイルの最初の数行を次のように変更します。
<pre>
<%= Cowsay.say("Hello", "Cow") %>
</pre>
...
ローカルでテストします。
$ bundle install
$ heroku local
「http://localhost:5000」でアプリケーションにアクセスすると、ASCII アートが表示されます。
次は、このローカルの変更を Heroku にデプロイします。
Heroku へのデプロイは、ほとんどの場合、このパターンで行います。 まず、変更したファイルをローカルの git リポジトリに追加します。
$ git add .
次に、変更内容をリポジトリにコミットします。
$ git commit -m "Demo"
前と同じ方法でデプロイします。
$ git push heroku main
最後に、すべて正常に動作しているかどうかを確認します。
$ heroku open
アドオンをプロビジョニングする
アドオンは、アプリケーションですぐに使える追加サービスを提供するサードパーティのクラウドサービスです。永続性、ログ記録、モニタリングなど、さまざまなアドオンがあります。
Heroku では、デフォルトで 1500 行のアプリケーションログが記録されますが、 完全なログストリームもサービスとして提供しています。複数のアドオンプロバイダがこのサービスを利用し、ログの永続化、検索、メールや SMS 通知などの機能を実現するログサービスを提供しています。
このステップでは、このようなログに関するアドオンの 1 つである、Papertrail をプロビジョニングします。
Papertrail のアドオンをプロビジョニングします。
$ heroku addons:create papertrail
Adding papertrail on polar-inlet-4930... done, v11 (free)
Welcome to Papertrail. Questions and ideas are welcome (support@papertrailapp.com). Happy logging!
Use `heroku addons:docs papertrail` to view documentation.
アドオンがデプロイされ、アプリケーション用に設定されました。 アプリのアドオンは、次のコマンドで一覧表示できます。
$ heroku addons
このアドオンが動作していることを確認するため、アプリケーションの Heroku URL に数回アクセスします。アクセスする度にログメッセージが生成され、Papertrail のアドオンに送られるようになります。 Papertrail のコンソールにアクセスし、ログメッセージを確認します。
$ heroku addons:open papertrail
ブラウザで Papertrail の Web コンソールが開き、最新のログイベントが表示されます。 このインターフェースでは、検索したり通知を設定したりできます。
コンソールを起動する
One-off dyno で、heroku run
コマンドを使ってコマンド (通常はアプリの一部を構成するスクリプトやアプリケーション) を実行できます。 このコマンドを使うと、ローカルのターミナルにアタッチされた REPL プロセスを起動することもできます。これは、アプリの環境で試行錯誤するのに便利です。
$ heroku run rails console
Running rails console on ⬢ polar-inlet-4930... up, run.1360 (Eco)
Loading production environment (Rails 5.2.3)
irb(main):001:0>
Error connecting to process
というエラーが表示された場合は、ファイアウォールの設定が必要な可能性があります。
起動したコンソールには、アプリ全体が読み込まれています。たとえば、puts Cowsay.say("hi","Cow")
と入力すると「hi」という吹き出しの付いた動物が表示されます。コンソールを終了するには、exit
と入力します。
irb(main):001:0> puts Cowsay.say("hi", "Cow")
____
| hi |
----
\
\
.--.
|o_o |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/
=> nil
irb(main):002:0> exit
dyno の仕組みに慣れるため、別の One-off dyno を作成し、この dyno でシェルを開く bash
コマンドを実行してみましょう。 シェルが開いたら、そこでコマンドを実行できます。 dyno にはそれぞれ固有の一時的なファイル領域が割り当てられ、アプリとその依存関係がそこに格納されます。コマンド (この場合は bash
) が完了すると、dyno は削除されます。
$ heroku run bash
Running `bash` attached to terminal... up, run.1421
~ $ ls
app config db Gemfile.lock log public README.md tmp
bin config.ru Gemfile lib Procfile Rakefile test vendor
~ $ exit
exit
必ず exit
と入力してシェルを閉じ、dyno を終了してください。
環境設定を定義する
Heroku では、設定を外部に置き、暗号鍵や外部リソースのアドレスなどのデータを環境設定に保存できます。
環境設定は、ランタイムに環境変数としてアプリケーションに提供されます。 例として、app/views/welcome/index.erb
を編集し、環境変数 TIMES
の値に応じてあるアクションを繰り返し実行するメソッドを追加します。 ファイルの最初の数行を次のように変更します。
<% for i in 0..(ENV['TIMES'] ? ENV['TIMES'].to_i : 2) do %>
<p>Hello World #<%= i %>!</p>
<% end %>
heroku local
は、ローカルディレクトリにある .env
ファイルの内容に応じて、環境を自動的に設定します。 プロジェクトのトップレベルディレクトリにはすでに .env
ファイルがあり、以下の行が含まれています。
TIMES=10
heroku local
でアプリを実行すると、「Hello World」というテキストが 10 回表示されます。
Heroku で環境設定を設定するには、次のコマンドを実行します。
$ heroku config:set TIMES=10
heroku config
を使って設定した環境設定を表示します。
$ heroku config
== polar-inlet-4930 Config Vars
PAPERTRAIL_API_TOKEN: erdKhPeeeehIcdfY7ne
TIMES: 10
変更したアプリケーションを Heroku にデプロイして、動作を確認します。
データベースを使う
add-on marketplace には、Redis や MongoDB、Postgres、MySQL など、多数のデータストアが揃っています。 このステップでは、Heroku Postgres Mini アドオンについて学びます。このアドオンは、どの Rails アプリをデプロイした場合も、自動的にプロビジョニングされます。
データベースはアドオンなので、CLI で addons
コマンドを使うと、アプリにプロビジョニングされたデータベースの詳細についてもう少し確認できます。
$ heroku addons
Add-on Plan Price State
────────────────────────────────────────────── ───────── ───── ───────
heroku-postgresql (postgresql-encircled-75487) eco eco created
└─ as DATABASE
papertrail (papertrail-asymmetrical-81999) choklad free created
└─ as PAPERTRAIL
The table above shows add-ons and the attachments to the current app (polar-inlet-4930) or other apps.
アプリの環境設定を一覧表示すると、アプリがデータベースに接続するときに使用する URL (DATABASE_URL
) が表示されます。
$ heroku config
=== polar-inlet-4930 Config Vars
DATABASE_URL: postgres://xx:yyy@host:5432/d8slm9t7b5mjnd
HEROKU_POSTGRESQL_BROWN_URL: postgres://xx:yyy@host:5432/d8slm9t7b5mjnd
...
Heroku には、さらに詳細を表示する pg
コマンドもあります。
$ heroku pg
=== DATABASE_URL
Plan: Mini
Status: Available
Connections: 0/20
PG Version: 11.5
Created: 2019-09-18 13:22 UTC
Data Size: 8.0 MB
Tables: 3
Rows: 0/10000 (In compliance) - refreshing
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
Add-on: postgresql-elliptical-30581
表示内容から、Mini データベースを使っており、実行している Postgres のバージョンは 11.5 で、1 行のデータがあることがわかります。
デプロイしたサンプルアプリにはデータベース機能が備わっています。これにはウィジェット用のコントローラとデータベースモデルがあり、アプリの URL に「/widgets」と追加することでアクセスできます。
実際に URL にアクセスすると、エラーページが表示されます。heroku logs
または Papertrail でエラーメッセージを確認すると、次のようになっています。
2014-07-08T14:52:37.884178+00:00 app[web.1]: Started GET "/widgets" for 94.174.204.242 at 2014-07-08 14:52:37 +0000
2014-07-08T14:52:38.162312+00:00 heroku[router]: at=info method=GET path="/widgets" host=fox828228.herokuapp.com request_id=3755bb46-4de2-4434-a13a-26ec73e53694 fwd="94.174.204.242" dyno=web.1 connect=0 service=294 status=500 bytes=955
2014-07-08T14:52:38.078295+00:00 app[web.1]: Processing by WidgetsController#index as HTML
....
2014-07-08T14:52:38.146062+00:00 app[web.1]: PG::UndefinedTable: ERROR: relation "widgets" does not exist
ここでは、データベースへの接続は成功したものの、必要なテーブルが見つからなかったことがわかります。 Rails では、rake db:migrate
を実行して解決できます。 Heroku でこのコマンドを実行するには、次のように One-off dynoで実行します。
$ heroku run rake db:migrate
Running `rake db:migrate` attached to terminal... up, run.3559
Migrating to CreateWidgets (20140707111715)
== 20140707111715 CreateWidgets: migrating ====================================
-- create_table(:widgets)
-> 0.0244s
== 20140707111715 CreateWidgets: migrated (0.0247s) ===========================
Web プロセスタイプが dyno で実行されるのと同様に、この rake コマンドも dyno で実行されています。 Heroku は新しい dyno を起動し、用意していたアプリを追加して、その環境でコマンドを実行します。その後、dyno は削除されます。 dyno は接続されたアドオンでこの処理を実行するので、理想的な方法と言えます。
ここで、アプリの /widgets
ページにもう一度アクセスすると、ウィジェットのレコードを一覧表示して、作成できるようになっています。
ローカル環境に Postgres をインストールしている場合は、データベースを直接操作することもできます。 たとえば、次のように psql
を使ってデータベースに接続し、クエリを実行できます。
$ heroku pg:psql
d8slm9t7b5mjnd=> select * from widgets;
id | name | description | stock | created_at | updated_at
----+-----------+--------------+-------+----------------------------+----------------------------
1 | My Widget | It's amazing | 100 | 2014-07-08 15:05:13.330566 | 2014-07-08 15:05:13.330566
(1 row)
詳細は、「Heroku PostgreSQL」を参照してください。
次のステップ
ここまで、アプリのデプロイ、アプリの設定変更、ログの表示、スケール、アドオンのアタッチを行う方法を説明しました。
次にお勧めするリソースを紹介します。
- 「Heroku の仕組み」では、アプリケーションの作成、設定、デプロイ、および実行時に必要な技術的な概念の概要を紹介しています。
- Ruby サポートカテゴリでは、Ruby アプリケーションの開発とデプロイに関する詳細を確認できます。
- 「Heroku スターターガイド (Rails 7.x)」では、Rails アプリのデプロイについて詳しく説明しています。
- Heroku の開発者としての体験および CI/CD 機能についての詳細は、「Heroku Enterprise Developer Learning Journey」を参照してください。