Slide 1

Slide 1 text

バグ報告テンプレートの活⽤ ~ FjordBootcamp の歩み⽅ ~ @mh 初めてのLT 会 Vol.5 (2020.10.24) 1

Slide 2

Slide 2 text

⾃⼰紹介 @mh 普段はモバイルエンジニア Swift やObjctive-C でアプリやSDK の開発を⾏う モバイル向けの⾃動化ツールのFastlane でRuby を触 る機会が多い FjordBootcamp は2019 年10 ⽉23 ⽇の開始⽇から今⽇で丸 ⼀年 28 期⽣ マイペースで継続中 継続のコツは草を絶やさないこと 現在は⾃作Web サービスのプラクティスを進⾏中です 2

Slide 3

Slide 3 text

本⽇話すこと Rails のプラクティスを学ぶ中で教えてもらったバグ報告テンプレートについて いくつか種類がある中のActiveRecord のテンプレートの構成の詳細 ActiveRecord テンプレートの活⽤ Docker コンテナの利⽤ 3

Slide 4

Slide 4 text

バグ報告テンプレートについて Rails のissue 提出時に使うバグ再現⽤のスクリプトファイル。 1 ファイルでテストを実⾏することができる。 $ ruby active_record_gem.rb Fetching gem metadata from https://rubygems.org/........ Resolving dependencies... ... D, [2020-10-16T16:51:52.344883 #3431] DEBUG -- : Comment Load (0.2ms) SELECT "comments".* FROM "comments" ORDER BY "comments"."id" ASC LIMIT ? [["LIMIT", 1]] D, [2020-10-16T16:51:52.346871 #3431] DEBUG -- : Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] . Finished in 0.048739s, 20.5175 runs/s, 61.5524 assertions/s. 1 runs, 3 assertions, 0 failures, 0 errors, 0 skips 4

Slide 5

Slide 5 text

バグ報告テンプレートにどのようなものがあるか 種類 対象 action_controller_{gem|master}.rb ActionController active_mailbox_{gem|master}.rb ActiveMailbox active_job_{gem|master}.rb ActiveJob active_record_{gem|master}.rb ActiveRecord active_record_migrations_{gem|master}.rb ActiveRecord のマイグレーション action_storage_{gem|master}.rb ActionStorage benchmark.rb ベンチマーク計測 generic_{gem|master}.rb 汎⽤的なバグ https://github.com/rails/rails/tree/master/guides/bug_report_templates xxx_{gem|master}.rb のgem とmaster の違いは? gem は任意バージョンを指定 master は最新バージョンを指定 5

Slide 6

Slide 6 text

ActiveRecord テンプレートの構成 bunlder/inline gem の読み込み 各設定処理 DB のスキーマ定義 ActiveRecord クラスの定義 テストクラスの定義 https://github.com/rails/rails/blob/v6.0.2/guides/bug_report_tem plates/active_record_gem.rb 6

Slide 7

Slide 7 text

bundler/inline # frozen_string_literal: true require "bundler/inline" インラインでGemfile を宣⾔する gemfile メソッドを使えるようになる。 インラインで依存関係を宣⾔するので、バグ報告する時などスクリプトファイルを共有する際に便利。 gist で共有するのも便利 curl でgist のスクリプトをダウンロードして、スクリプトを実⾏するなど(ただし、安全なスクリプトに限る) $ curl -sSL {gist のraw URL} | ruby unless File.exist?('Gemfile') File.write('Gemfile', <<-GEMFILE) source 'https://rubygems.org' gem 'rails' gem 'mysql2' GEMFILE system 'bundle' end require 'bundler' Bundler.setup(:default) bunlder/inline を使う以前は、実⾏時にGemfile を作成してGem を読み込むテクニックが使われていた。 7

Slide 8

Slide 8 text

gem の読み込み gemfile(true) do source "https://rubygems.org" git_source(:github) { |repo| "https://github.com/#{repo}.git" } # Activate the gem you are reporting the issue against. gem "activerecord", "6.0.0" gem "sqlite3" end gemfile メソッドを使って、インラインで定義されたgem をrequire する。 gem が未インストールの場合は、実⾏時にシステムにインストールする。 8

Slide 9

Slide 9 text

各設定処理 require "active_record" require "minitest/autorun" require "logger" # This connection will do for database-independent bug reports. ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") ActiveRecord::Base.logger = Logger.new(STDOUT) ActiveRecord::Base.logger で標準出⼒にログを出⼒する。 ActiveRecord::Base.establish_connection メソッドで各DB の接続処理を⾏う。 MySQL PostgreSQL SQLite3 Rails のバグ報告テンプレートで使われている 9

Slide 10

Slide 10 text

SQLite3 で接続する場合 adapter 属性に sqlite3 を指定する sqlite3 gem の指定が必要 インメモリで保存する場合 database 属性に :memory: を指定する ActiveRecord::Base.establish_connection( adapter: "sqlite3", database: ":memory:" ) ファイルで保存する場合 database 属性に任意のDB のパスを指定する ActiveRecord::Base.establish_connection( adapter: "sqlite3", database: "./db.sqlite3" ) 10

Slide 11

Slide 11 text

PostgreSQL で接続する場合 ActiveRecord::Base.establish_connection( adapter: "postgres", host: '{DB ホスト}', database: "{DB 名}", password: '{ パスワード}', username: '{ ユーザー名}' ) adapter 属性に postgres を指定する その他の属性にDB の接続情報を指定する gemfile(true) do ... gem "activerecord", "6.0.0" gem "pg" end pg gem の指定が必要 11

Slide 12

Slide 12 text

MySQL で接続する場合 ActiveRecord::Base.establish_connection( adapter: "mysql2", host: '{DB ホスト}', database: "{DB 名}", password: '{ パスワード}', username: '{ ユーザー名}' ) adapter 属性に mysql2 を指定する その他の属性にDB の接続情報を指定する gemfile(true) do ... gem "activerecord", "6.0.0" gem "mysql2" end mysql2 gem の指定が必要 12

Slide 13

Slide 13 text

posts id created_at updated_at comments id post_id created_at updated_at DB のスキーマ定義 ActiveRecord::Schema.define do create_table :posts, force: true do |t| end create_table :comments, force: true do |t| t.integer :post_id end end ActiveRecord::Schema.define メソッドで、実⾏時にDB の スキーマを定義できる create_table に force: true のオプションを指定すること で、テーブル作成の前に以前のテーブルを削除する 13

Slide 14

Slide 14 text

Post Comment ActiveRecord::Base ActiveRecord クラスの定義 class Post < ActiveRecord::Base has_many :comments end class Comment < ActiveRecord::Base belongs_to :post end 14

Slide 15

Slide 15 text

テストクラスの定義 class BugTest < Minitest::Test def test_association_stuff post = Post.create! post.comments << Comment.create! assert_equal 1, post.comments.count assert_equal 1, Comment.count assert_equal post.id, Comment.first.post.id end end MiniTest のテストメソッドを使って、関連付け動作を検証できる MiniTest のかわりにRSpec を使うこともできる テストデータの⽣成にFactoryBot を使うこともできる。 15

Slide 16

Slide 16 text

Gemfile Gem インライン定義 スクリプト Rails アプリ DB のスキーマ定義 DB の接続処理 ActiveRecord クラス テストクラス db/schema.rb db/database.yml app/models 配下のモデル test 配下の テストケース ActiveRecord テンプレートの活⽤ バグ報告以外に特定の機能の動作検証 フォローの関連付けの検証 https://gist.github.com/mh- mobile/2fcf17570bef032872ceb4f48be756a5 ポリモーフィック関連の検証 https://gist.github.com/mh- mobile/01ea7a4e14011b9a59605ffa3de36cab 1 ファイルなので、簡単に動作を再現できる ⼩さな機能に切り分けて検証を⾏いやすい gem にbygbug やpry なども導⼊できるので、デバッグも簡 単 標準でBinding.irb も使える 16

Slide 17

Slide 17 text

Docker コンテナの利⽤ クリーンな環境で検証できる。 Gem はRuby のコンテナ上のシステムにインストール する。 DB はPostgreSQL のコンテナを利⽤する VSCode Remote Containers でDocker コンテナに接続し、 VSCode を使ってスクリプトを実⾏することができる。 ActiveRecord のバグ報告テンプレートをVSCode Remote Containers で使えるように移植したコード https://github.com/mh- mobile/vscode_remote_containers_for_active_record GitHub のCodeSpaces を使うと、ブラウザ上からDocker コンテナを起動し、スクリプトを実⾏することもできる。 17

Slide 18

Slide 18 text

まとめ 問題を⼩さく切り分けて、検証できると良い。 学習としてのバグ報告テンプレートの活⽤ フォローの関連付けの検証 ポリモーフィック関連の検証 Docker 上で検証環境を作っておくと良い。 18

Slide 19

Slide 19 text

接続 接続 Ruby コンテナ PostgreSQL コンテナ コンテナ領域 接続 SQL クライアント ローカル領域 マウント ワーク スペース ワーク スペース VS Code VS Code Server .devcontainer 起動 起動 起動 docker- compose.yml devcontainer.json Selenium コンテナ Bootcamp アプリの ソースを配置 (余談)Bootcamp アプリをVSCode Remote Containers で動かす Bootcamp のリポジトリをfork して、VSCode Remote Container 環境を構築 Docker コンテナの活⽤ Rails ⽤のRuby コンテナ DB ⽤のPostgreSQL コンテナ テストブラウザ⽤のSelenium コンテナ Bootcamp アプリをVSCode Remote Containers で使えるよう に移植したコード https://github.com/mh- mobile/bootcamp/tree/master/.devcontainer 19

Slide 20

Slide 20 text

参考 バグ報告テンプレート https://github.com/rails/rails/tree/master/guides/bug_report_templates フォローの関連付けの検証⽤のGist https://gist.github.com/mh-mobile/2fcf17570bef032872ceb4f48be756a5 ポリモーフィック関連の検証⽤のGist https://gist.github.com/mh-mobile/01ea7a4e14011b9a59605ffa3de36cab バグ報告テンプレートを知った際のQ&A ポリモーフィック関連のpolymorphic オプションについて | FJORD BOOT CAMP (フィヨルドブートキャンプ) https://bootcamp.fjord.jp/questions/510 VSCode Remote Containers 関連 Developing inside a Container using Visual Studio Code Remote Development https://code.visualstudio.com/docs/remote/containers VSCode Dev Container Guidebook https://booth.pm/ja/items/2425642 ActiveRecord のバグ報告テンプレートをVSCode Remote Containers で使えるように移植したコード https://github.com/mh-mobile/vscode_remote_containers_for_active_record Bootcamp アプリをVSCode Remote Containers で使えるように移植したコード https://github.com/mh-mobile/bootcamp/tree/master/.devcontainer 20