view 2017/2017_10_10/slide.md @ 28:382cd93f2a60

Update slide
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Tue, 31 Oct 2017 18:16:16 +0900
parents
children
line wrap: on
line source

title: Akatsuki の Rails 5.1 へのUpdate
author: いんぱるす@きりん
profile:
lang: Japanese
code-engine: coderay

## 目的
現状のAkatsukiはRails 4.2.6 で運用されている。
しかし、今年の4月にRails 5.1がリリースされ、Rails 4系は重要なセキュリティfix 以外はサポートされなくなった。
そのため、現状の最新版5.1.4 にUpdateすることを目的とする(ついでに秋のLT大会があったので発表する)

## 今週
- Rails 4.2.6 -> 5.1.4
- Rails 5.1 がリリースされたときに, Rails 4 はほぼサポートされなくなってしまった
- 内定式の動画づくり、編集 (次話し振られて,強制されたらこの会社辞めますって人事に言いました)

## 基本的には
- 4.2.6 -> 5.0.6 -> 5.1.4
- ``$ ./bin/rails app:update`` でいい感じに merge してあげる
- あとは, [Railsアップグレードガイド](http://guides.rubyonrails.org/upgrading_ruby_on_rails.html) に従う

## ハマったとこ
- rspec でテストを一気に走らせると事故るケースがある
- 失敗した所に binding.pry をかけると, ActiveLdap(学科アカウントとの連携で使われるもの) で association先がうまく取れない場合がある

``` ruby
class LDAP::User < ActiveLdap::Base
  ....
  #ここがうまく取れない場合がある
  belongs_to :groups, class_name: 'LDAP::Group', many: :memberUid
...
end
```

## 原因
- LDAP::User が取れるはずの場所で LDAP::User を継承した class が 取れるときがあった
- 継承先ではassociationの記述がないため, association 先のclassが取れないのが原因っぽいのがわかった
  - 新しい ActiveLdap の version では ActiveRecord の STI(single table inheritance) っぽいことをサポートしていた
- Akatsuki では継承先で取れても問題はなかったので, 継承先に association を書くことで対応

``` ruby
pry(main)> (LDAP::User.find ("akatsuki")).class
=> API::LDAP::Felica(objectClass:<top, person, po..... # <= LDAP::User がとれるはずなのに、、、
```

## 結果
- 紆余曲折あったが無事 local 環境での Update はできました
- まだ本番環境に上げてない(いつか News-ie でメンテナンス情報が以下略)

## LT
- 先週の土曜の 秋のLT で発表(さっきの話+Akatsukiの軽い説明)
- 目的はAkatsukiの運用の継承者探し

## 直近の障害対応
- LDAP User のパスワード validation を付けた際にバグがあったらしく, loginShell を変えるとPasswordが変わる(恐ろしい
- 今さっき対応しました、、、
- 理由は password の validation を付けるためにmd5への暗号化を validtion 後にやっていたのが原因
  - Passwordを変更して無くても暗号化が走る様になっていた(既に暗号化されたものをさらに暗号化して保存)
- password が変更されたときのみにvalidation後の暗号化をすることで対応

``` ruby
after_validation do
  if userPassword_changed?
    self.userPassword = ActiveLdap::UserPassword.md5(self.userPassword)
    self.userPassword_confirmation = ActiveLdap::UserPassword.md5(self.userPassword_confirmation)
  end
end
```