0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitLabからHerokuにデプロイする方法

0
Posted at

こんにちは。ものすごく久しぶりにQiitaの投稿を書きました。
最近はAIを使って記事を書けるので便利ですね。

1. GitLab CI/CDから直接Herokuにデプロイする(コンテナデプロイ)の詳細

このパターンは、GitLab CI/CDランナー上でDockerイメージをビルドし、Herokuが提供するコンテナレジストリを経由してHerokuアプリケーションを更新する、最も高度に自動化された方法です。

ステップと内部処理

ステップ 手順(GitLab CI/CDジョブ内) 内部で起きていること
1. 認証とログイン docker login -u _ --password-stdin registry.heroku.com GitLab変数に登録された**HEROKU_API_KEY**をパスワードとして使用し、CI/CDランナーがHeroku Container Registryへのアクセス権を取得します。
2. イメージのビルド docker build -t ... . プロジェクトルートの**Dockerfile**に基づき、アプリケーションと依存関係を含む自己完結型のDockerイメージが作成されます。このイメージには、Herokuが期待するタグ(例:registry.heroku.com/app-name/web)が付与されます。
3. イメージのプッシュ docker push ... ビルドされたDockerイメージが、認証済みのHeroku Container Registryにアップロードされます。これは、アプリケーションの新しいバージョンがHerokuのインフラに格納された状態です。
4. リリース heroku container:release web --app $HEROKU_APP_NAME Heroku CLIがHeroku APIに対し、「プッシュされた最新のwebイメージを、ターゲットアプリ($HEROKU_APP_NAME)の新しいバージョンとしてデプロイせよ」という指示を送ります。Herokuは既存のDynoを新しいイメージに切り替え(ローリングデプロイ)、トラフィックを新しいバージョンに向けます。

キーポイント

  • Dockerfile: HerokuはProcfileではなく、DockerfileCMDENTRYPOINTの指示に従ってプロセス(Dyno)を起動します。
  • ゼロダウンタイム: Herokuのリリースプロセスは、通常、新しいDynoが起動して正常性を確認してからトラフィックを切り替えるため、ゼロダウンタイムデプロイが実現されます。

2. GitLabからGitHubを経由してデプロイするの詳細

この方法は、Herokuのネイティブな「GitHubデプロイ」機能を利用するために、GitLabをGitHubのミラーリング元として利用します。

ステップと内部処理

ステップ 手順 内部で起きていること
1. GitLabへのプッシュ 開発者がgit pushをGitLabに実行 コードがGitLabのリモートリポジトリに格納されます。
2. リポジトリのミラーリング GitLabが設定に基づき自動実行 GitLabは、新しいコミットを検知し、設定されたGitHubリポジトリに対し、**git push**処理を実行します。GitHubのリポジトリがGitLabと同じ状態に保たれます。
3. Herokuによる検知 GitHub WebhookがHerokuに通知 GitHubに設定されているWebhook(Herokuとの連携時に自動設定される)が、新しいコミットがプッシュされたことをHerokuに通知します。
4. Herokuのビルド開始 Herokuが自動実行 HerokuはGitHubから最新のコードを取得し、Slug Compiler(ビルドシステム)を起動します。アプリケーションの言語に基づき、Buildpackが実行され、依存関係のインストールやアセットのコンパイルが行われ、実行可能なSlug(アプリケーションのバイナリパッケージ)が作成されます。
5. リリースとデプロイ Herokuが自動実行 作成されたSlugがHerokuのDyno(実行環境)に展開され、アプリが再起動されます。

キーポイント

  • Buildpack: Herokuがコードを自動で認識し、最適なBuildpack(例:Ruby Buildpack、Node.js Buildpack)を選択・適用してビルドを行います。
  • ミラーリングの遅延: GitLabからGitHubへのミラーリングに数秒〜数十秒の遅延が発生する可能性があるため、デプロイ完了までの時間はパターン1より長くなる場合があります。

3. ローカルPCを経由してデプロイする(git push heroku main)の詳細

これは、HerokuのGitリモート機能を利用する最も伝統的な手動デプロイ方法です。

ステップと内部処理

ステップ 手順(ローカルPCでの実行) 内部で起きていること
1. リモートの追加 heroku create my-app Heroku上に新しいアプリが作成され、ローカルの.git/configファイルに**herokuという名前のGitリモート**が追加されます。
2. デプロイの実行 git push heroku main ローカルのmainブランチの全ファイルが、SSHプロトコル経由でHerokuサーバーのGitリポジトリに送信されます。
3. Herokuのビルド開始 Herokuが自動実行 Herokuサーバーはプッシュを受信すると、パターン2と同様にSlug Compilerを起動し、Buildpackを使用してコードをコンパイルし、実行可能なSlugを作成します。
4. リリースとデプロイ Herokuが自動実行 作成されたSlugがDynoにロードされ、アプリケーションが再起動されます。

キーポイント

  • Gitの裏ワザ: Herokuは、デプロイ時に受け取ったGitコミットを単なるコードの転送手段として利用し、その場でビルドを開始します。これは通常のGit操作(ピアリポジトリへのプッシュ)とは異なり、サーバー側でデプロイ処理をトリガーする特殊な挙動です。
  • 手動トリガー: 開発者が手動でgit pushコマンドを実行する必要があるため、自動化はされません。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?