Rabbit Slide Show

heiseirubykaigi-1

2019-12-14

Description

https://heiseirb.github.io/kaigi01/

Text

Page: 1

あなたのそのgem、
Windowsでも動きます
か?
2019-12-14
平成Ruby会議01
#heiseirubykaigi
うなすけ

Page: 2

はじめに
ある日のことであった……
(私がこの発表をしようと思うようになったいきさつを
お話しします。)

Page: 3

Middleman
Ruby製の静的サイトジェネレーター
https://middlemanapp.com/

Page: 4

Middlemanの拡張gemを作ったのです
Middlemanで生成したHTMLの<img>に
loading=”lazy”を付与するgemを作りました | うなす
けとあれこれ
https://blog.unasuke.com/2019/middleman-lazy-
img-loading/
https://github.com/unasuke/middleman-
img_loading_attribute

Page: 5

過程でMiddleman本体にPull Requestを出
したのです
https://github.com/middleman/middleman/pull/
2294
“Conform generated gemspec to bundle gem style”
middleman extension コマンドによって生成される
gemspec を bundle gem の形式に揃えるもの

Page: 6

そしたらこんなコメントが……
This is very nice. Is there a way to check if the
shelling out to git is safe on Windows?
(意訳 「とてもいいね! gitコマンドを呼び出してるけど
Windowsでも大丈夫?」)
https://github.com/middleman/middleman/pull/
2294#issuecomment-540301124

Page: 7

MiddlemanはWindows対応を謳っている
Windows users can install both using
RubyInstaller. For windows RubyInstaller-Devkit
is also required.
https://github.com/middleman/middleman/blob/
master/README.md
でもCIはLinuxでしか動いていない!!!
https://travis-ci.org/middleman/middleman
⇒ そして私はMiddlemanにWindowsでのCIを追加しよ
うと思ったのであった……

Page: 8

いきさつのまとめ
MiddlemanにPull Requestを出したらWindowsでの挙
動を確認されたので、Windows環境でのCIを追加する
ことにした
その過程で得られた知見をお話しします

Page: 9

自己紹介
名前 : うなすけ
仕事 : プログラマー (フリーランス)
インフラ寄りサーバーサイドエンジニア
Ruby, Rails, Kubernetes…
Itamae gem maintainer
GitHub @unasuke
Mastodon @unasuke@mstdn.unasuke.com
Twitter @yu_suke1994

Page: 10

アンケート、その前に
これから皆さんにアンケートを4つ出します。
絶対挙手してほしい!というわけではないですが、自分
かどうだったかを思い出してみてください。

Page: 11

アンケート
みなさん、どのOSを日常で使っていますか?
macOS
Catalina
Mojave
Linux
Ubuntu
Arch Linux (発表者のマシン)
Windows

Page: 12

アンケート2
みなさんは以下OSがインストールされているマシンを
持っていますか?
macOS
Linux
Windows

Page: 13

アンケート3
みなさんが最初に触ったパソコンのOSは何でしたか?
macOS
Linux
Windows
その他

Page: 14

アンケート4
みなさんはRubyGemを作成し、公開していますか?
はい
まだ

Page: 15

OSのシェア (画像はマイナビより)
https://netmarketshare.com/operating-system-
market-share.aspx

Page: 16

Rubygems and Bundler metrics
https://ecosystem.rubytogether.org/

Page: 17

デスクトップOSのシェア
Windows >> macOS + others
⇒ Windowsで動けばユーザーが増える!!!

Page: 18

WindowsでRubyを動かす方法
https://rubyinstaller.org/ を使うとRubyをWindowsに
インストールすることができます
https://railsgirls.jp/
install#setup_for_windows_without_wsl

Page: 19

あなたのgem、Windowsで動きましたか?

Page: 20

gemをWindowsで動くようにしよう!
MiddlemanのtestがWindowsでpassするようになる
までにやったことを紹介します

Page: 21

shell commandを使わない
def cleanup!
Dir.chdir ROOT
`rm -rf #{TMP}` if File.exist? TMP
end
https://github.com/middleman/middleman/blob/
ba2098ec/middleman-core/spec/support/given.rb
Windowsには rm コマンドが存在しないので実行できな
い

Page: 22

shell commandを使わない
def cleanup!
Dir.chdir ROOT
- `rm -rf #{TMP}` if File.exist? TMP
+ FileUtils.remove_entry_secure(TMP) if File.exist? TMP
end
FileUtils を使うなど、なるべく Pure Rubyで実装する

Page: 23

なるべくPure Rubyで実装する
実のところWindows専用アプリでもないにも関わ
らずこれほど力を入れてWindows対応がなされて
いるものって、なかなか見ないよ。本当に。頭が
下がります。
https://shyouhei.tumblr.com/post/64498820681/10年
代のrubyコア用語集 より

Page: 24

Gem.win_platform? で分岐する
Windowsとその他のOSで処理を分けたい場合、
Gem.win_platform? を使用する
Cucumber::Rake::Task.new do |t|
exempt_tags = ["--tags 'not @wip'"]
exempt_tags = if Gem.win_platform?
["--tags 'not(@wip or @skip-windows)'"]
else
["--tags 'not @wip'"]
end
#...

Page: 25

あきらめる
「どうしてもWindowsでこの機能を動かすのはム
リ〜〜」となったときは潔く諦める
(※ そのための Gem.win_platform? による分岐)

Page: 26

ここまでのまとめ
Pure Rubyで実装する
Gem.win_platform? で処理を分岐する
あきらめも時には大事
ローカルのWindowsでtestがpassするよう修正できまし
たか?
ではCIを有効にしていきます。

Page: 27

CIを有効にする
Windowsが使用できるCI service
GitHub Actions
AppVeyor
CircleCI

Page: 28

CIを有効にする
Windowsが使用できるCI service
GitHub Actions ← ☆
AppVeyor
CircleCI ← ☆
GitHub ActionsとCircleCIはcronによる定期実行をYAML
に書くことで設定できる

Page: 29

CIに関して
GitHub Actionsではどんなに頑張っても落ちるtestが
AppVeyorではすんなりpassしたりするので、
行き詰まったらCI serviceを変えてみるのも手です
(実体験 https://github.com/middleman/middleman/pull/

Page: 30

成果
https://github.com/middleman/middleman/pull/2297

Page: 31

最後に
実のところWindows専用アプリでもないにも関わ
らずこれほど力を入れてWindows対応がなされて
いるものって、なかなか見ないよ。本当に。頭が
下がります。ただ、ユーザー定義したライブラリ
とかで対応が残念な事があって、そのため結局総
体としては残念なことになってしまうって場合は
まま見受けられるので、その点残念。
https://shyouhei.tumblr.com/post/64498820681/10年
代のrubyコア用語集 より

Page: 32

まとめ
Pure Rubyで実装すればWindowsでも動く(可能性が
高い)
CIはcronで定期的に実行できると便利
Windows対応やっていきましょう
「総体としてのRuby」は我々で良くしていける

Other slides