前回の記事
Rails5.1.2 + Webpacker + ReactをCapstranoでデプロイする手順書①
Rails5.1.2 + Webpacker + ReactをCapstranoでデプロイする手順書②
前書き
前回にて、RailsアプリをCapistranoでデプロイするところまでやりました。
今回は、 CircleCI を使って、Capistranoデプロイを行えるようにやってみました。
CircleCiの設定
GUI側の設定
GUI側では、CapistranoがSSHでサーバへログインするためにKeyの設定をします。
CircleCIのプロジェクトの設定から、 SSH Permissionのページへ行きます。
そこで、下記の画面になるので、 Add SSH Key から
接続先(ドメイン、またはIP)と、SSH Keyを記述して保存します。
GUIの設定は以上です。
保存が完了すれば以下の画面になるので、そこの fingerprints 項目に表示されている文字列は設定ファイルで利用します。
この設定で、CircleCIのDockerの中に、~/.ssh/id_rsaとして、SSH Keyが保存されるようになります。
設定ファイル
最終的に出来た設定ファイルが以下の通りです、とりあえずこれでデプロイは出来ました。
# .circleci/config.yml
version: 2
jobs:
build:
docker:
- image: ruby:2.3.1-alpine
working_directory: /home/circleci/{{アプリ名}}
steps:
- setup_remote_docker:
reusable: true
- run:
name: システム依存関係のインストール
command: apk add --update --no-cache linux-headers git openssh-client tar gzip build-base tzdata mariadb-dev
- checkout
- restore_cache:
name: Bundleキャッシュの復元
keys:
- gems-{{ .Environment.CACHE_KEY }}-{{ checksum "Gemfile.lock" }}
- gems-{{ .Environment.CACHE_KEY }}-
- run:
name: Ruby依存関係のインストール
command: bundle check || bundle install --jobs=4 --retry=3
- save_cache:
name: Bundleキャッシュの保存
key: gems-{{ .Environment.CACHE_KEY }}-{{ checksum "Gemfile.lock" }}
paths:
- /usr/local/bundle
- add_ssh_keys:
fingerprints:
- {{fingerprints}}
- deploy:
name: Capistranoデプロイ
command:
bundle exec cap production deploy
解説
Environment.CACHE_KEYはこちらが独自にCircleCIのGUIで設定している環境変数になります。
特に、ハマったポイントは、システム依存関係のインストールです。
mariadb-dev(旧: mysql-dev)をシステム依存としてインストールが必要な点でした。
add_ssh_keysに先ほどのfinderprintsを指定することで、SSH Keyとして利用できるようになります。
その次のハマりポイントとして、Capistranoのconfig/deploy/production.rbの中身です。
鍵の場所を指定する際、~/.ssh/id_rsaでいけると思ったのですが、rsaの後ろにfingerprintsの:抜きの記述が必要でした。
具体的には、~/.ssh/id_rsa_aa11111111111~~ のように鍵を指定すれば、Docker上で認識され、CapistranoがサーバへSSHログイン可能になります。
これで、masterへpushすると、CircleCIで設定ファイルのタスクが実行され、最終的にCapistranoデプロイが走り、サーバへデプロイされるようになります。
サーバのスペック、アプリの大きさに左右されるかもしれませんが、大体、2分ぐらいでデプロイできました。
後書き
Capistranoデプロイを初めにやった時、CircleCI上でどうやって鍵を指定するのだろうかと、悩んでいましたが
CircleCIの設定画面を見ていると、鍵を保存する場所があったので思ったより簡単に出来ました。
これで、masterへpushするだけで、サーバ上へデプロイされるようになり、アプリ開発が捗ります。
※ 鍵の指定の方法は、他にいい書き方があるのかもしれません。。。