2022.06.27[Mon]
[シリーズ連載] Dokku + Github Actions でプルリクエストに連動したサーバーを立てる

Dokku + Github Actions でプルリクエストに連動したサーバーを立てる 前編

  • Docker
  • CI/CD

目次

レポジトリ運用において、変更が承認されマージされたらサーバーにデプロイされる仕組みは既に多くの方が取り入れていると思います。
しかし、マージ前(=プルリクエスト)の状態でそのコードを反映したアプリケーションをサーバーに上げられると、確認環境として共有したり数パターンの変更を並べて見ることができたりと便利です。本記事では、Dokkuを用いたプルリクエスト連動CI環境の作成を紹介します。

Dokkuとは、アプリケーションのデプロイ環境を手軽に作成できるPlatform as a Service (PaaS)です。オープンソースであり、無料で利用できます。DokkuとGithub Actionsと合わせることで比較的簡単にこのCI環境を作成できます。

公式サイト
Dokku https://dokku.com/docs/getting-started/installation/
Github Actions https://docs.github.com/ja/actions

環境

Ubuntu 22.04
Dokku 0.27.4

サーバーインスタンスを起動

Dokkuをインストールするためのサーバーを起動します。
本記事ではAWS EC2インスタンスを使います。GCP等別のサービスを使う場合は適宜読み替えてください。

Dokkuのドキュメント上の要求スペックは1GB RAMと書かれていますが、アプリケーションコンテナを複数起動するので実際はもっと多いほうがいいです。アプリケーションやチームの大きさ・利用頻度に合わせて変更してください。
またDockerはストレージを結構使うので、追加のストレージが必要になります。利用頻度にもよりますが、128GBくらいはあった方がいいと思います。(ちなみに当社では t3.large + 128GB です)

ドメインの設定

Dokkuをホストするサーバー用にドメインを用意します。持っていない場合はお名前.com、Route53などのDNSサービスで取得してください。
更に、今回のDokku用のサブドメインを作成します。管理画面から、先ほど起動したサーバーのIPアドレス宛に dokku.yourdomain.com, *.dokku.yourdomain.com (以下、サンプルではこのドメインで進めます)のAレコードを作成します。

Dokkuをインストール

まずは公式ドキュメントに沿ってインストールを進めます。( https://dokku.com/docs/getting-started/installation/#getting-started-with-dokku )

インスタンスにSSHでログインした後、Dokkuをインストールします。

# on dokku server
wget https://raw.githubusercontent.com/dokku/dokku/v0.27.4/bootstrap.sh;
sudo DOKKU_TAG=v0.27.4 bash bootstrap.sh

# dokkuユーザーが使う鍵とドメインを登録
# ドキュメントに sudo は入っていませんが、必要なようです
cat ~/.ssh/authorized_keys | sudo dokku ssh-keys:add admin

dokku domains:set-global dokku.yourdomain.com

サンプルアプリの作成

次に、ローカルでデプロイするサンプルのアプリを作成します。
サンプルとしては create-next-app ( https://nextjs.org/docs/getting-started )等で構いません。が、ちゃんとしたアプリがあればそちらを使ってもいいです。
作成したら、githubにもレポジトリを作ってこのアプリケーションをプッシュしておきます。

アプリケーションのデプロイ

他にもいくつか方法がありますが、今回は基本となる「サーバー上にクローンしたレポジトリに変更をプッシュする方法」でdokkuサーバーにデプロイします。後ほどGithub Actionsの設定を行いますが、試しにmainブランチを手動デプロイしてみます。

# dokkuサーバー上で
dokku apps:create main

# ローカルのターミナルで
git remote add dokku dokku@<dokku.yourdomain.com>:<レポジトリ名>
git push dokku main:master
=====> Application deployed:
       http://<レポジトリ名>:dokku.yourdomain.com

pushのログが⇡ のように出れば成功です。
http://<レポジトリ名>.dokku.yourdomain.com にアクセスするとサンプルアプリのホーム画面が出ているはずです。

SSL証明書の作成

そのままだとhttpなので、Let's EncryptでSSL化します。
Dokkuがdokku-letsencryptというプラグインを用意しています。ワイルドカードが未サポートの様ですが(issueの投稿によればサポートする可能性はあるようです)、自動でやってはくれるので、少々汚いですがブランチごとにこのプラグインで取り直す形を取ります。
(別で取得した場合は certs:add します。詳しくは https://dokku.com/docs/deployment/application-deployment/#setting-up-ssl

sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
dokku domains:set <レポジトリ名> <レポジトリ名>.dokku.yourdomain.com

改めて  https://<レポジトリ名>.dokku.yourdomain.com にアクセスして、鍵マークが付いていれば完了です。
後編ではGithub Actionsとの連携を設定します。

Share

  1. 01 Dokku + Github Actions でプルリクエストに連動したサーバーを立てる 前編
  2. 02 Dokku + Github Actions でプルリクエストに連動したサーバーを立てる 後編 >
Dokku + Github Actions でプルリクエストに連動したサーバーを立てる 後編Shopify アプリ開発(GraphQL準備編)