はのちゃ爆発

はのちゃが技術ネタとか日常のこととかを書いてます。

自作 gem に Dependabot を入れたら Unknown Error で更新失敗した話

現象は上述の通り。自作 gem に Dependabot を入れて継続的 Bundle Update 環境を整えようとしたらなんかエラーになった。

TL;DR

  • gemspec 内の required_ruby_versionRuby バージョンが新しすぎると更新でエラーが出る
  • ついでに gemspec に書く required_ruby_version は文字列で指定しておいてもよいかも

エラーの内容

f:id:hano_tea:20200506205019p:plain
管理画面で見るとこんな感じのエラーで原因不明。

上記のように Unknown Error が発生してしまった。

偶発的なものかと思って再実行しても直らなかったのでログを見て原因調査。

エラーログ

以下のようなログが出ていた(一部抜粋)。

(前略)
updater | INFO <job_32200727> Starting job processing
updater | INFO <job_32200727> Starting update job for hanocha/rubocop-google_ads
updater | fatal: not a git repository (or any of the parent directories): .git
updater | fatal: not a git repository (or any of the parent directories): .git
updater | INFO <job_32200727> Checking if rake 13.0.1 needs updating
updater | I, [2020-05-06T11:39:13.485356 #71]  INFO -- sentry: ** [Raven] Sending event 3705176a67f44060aa3b9a424ff6eb82 to Sentry
  proxy | 2020/05/06 11:39:33 POST https://sentry.io:443/api/1425239/store/
  proxy | 2020/05/06 11:39:34 200 https://sentry.io:443/api/1425239/store/
updater | ERROR <job_32200727> Error processing rake (RuntimeError)
updater | ERROR <job_32200727> Couldn't find Ruby version!
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb:56:in `ruby_version'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb:31:in `rewrite'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/update_checker/file_preparer.rb:254:in `block in lock_ruby_version'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/update_checker/file_preparer.rb:252:in `each'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/update_checker/file_preparer.rb:252:in `lock_ruby_version'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/update_checker/file_preparer.rb:170:in `gemfile_content_for_update_check'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/update_checker/file_preparer.rb:61:in `prepared_dependency_files'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/update_checker.rb:385:in `prepared_dependency_files'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/update_checker.rb:362:in `latest_version_finder'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/update_checker.rb:181:in `latest_version_details'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/vendor/ruby/2.6.0/gems/dependabot-bundler-0.117.7/lib/dependabot/bundler/update_checker.rb:20:in `latest_version'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/lib/dependabot/updater.rb:266:in `log_checking_for_update'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/lib/dependabot/updater.rb:163:in `check_and_create_pull_request'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/lib/dependabot/updater.rb:64:in `check_and_create_pr_with_error_handling'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/lib/dependabot/updater.rb:50:in `block in run'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/lib/dependabot/updater.rb:50:in `each'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/lib/dependabot/updater.rb:50:in `run'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/lib/dependabot/update_files_job.rb:16:in `perform_job'
updater | ERROR <job_32200727> /home/dependabot/dependabot-updater/lib/dependabot/base_job.rb:29:in `run'
updater | ERROR <job_32200727> bin/update_files.rb:21:in `<main>'
(後略)

Couldn't find Ruby version! と言われている。

言われているのだが、 Ruby のバージョンを指定したいタイプのものでもない(普通の Rails アプリとかだったら .ruby-version とか書くけど gem でそういうの書くイメージが無い)のでこの時点で ? となる。

コードを追ってみる

よくわからないのでとりあえずエラー吐いてる Dependabot のコードをちょっと見てみる。

dependabot-bundler-0.117.7/lib/dependabot/bundler/file_updater/ruby_requirement_setter.rb:56:inruby_version'`

スタックトレースの最後が上記なのでここから見てみる。これ

ruby_version 変数がうまく入っていない(多分 nil)のでエラーが出ている模様。

ruby_version 内で呼ばれている ruby_requirement メソッド内の処理も見ないと原因がイマイチ特定できない。こっち

もうちょっと掘れなくもなさそうだが、とりあえず ast = Parser::CurrentRuby.parse(gemspec.content) という記述があり、 gemspec ファイル内の Ruby バージョンに関する記述を読んでいそうな雰囲気。

あれ、 gemspecRuby のバージョン周りのことなんも書いてなかったか…と思ったがそんなことはなく、

spec.required_ruby_version = Gem::Requirement.new('>= 2.6.5')

という行を書いていた。指定しているのに怒られている :thinking:

ふとファイルの上の方の定数を見ると、

        RUBY_VERSIONS =
          %w(1.8.7 1.9.3 2.0.0 2.1.10 2.2.10 2.3.8 2.4.7 2.5.6 2.6.4).freeze

とある。 2.6.4 までしか使えない…?

Ruby のバージョンを下げる

というわけで、 Rubocop 本家の記述に合わせて Ruby のバージョンを落としてみたらいけました。なるほど。

gemspec の書き方を確認してみる

ついでに required_ruby_version の記述も気になったのでちょっと確認。

とはいえこの辺の書き方をなんか自分で色々イジった記憶はないので、ジェネレータで作られたのと同じ記述でやっていただけ…だと思われる。

rubygems.org 内のドキュメントを見てみる。

guides.rubygems.org

Usage には以下のように書いてある。

# This gem will work with 1.8.6 or greater...
spec.required_ruby_version = '>= 1.8.6'

# Only with ruby 2.0.x
spec.required_ruby_version = '~> 2.0'

# Only prereleases or final releases after 2.6.0.preview2
spec.required_ruby_version = '> 2.6.0.preview2'

どうも文字列で指定するのが良さそうだ。 Gem::Requirement.new をする必要はないっぽい。

一応 Cop なので Rubocop 本体の gemspec も見てみたが、そちらも文字列で指定されていた。

今回の件とは直接関係なさそうだけど一応。

2020/05/05

こどものひ。

RFA

筋肉痛が結構来てるので軽めにやった。1ステージ分。

Google Ads API 用 Cop

昨日の日報で書き忘れてたけど on.cron で時間指定実行を仕込んでもなぜか時間通りに動いてくれない。

設定した時間から6~7分ぐらい遅れてエンキューされるんだけどそういうものなんだろうか。 この挙動のせいでしばらくうまくいかないなーーーと悩んでしまった。

それはさておき、昨日考えていた Renovate の Google Ads API gem 更新にフックして get メソッド一覧も更新するやつ、

help.github.com

ブランチ名 or タグ名チェックが出来るのでこれ使うと良さそう。 とりあえずブランチ名、厳しそうなら Renovate の設定かえてタグつけるようにするとか?(出来るよね多分)

Apex

ちゃんぽん2回。やったね。ただしカジュアル。 ランクはトータル収支マイナスな気がする。

そもそも PC も Apex のサーバ?も不安定で全然ゲームにならない…まず始まってすらくれないことが多くてげんなり。

あとオーディオ周りでドライバ入れたらその直後からプチフリ多発するし音も途切れるしドライバ入れたのに肝心の音は出てこないしでひどい目にあった。

カッとなってデスクトップの OS クリーンインストールし直した。今の所は一応安定している。

2020/05/04

お掃除 Day。

そうじ

  • 部屋の掃除機がけ
  • 部屋のワイパーがけ
  • トイレ掃除
  • 風呂掃除

などをやった。

なんでかというと主にリングフィット時の足元のよごれが気になったのが原因。

Apex

知り合いの激強な方とやったら相手も当然激強でどうにもならなかった。

正確に言うとそんなに一方的に蹂躙はされてないんだけど立ち回りの差がキツい。

その後比較的レベルが近い友人とやったがそっちもイマイチだった。どうにも自分がうまく動けていないしそもそも今日は当たらない。 AIM がダメすぎる。

プラチナすら遠い。

Google Ads API Cop 自動更新機能

Renovate 入れてなかったので入れた。

が、Google Ads API の更新が降ってこない。なんだろうな…

とりあえずそれは置いといて GitHub Actions を導入してみている。スケジュール実行。

最終的には日時か週次ぐらいで動か…いや、 Google Ads API のアップデートに合わせて Google Ads API の get メソッド一覧の自動更新ができるようにしたいなぁという願望。

とりあえず日次とかで動かすつもりだったのもあり、 GitHub Actions の基本を試すぐらいで終わってしまったが、 とりあえず先には進んでいるのでよしとする。

2020/05/03

体調だめで大体寝てた。

だいぶ虚無1日にしてしまったので今日は頑張りたい。

リングフィット

リングフィットが届いた。

とりあえずステージ1をやったけどランニングが階下に響きそうであんまりしっかりできず。

防音性のある程度あるマットを買おうと思った。

2020-05-02

GW 日報。

Go 入門

これ を読んでた。 型のあたりまでとりあえずななめ読み。

GitHub Actions 入門

github.com

:point_up: を自動更新するために GitHub Actions 使えないかという妄想。 できそうな気はするので GW 中にやりたい。

GW やりたいことリスト作成

した。

Apex

ちゃんぽん取った。 ゴールド II まで上がった。割と調子がいい。

Mint60 を組んだので Tips 的なのをまとめた

この記事は Mint 60 で書かれています。

ゆかりキーボードファクトリーさんの Mint60 を購入して作ってみたので Tips 的なものを書いておきます。

Mint60 とは

Mint60は一般的なキー配列(Row-Staggered)で、左右分離型ながら自作キーボードが初めての人にも使いやすいキーボードです。

自作キーボード界隈では逆に貴重な一般的なキー配列のキーボードキットです。 組み立て難度が低いのも特徴でしょうか。ダイオードがリード部品、LEDもテープ、表面実装などの難度の高いはんだ付け不要なので非常に初心者に優しいものになっています。 (失敗するとしたらスタビライザー周りか Pro Micro 周りという印象)

f:id:hano_tea:20200404141345j:plain
うちのこかわいい

入手方法

ゆかりキーボードファクトリーで購入できます。スターターセット基本セットの2つがあります。

スターターセットはそれだけ買えば組み立てに必要なパーツ類が全て揃うお手軽フルセットです。(ハンダゴテその他の工具は別途必要)

工具とかは当ブログの Helix 組み立て記事の中に書いたのでそれを見てください。

hanocha.hateblo.jp

基本セットは Mint60 の基本的な部品… PCB基板、アクリルケース、ダイオードやLED、ネジといった細々とした基本的なパーツがセットになっているものです。 何が無いのかというと「キースイッチ」と「キーキャップ」が含まれていません。スターターセットで同時購入できないような独自の、自分好みのスイッチやキャップを使いたい場合はこちらになります。 TRRS ケーブルと microUSB ケーブル も含まれていないので、必要な場合は別途購入する必要があります。

組み立て

ビルドガイドは id:eucalyn さんのブログにあります。基本的にはこちらのページを参照するだけで問題ないと思います。

eucalyn.hatenadiary.jp

(商品詳細ページにはリンクが無かった気がするのですが、購入した商品にビルドガイドページの URL と QR コードが同封されています)

Tips

ビルドガイド通りに組めばいいだけではありますが、個人的にちょっと引っかかったり、悩んだりしたところや、追加でやるといいことなどがあるのでメモしておきます。 Mint60 が、というよりは自作キーボード全般で悩みがちなところかもしれないですが。

Pro Micro 用ピンヘッダの取り付けについて

私がよく長い方と短い方どっちをどっちにするんだっけと悩むやつ。

ビルドガイド中ではブレッドボードを利用した組立方法が紹介されていますが、その歳ブレッドボードに刺すのは長い方です。 短い方を基板側に差し込みはんだ付けします。

あとブレボに挿して作業する際に、どれだけの間を空けて組み立てるのか。実際に試せば済む話なのですが、ピンが太くて抜き差しあんまりしたくはないものです。 画像のように中央の隙間 + 3ピン分空けるとピッタリの間隔になります。

f:id:hano_tea:20200406010832j:plain
参考

スタビライザの Lube について

Mint60 ではスタビライザを5つ使用しますが、スタビライザは何もしないそのままの状態で組み立てて使うとカシャカシャ音が気になります。 静音タイプのスイッチを使っている場合は尚更残念な感じになってしまうので、可能であればスタビライザに Lube をすることをおすすめします。

スタビの Lube はこちらのスライドが参考になります。

speakerdeck.com

私はテープの部分を省略したり粘度低めのオイルで Lube りましたが、それでもかなり効果を感じています。 基本的にはスライドの通りに Lube ればいいのですが、可動部、接触して擦れる部分に塗りたくるといい感じです。

Pro Micro の moge 防止

Mint60 はピンヘッダ直で Pro Micro をはんだ付けするため、 Pro Micro 周りのトラブルにあまり強くありません。 普段 PC と接続しっぱなしで使う人ならいいのですが、持ち運んだりなどケーブルの抜き差しが発生する可能性がある場合は moge 防止策を講じておくと良いです。

scrapbox.io

2液混合系のエポキシ接着剤を使うのがお手軽かつかなり効果的でおすすめです。

TRRS コネクタがやたら硬い(ことがある)

私の個体だけかもしれないですが、 TRRS が異様に硬いものでした。 少なくとも普通に手で差し込むのが無理な程度には硬い。

何らかの不良個体に当たってしまった可能性が否めませんが、一度差し込んでしまえば基本外すようなケーブルでもないので、無理やりねじ込んでそのままにしています(

もしどうにも刺さらない場合は、基本的には作者の id:eucalyn さんに聞いてみるのが良い気がします。

動作確認について

Mint60 に限りませんが、スイッチ、 Pro Micro、LED の組み立てまで一通り完了したら、そこで一回ケーブルを繋いで動作確認するのをおすすめします。 ケースの組み立てまでやってからの動作確認だと、もし動作不良があったときにケースを分解する手間が発生するので面倒になります。

幸い、 Mint60 はファームウェアが予め Pro Micro に書き込まれているので、動作確認の手間は非常に少なくなっています。早めにやっておきましょう。

キーマップの変更、ファームウェアの書き込みについて

デフォルトでファームが焼いてあるので、こだわりのない人は特に何もしなくていいのですが、キーマップを書き換えたい方は QMK Firmware で自分好みのキーマップを作成、ファームウェアを焼き直す必要があります。

Helix を作ってからの2年の間にかなり状況が変わってて私も戸惑ったのでメモしておきます。

QMK Firmware の公式ドキュメントは以下のページです。

docs.qmk.fm

キーマップの編集とファームウェアのダウンロード

※ この手順通りに編集するとキーマップは書き換えられますが LED 周りの挙動がおかしくなる可能性があるのでご注意ください ※

前はソースを直接書き換える方法でキーマップを変更していましたが、今は Web 上でキーマップの書き換え、ビルドまで出来るツールがあるのでそれを使うのが良さそうです。

config.qmk.fm

キーマップを好みのものに書き換えたら画面右上の COMPILE ボタンを押してビルドします。ちょっと時間がかかりますが気長に待ちましょう。

ビルドすると右下の FIRMWARE ボタンが押せるようになります。押すと .hex 形式のビルド済みファームウェアがダウンロードできます。

基本的にはこのファイルだけあれば事足りますが、変更後のキーマップの情報は別途 json でどこかに保存しておくのをオススメします(画面中央辺りのボタン)

どうでもいいけどなんでじゃがいもなんですかね…?

ファームウェアの書き込み

Pro micro へのファームウェアの書き込みには QMK Toolbox を使うのが便利です。 以前はコマンドラインからやっていた記憶がありますが、便利になったものです。

github.com

QMK Firmware 公式サイト内の Flashing に関するドキュメントも貼っておきます。

docs.qmk.fm

Mac の方はダウンロードの際に QMK.Toolbox.pkg を選んだほうがいいかもしれないです。 (提供元不明のアプリとしてサクッと開けないので)

Windows の場合は zip でも exe でもどっちでもいいです。好みです。

以下 Windows 版の画面で解説します。

f:id:hano_tea:20200406005317p:plain
先程ダウンロードした hex ファイルを選択して Flash が基本操作です

先程ダウンロードしてきた hex ファイルを画面上部の open ボタンを押して開きます。 選択したらあとは Flash するだけ…なのですが、そのまま Flash すると書き込み先のデバイスが見つからなくてエラーになります。

f:id:hano_tea:20200406010154p:plain

Mint60 組立時に付けたけど使われていないボタンがあるかと思います。裏面から押せる謎スイッチ。 あれはリセットスイッチなのですが、 USB で PC に繋いだ状態でこれを押すと Pro micro のファームを書き込めるようになります。

ボタンを押すと上記の画像のように書き込み待機状態のような感じになるので、切断される前に Flash ボタンを押せば書き込めます。

これをキーボードの左右両方について実施すれば OK 。

おわりに

ビルドガイドには載ってない感じの細かい Tips でした。 他にも思いついたり思い出したら追記するかも。

Mint60 で楽しい自作キーボードライフをお送りください!

はじめて RuboCop Custom Cop を作って gem も公開してみた

はじめに

RuboCop の Extension/Custom Cop を初めて作って gem として公開してみました。

rubygems.org

作ってて色々引っかかったりしたことがあったので、作り方などをまとめておきます。

続きを読む