ウェブサービスを作っています。

CircleCI 2.0 + Capistrano で自動デプロイ

CircleCI 2.0 で、Rails アプリを自動デプロイする設定例です。

ミドルウェアとして、MySQL と Elasticsearch を使用しています。

2017/11/30 現在の情報となります。


.circleci/config.yml (インデントが 4 スペースの場合があるので注意)

ruby_image: &ruby_image
  circleci/ruby:2.4.2

bundle_cache_key: &bundle_cache_key
  bundle-{{ checksum "Gemfile.lock" }}

version: 2

jobs:
  build:
    docker:
      - image: *ruby_image
        environment:
          DATABASE_URL: "mysql2://root@127.0.0.1/circle_test"
          RAILS_ENV: test
      - image: circleci/mysql:5.7
      - image: docker.elastic.co/elasticsearch/elasticsearch:5.6.4
        environment:
          xpack.security.enabled: false

    steps:
      - checkout

      - restore_cache:
          key: *bundle_cache_key

      - run:
          name: Bundle Install
          command: bundle install --jobs=4 --retry=3 --path vendor/bundle

      - save_cache:
          key: *bundle_cache_key
          paths:
            - vendor/bundle

      - run:
          name: Wait for DB
          command: dockerize -wait tcp://localhost:3306 -timeout 1m

      - run:
          name: Wait for Elasticsearch
          command: dockerize -wait tcp://localhost:9200 -timeout 1m

      - run: bin/rails db:schema:load --trace

      - run: bundle exec rspec --format progress

  deploy:
    docker:
      - image: *ruby_image

    steps:
      - checkout

      - restore_cache:
          key: *bundle_cache_key

      - run:
          name: Deploy
          command: |
            bundle config --local path vendor/bundle
            .circleci/deploy.sh

workflows:
  version: 2

  build-and-deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: master

.circleci/deploy.sh (実行権限をつける)

#!/bin/bash

set -ex

cat <<EOF >> $HOME/.ssh/config
Host xxx
  HostName xxx.xxx.xxx.xxx
  User xxx
  ...
EOF

bundle exec cap production deploy

あとは CircleCI のプロジェクト設定で、SSH 鍵の設定を行います。

「ふるふる」のスマホ版ができました

ふるさと納税の返礼品検索サイト「ふるふる」のスマートフォン版ができました。

ふるふる

サービス開始から 1 年ほど経ち、使ってくださる方も増えました。

年末の利用が多いですね。

スマートフォン版は、スキマ時間などに使っていただければうれしいです。

まだまだ改善点はありますが、ゆっくりやっていこうと思います。

どうぞご利用ください。

Git のコミット前に sass-lint を実行する

追記(2022/1/26): husky v7.0.4 と lint-staged v12.3.1 で動くように修正しました。

昨日の記事 の続きです。

sass-lint -v を手動で実行するのは大変なので、git commit 時に自動実行するようにします。


必要なツールのインストール。

yarn add lint-staged husky --dev

package.json に以下を追加。

{
  "lint-staged": {
    "*.sass": "sass-lint -v -q"
  },

  "scripts": {
    "prepare": "husky install"
  }
}

husky の 設定。

yarn run prepare
yarn run husky add .husky/pre-commit "yarn lint-staged"

.sass-lint.yml を修正して、warning ではなく error になるようにします。

options:
  merge-default-rules: false

files:
  include: 'app/assets/stylesheets/**/*.sass'

rules:
  hex-length: 2
  mixins-before-declarations: 2
  no-trailing-whitespace: 2
  pseudo-element: 2
  property-sort-order: 2
  zero-unit: 2

以上で、Lint が通らないとコミットできなくなります。

参考

sass-lint を導入する

CSS は、Sass (*.sass) で書いているのですが、プロパティの順番をアルファベット順にしたくて sass-lint を導入してみました。


インストール

npm install -g sass-lint

.sass-lint.yml。便利そうな設定もいくつか追加。

必要最低限の設定にしたいので、merge-default-rules オプションは false にします。

options:
  merge-default-rules: false

files:
  include: 'app/assets/stylesheets/**/*.sass'

rules:
  hex-length: 1
  mixins-before-declarations: 1
  no-trailing-whitespace: 1
  pseudo-element: 1
  property-sort-order: 1
  zero-unit: 1

実行します。

sass-lint -v

参考

法人本店移転の手順

一人で会社をやっていて、管轄法務局が変わる法人移転をする場合の方法メモです。

メインタスク

  1. 移転前の法務局に行く (相談窓口があります)
  2. 登記移転をする
  3. 「移転後」の法務局で、印鑑カードの交付申請をする
  4. 移転前の税務署に、異動届を出す
  5. 移転前の都税事務所に、異動届を出す
  6. 移転前の年金事務所に、事業所所在地変更届を出す

TODO

  • 郵便転送手続き
  • 銀行 (法人口座) の住所変更
  • ホームページの住所変更
  • ドメインの住所変更
  • メール署名の住所変更
  • ASP の住所変更
  • 法人クレカの住所変更
  • 個人型確定拠出年金 所在地変更手続き (http://www.benefit401k.com/tanenkin/sbi/)
  • 勤務先の住所変更
  • 会計事務所に連絡
  • 名刺の作成

参考リンク

全角や空白を含む問い合わせ番号でも検索できる Elasticsearch の analyzer

elasticserach-rails での設定例です。

settings(
  analysis: {
    filter: {
      whitespace_remove: {
        type: 'pattern_replace',
        pattern: "\\p{javaWhitespace}",
        replacement: ''
      }
    },
    
    analyzer: {
      my_code_analyzer: {
        type: 'custom',
        filter: [
          'icu_normalizer',
          'whitespace_remove'
        ],
        tokenizer: 'keyword'
      }
    }
  })

実際の DB データをテストで使用する

Rails で開発していると、実際に使っている DB のデータを、テストで使用したい場合があります。

そのような場合、seed_dumpactiverecord-import を使ってうまく実現することができました。


Gemfile

group :development do
  gem 'seed_dump'
end

group :test do
  gem 'activerecord-import'
end

使わない環境では、gem を読み込まないようにします。


script/dump_models.rb

DUMPED_MODELS = [Site, Category, SubCategory]
OUTPUT_FILE = 'spec/fixtures/seed.rb'

DUMPED_MODELS.each_with_index do |model, i|
  options = {
    append: (i > 0),
    file: OUTPUT_FILE,
    exclude: [:created_at, :updated_at],
    import: true,
  }

  SeedDump.dump model, options
end

ダンプ用のスクリプトです。

モデルの関連を考慮して、DUMPED_MODELS の順番を決めます。

seed_dump のデフォルトでは id カラムが出力されませんが、モデルの関連があるので、id が出力されるように exclude オプションを調整します。

また activerecord-import を使うので、import オプションを true にします。


開発環境などでスクリプトを実行し、データをダンプします。

rails runner script/dump_models.rb

spec/fixtures/seed.rb にインポート用のファイルが出力されます。


最後に、RSpec で seed タグが設定されている example に対し、データがロードされるようにします。

spec/support/shared_context/seed.rb

RSpec.shared_context 'Importing seed' do
  before { load Rails.root.join('spec/fixtures/seed.rb') }
end

RSpec.configure do |config|
  config.include_context 'Importing seed', :seed
end

テストの例です。

describe FooJob, '#perform', :seed do
  it 'seed が設定されている' do
    expect(Site.count).not_to eq 0
  end
end

activerecord-import を使うとインポート速度が上がり、テストが速くなるので便利です。