capistrano
CircleCI
Rails5

CapistranoデプロイをCircleCIでやってみた

前回の記事

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を記述して保存します。

スクリーンショット_2017-09-08_17_12_02.png

GUIの設定は以上です。
保存が完了すれば以下の画面になるので、そこの fingerprints 項目に表示されている文字列は設定ファイルで利用します。

スクリーンショット_2017-09-08_17_17_19.png

この設定で、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するだけで、サーバ上へデプロイされるようになり、アプリ開発が捗ります。

鍵の指定の方法は、他にいい書き方があるのかもしれません。。。