前人未踏の領域へ WEB・インフラ・プログラミング全般編

フロントエンド、バックエンド、インフラ、言語など、アプリ開発、IOT以外の記録

database.ymlの環境変数が読み込まれない

課題

DBのパスワードを設定したが環境変数が読み込まれない。stagingだと問題ないがproductionでエラーになる。

production:
  <<: *staging
  database: hoge_production
  host: <%= ENV['DB_HOST'] %>
  password: <%= ENV['DB_PASS'] %>

原因

自動生成させて設定したproduction用のパスワードの先頭に # が含まれていたため(><)
パスワード全体が全部コメント扱いになって空文字セットしたことにされてたw

対応

ダブルクウォートで囲ってあげて解決。

production:
  <<: *staging
  database: hoge_production
  host: "<%= ENV['DB_HOST'] %>"
  password: "<%= ENV['DB_PASS'] %>"

またしょうもないことで時間を無駄にした。

教訓

  • 文字列を環境変数から読み込む場合はダブルクウォートで予め囲む
  • パスワードに記号を使いたくてもプロフラムに影響しそうなのは避ける(?)

rbenv設定

UbuntuにrbenvをインストールしてRubyを使えるようにしたい。 手順メモ。

インストール

rbenv-installerを使う

github.com

$ wget -q https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer -O- | bash

PATHに .rbenv/bin を追加

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

rbenv-doctorで確認

$ wget -q https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor -O- | bash
Checking for `rbenv' in PATH: /home/ubuntu/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /home/ubuntu/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20200214-3-g92fa223)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/home/ubuntu/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK

Ruby versionsnone になっている。

Rubyのバージョン切り替え

# インストール時にエラー出る場合には以下を足す
$ sudo apt-get install build-essential libssl-dev libreadline-dev zlib1g-dev

$ rbenv install 2.6.5
$ rbenv global 2.6.5
$ ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]

確認

$ wget -q https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor -O- | bash
Checking for `rbenv' in PATH: /home/ubuntu/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /home/ubuntu/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20200214-3-g92fa223)
Counting installed Ruby versions: 1 versions
Checking RubyGems settings: OK
Auditing installed plugins: OK

参考

github.com

Capistrano3: 環境変数を読み込んで使う

課題

Capistrano環境変数を使用したい。deploy.rbdefault_env などで割り当てることはできるが、パスワードなど情報はここで持ちたくなく、 普段使用している direnv.envrc ファイルを使いたい

対応

(注)前提: capistrano-rbenvが設定済みであること

ググるcapistrano-direnv がhitするが、実行するとエラーになるし、最終更新が6年前でバージョン0.0.1だったのでこれは使わないことにした。

参考サイトによるとrbenv_prefixのところで読み込ませて上げればいいようなので、ここで読み込ませることにする

例えばこんな .envrcファイルがあるとする

# .envrc

export RAILS_URL=http://localhost:3000
export DB_HOST=127.0.0.1
export DB_PASS=xxx
export MAIL_FROM=xxxx@xxxx.jp

デプロイ先のsharedパス内にファイルを置いておく

$  cp .envrc $SHARED_PATH/

deploy.rbrbenv_prefixsource #{shared_path.join('.envrc')} && を追記する

 # config/deploy.rb
set :rbenv_prefix, "source #{shared_path.join('.envrc')} && RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"

こうすると capistranoの各コマンド実行時に毎回 sourceコマンドが実行され、 環境変数がセットされた状態で処理が実行される。 環境変数読み込ませたいだけなので、direnvは特に関係ない。

毎回読み込まれるのがやや気になるが、ひとまず良しとする。

参考

qiita.com

CSS:ボックスの角にだけ色をつける

課題

CSSでボックスの左上にだけ色をつけたい

f:id:takeR:20200214151139p:plain

対応

linear-gradient を利用する。もともとはある角度で複数の色をグラデーションさせる機能だが、パラメータによってはくっきりと別れさせることもできる

色をつけたい位置によって直線の角度を変える

  • 左上 135deg
  • 左下 45deg
  • 右上 -135deg
  • 右下 -45deg

ついでに角丸も

background: 8dp 0 0 0, linear-gradient(135deg, red 18px, transparent 0);
border-radius: 8px;

f:id:takeR:20200214151055p:plain

参考

昔購入したやつだけど、読んでみたら詳しくて良い本だった。

CSSシークレット ―47のテクニックでCSSを自在に操る

developer.mozilla.org

CSS display: flexにしたら内部コンテンツの一部のスタイルが反映されなくなった

課題

親の要素を display: flex に変更したところ、子要素に定義していた :hover とVueJsのclickイベントが発生しなくなった。

原因

子のdivタグに z-index: -1 が指定してあったため。

.data-area {
  z-index: -1;
}

対応

作るサイトによると思うけど0にしたらちゃんと表示された。

.data-area {
  z-index: 0;
}

あまり調べてないけど -1は特別な挙動になるらしい。

参考

developer.mozilla.org stackoverflow.com

CircleCI 2.0 セットアップはまり道

この記事について

Rails + MySQLなプロジェクトをCircleCI上で動作させようとした際に遭遇したエラーの対応メモ。随時加筆、修正。
都度必要な設定しか記載してないのでまるごとコピって使うようなことはできません。
CicleCIのconfig.ymlは2.1が最新なのだけど、現時点でCLIが対応していないらしいので2.0にて対応。

RailsのMASTER KEYが見つからない

Missing encryption key to decrypt file with. Ask your team for your master key and write it to /home/circleci/project/config/master.key or put it in the ENV['RAILS_MASTER_KEY'].

対応

パラメータで渡してあげる。キーは新たに生成しても、development環境と同じでも良いかと思う。

# .circleci/config.yml
jobs: 
  build: 
    docker: 
      - image: circleci/ruby:2.6.5
        environment:
          RAILS_ENV: test
          RAILS_MASTER_KEY: b4d624125c4cb11b2391cf0015cdxxxx

タイムゾーンが異なってテストが通らない

対応

環境変数 TZ をセット。ディストリビューションによってはTZは使えないこともあるらしい

Dockerコンテナのタイムゾーン変更方法 - Qiita

# .circleci/config.yml
jobs: 
  build: 
    docker: 
      - image: circleci/ruby:2.6.5
        environment:
          RAILS_ENV: test
          TZ: Asia/Tokyo
      - image: circleci/mysql:8.0.18 
        environment:
          TZ: Asia/Tokyo

MySQL接続エラー

Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock'

原因

MySQLに対して localhost で接続しようとしている。Docker間ではTCPで接続するために 127.0.0.1 とするのが正解。以下のサイトが詳しい

ローカルポートのmysqlに対してTCPで接続する - Qiita

対応

database.yml をhostを 127.0.0.1 にするか、環境変数 DB_HOST を受け取るようにする

# config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  host: <%= ENV['DB_HOST'] %>

環境変数にした場合は DB_HOSTconfig.yml ででセットする

# .circleci/config.yml
jobs: 
  build: 
    docker: 
      - image: circleci/ruby:2.6.5
        environment:
          RAILS_ENV: test
          DB_HOST: "127.0.0.1"

rspec_junit_formatter が見つからない

cannot load such file -- rspec_junit_formatter
# Gemfile
group :test do
  gem "rspec"
  gem "rspec_junit_formatter"
end
$ bundle install

SSHで踏み台経由のログインができない

こちらを参考に対応する。procycommandに踏み台へのアクセス情報どうやって書くんだろうと思っていたけど configファイルをDcokerに持たせるという方法があったか。

kojirooooocks.hatenablog.com

参考

Rails whenever指定方法あれこれ

Wheneverとは

Rails上でcronによる定期実行バッチの処理時間を管理するためのライブラリ。crontabに記述する内容をruby言語で書ける

セットアップ

$ gem install whenever
$ bundle exec wheneverize .

コマンド

用途 コマンド
Cronを書き換えずに更新内容を確認する $ bundle exec whenever
Crontabを更新する $ bundle exec whenever --update-crontab
環境指定 $ bundle exec whenever --set environment='development'

設定ファイル(schedule.rb)

実行タイミング 記述 crontab
毎時10分 every 1.hours, at: 10 10 * * * *
毎日午前9時0分 every 1.days, at: '9:00 am' 0 9 * * *
毎週月曜日 午前9時5分 every :monday, at: '9:05 am' 5 9 * * 1

独自のjob_typeを作る

job_type とはcronが実行されるタイミングで呼ばれるコマンドのこと 通常は事前に定義されている job_typeを実行するが、自分で定義することもできる。

例えば隔週にしたいならこんな感じ。

job_type :biweekly_runner, '$(test $(expr $(date "+%W") % 2 ) -eq 0) && cd :path && bin/rails runner -e :environment ":task" :output'

のはずだったのだけど、 がwhenever内でエスケープされてしまって実行エラーになる。。隔週ってどうやるんだろう。

参考

github.com stackoverflow.com

/* Responsive: yes */