とーますメモ

Ruby on Rails / Goなどの学習メモ

【CircleCI2.0】Rspecの並行テストの設定

RailsのCircleCIのサンプルyml(Sample.yml)を見ると
以下のような記述がある

# run tests!
- run:
    name: run tests
    command: |
      mkdir /tmp/test-results
      TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"

      bundle exec rspec --format progress \
                      --format RspecJunitFormatter \
                      --out /tmp/test-results/rspec.xml \
                      --format progress \
                      "${TEST_FILES}"

初見では、正直何をやってるのかわからなかったが
rspecでテストを行っているコードなのはわかる。

試しに動作させてみると、こんなエラーがでたが

LoadError: cannot load such file -- rspec_junit_formatter

よく調べてみると、これは「rspec_junit_formatter」というgemを
入れてないから発生していたエラーだった。

とりあえずインストールしたら、

gem install rspec_junit_formatter

ちゃんと動作した。


[参考]
discuss.circleci.com
codenote.net

【CircleCI2.0 ✕ Rails】database.ymlはpushしたくないけど、CircleCIを使うにはpushしないといけない問題

自社の開発では、database.ymlは
.gitignoreに追加し、リポジトリにpushしない方針にしている。

そしてチームメンバーは各々のユーザ名やパスワードを
database.ymlに設定し、各環境のDBを使用する。
※チームメンバーの開発環境(VM)が全て同じものであるならば不要だと思う。

しかし、CircleCIを使用する場合、
database.ymlをpushしないとCircleCI上でDB設定ができないっぽいので
pushしないといけない。

そんなとき、便利なのが
「config」っていうgem。

設定は以下のページを参考にする。
qiita.com

settings.local.ymlにはローカル環境の設定を書いておき、
settings.ymlにはCircleCI用の設定を書いておく。

※settings.local.ymlはコマンドで自動作成されたときに
自動的に.gitignoreに設定されるので、pushしてもgitHubには転送されない。

そして以下のように設定すれば、公開したくない情報を公開せず
database.ymlをpushできる。

settings.local.yml

db:
  username: 'dev_user'
  password: 'dev_password'


settings.yml

db:
  username: 'root'
  password: ''


database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

test:
  <<: *default
  password: <%= ENV['DB_PASSWORD'] || Settings[:db][:password] %>
  host: <%= ENV['DB_HOST'] || 'localhost' %>
  database: dummy_test


config.yml

...
     docker:
        - image: circleci/ruby:2.4.1-node-browsers
          environment:
            RAILS_ENV: test
            DB_HOST: 127.0.0.1
            DB_PASSWORD: ''

        - image: circleci/mysql:5.7
        ...

かなり回りくどいが現在はこの設定で対応している。
もっと他によりやり方が、あるようだったら是非教えて頂きたい。。

【CircleCI2.0】困った!RailsとMySQLのconfig.yml設定

CircleCI2.0の公式サイトを見ると、PostgreSQLについての設定例はあるのだが
一番知りたいMySQLの設定例が無い。

circleci.com

そして、自分は今回初めてCircleCIを利用する初心者。

そして色んなサイトを参考にしようと、調べては見るものの
自分がよくわかっていないからか、設定ができるまでに
凄い時間がかかった。

最終的に設定したものがこれ。

config.yml

...
     docker:
        - image: circleci/ruby:2.4.1-node-browsers
          environment:
            RAILS_ENV: test
            DB_HOST: 127.0.0.1
            DB_USERNAME: 'root'
            DB_PASSWORD: ''

        - image: circleci/mysql:5.7
        ...


database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

test:
  <<: *default
  username: <%= ENV['DB_USERNAME'] || 'xxxxxxxxxx' %>
  password: <%= ENV['DB_PASSWORD'] || 'ppppppppp' %>
  host: <%= ENV['DB_HOST'] || 'localhost' %>
  database: dummy_test


ポイントは以下の2点

  1. rubyのimageに設定するenvironment(環境変数)は、railsのdatabase.yml内で使用できるという点
  2. database.ymlのhostには「127.0.0.1」が設定されるようにする。localhostだとエラーになる。

またdatabase.yml内の'xxxxxxxxxx'と、'ppppppppp'の箇所には、
それぞれローカル環境で使用する「ユーザ名」と「パスワード」を設定する。
そうすれば、この設定だけでローカルでもCircleCIでもテストができる。

[参考リンク]

discuss.circleci.com
discuss.circleci.com

【CircleCI2.0】config.ymlのworking_directoryの設定と、Gemのキャッシュ

working_directoryを設定することで
リポジトリをチェックアウトする場所を設定するが
何も設定しない状態だと、

デフォルトのチェックアウト場所は

「home/circleci/project」

になる。

将来的に複数のプロジェクトを利用するなどの場合を想定すると
それぞれのプロジェクト毎にworking_directoryを設定したほうが良いだろう。

その場合、以下のような設定になるかと思う。

version: 2
jobs:
   build:
     working_directory: ~/my_project
     docker:
        - image: circleci/ruby:2.4.1-node-browsers
     steps:
        - checkout

        - restore_cache:
            name: Restore bundle cache
            key: my_project-{{ checksum "Gemfile.lock" }}

        - run:
            name: Run bundle install
            command: bundle install --path vendor/bundle

        - save_cache:
            name: Store bundle cache
            key: my_project-{{ checksum "Gemfile.lock" }}
            paths:
              - vendor/bundle

        ...

上記の設定の場合だと、リポジトリがチェックアウトされる場所は
「/home/circleci/my_project」になる。

また上記のように設定することで、
gemがキャッシュされ、
CircleCIが回るたびに、「bundle install」が走らなくなる。

ただし注意してほしいのは、必ずbundle installのコマンドには
「-- path vendor/bundle」を設定することと
save_cacheのpathsにvendor/bundleを設定すること。

自分の場合、bundle installに「-- path vendor/bundle」を付けておらず
毎度bundle installが実行され、かなりの時間を無駄にした。

【CircleCI2.0】入れておきたいGem

Rubocop

書かれたRubyコードが「コーディング規約」通りに
書かれているかチェックしてくれる。

チェックさせないファイルを指定したり、
一部チェックを無効化したりすることもできる。

また既存のプロジェクトに導入した場合などで
大量に直さないといけない項目がある場合の
対応法(.rubocop_todo.ymlの仕様)もある。

[参考]
blog-ja.sideci.com

Brakemen

セキュリティチェックに使用できる。
セキュリティが怪しいコードを場所を洗い出してくれる。

[参考]
wonderwall.hatenablog.com

【Shopify】アプリの種類についてまとめてみた

大きく分けて3つあるが、
使用できる基本的な機能は同じ。
ただし作り方や、一部(後述)のAPIが違う。

1)Private App

名前の通り、App Storeで公開はせず、内部だけでの使用を前提としたアプリ。
以下の3)でも説明するがPrivate Appでは「Embedded SDK API」が使用できない。

2)Public App

App Storeで販売されているアプリは全て「Public App」の分類になる。
今後、AppStoreでの販売や配布を予定されている方は、Public App形式で
アプリを作成する必要がある。

3)Unlisted App

作り方はPublic Appと同じだが、違いは「App Storeに公開されていない」ということ。
Private Appと比較し、Public AppやUnlisted Appを利用するメリットは、
「Embedded SDK API」が使用できることだ。

「Embedded SDK API」は簡単に言うと、

Shopifyのサイト内でアプリ画面を開くことができる

ということ。
※iframeみたいなイメージ

Private Appで作成する場合は、「Embedded SDK API」が
使用できないため、別サイトに情報を表示または操作するUIを作成しないと行けない。
Public Appであれば、Shopifyの管理ページ内から直にApp画面を開くことができるため
作業が捗るだろう。

[参考]
https://www.littlestreamsoftware.com/articles/shopify-app-types/