devcontainers環境で1passwordのssh agentを利用してコミット署名する

Dev containerでの1Password SSH Agentを使ったコミット署名時のエラーを対処する を参考にして設定したのだけど、一部リンク先のエントリとは異なる点があったのと、別の要因にハマったのでそれのメモです。リンク先はwindowsで僕はmacという違いなのかVScodeのバージョンが変わって振る舞いが変わったのかはよくわかりません。

ホスト側のgitconfigを必要な分だけコピーするときの設定

リンク先の「解決策2: gitconfigのコピーを無効化する」を参考にしてdotfilesを使ってみたのだけど、~/.gitconfigに追記するやり方だとなぜか[credential]の項目が書き込まれなくて期待通りの挙動にはなりません。そして~/.config/git/configに書き込んだ場合には同じファイル(~/.config/git/config)の末尾に[credential]が書き込まれます。

謎な挙動だけど動いたのでとりあえずこれでいいか…となっています。

1passwordのsocketを利用する

1password公式のドキュメント Sign Git commits with SSH | 1Password Developer だとSSH_AUTH_SOCKはoptional扱いだったので設定していなかったのだけど、devcontainers環境で1passwordを利用したい場合は設定必須のようで、SSH_AUTH_SOCKを1passwordのものに設定するとうまく動きました。

SSH_AUTH_SOCKの設定前にdevcontainers環境をVSCodeで起動していて、その上でリビルドするとホスト側のSSH_AUTH_SOCK環境変数を読まないので設定が反映されない、という事があり30分くらいハマりました。VSCodeを起動しなおしたら解決しました。

(追記)-slim系のDockerイメージを利用している場合はopenssh-clientを明示的にインストールしておく必要がある

apt-get update && apt-get install openssh-client

最近のsecret_key_baseの変遷についてのざっくりまとめ

Active StorageでアップロードしたファイルのURLを即返すときに気をつけること

(注記)これはだいぶ雑なまとめです。間違いあったら教えて下さい!

  • ActiveStorageでDiskServiceを利用している場合、URLのドメイン部分はリクエストからいい感じに生成される
  • ActiveStorage::SetCurrentというモジュールをコントローラにincludeするとbefore_actionでリクエストの情報をCurrentAttributeにアサインする
  • 開発環境だとActiveStorage::SetCurrentをincludeすれば問題ないんだけどテスト環境で問題になることがある
  • ActiveStorage::Current.host not set causing disk service to throw URI::InvalidURIError · Issue #40855 · rails/rails
  • テスト環境(例: コントローラスペック)でアップロードしたファイルのURLを即返すようなケース
    • テスト時にuser.save→userの画像がアップロードされる→サムネイルを作るタイミングでActiveStorage::DiskControllerのshowアクションが実行される→Executorが実行される→CurrentAttributesの値のクリアが実行される→ActiveStorage::SetCurrentで設定したはずの値がクリアされてしまう→ファイルのurlを参照しようとしてエラーになる、という流れになるはず
    • これはテストが1スレッドで実行されているのが原因なので、複数スレッドな環境では起きないはず
  • 解決策としては、rails_helper.rbなどに↓を書く
Rails.application.executor.to_complete do
  ActiveStorage::Current.url_options = { host: 'http://example.com' }
end

rubymineでFind Actionしたいのにできないのを解決する方法

  • rubymineのキーバインドにcmd+shift+aがfind action(アクションに絞り込んだ検索)として用意されている
  • が、mac上で実際にそれを打つとなぜか次のようになる
  • これは↓にある「ターミナルのmanページインデックスで検索」のキーバインドと競合しているから
  • ↑のようにチェックを消すと良い

docker-compose コマンドとdocker composeコマンドは別物

  • M1 macでdocker-compose upするとなぜか exec /usr/local/bin/docker-entrypoint.sh: exec format error
  • docker imageはintel用なのでそれが関連している
  • と思って色々試したがなにも変わらず
  • docker desktopのバージョンを4.31.0 -> 4.32.0に上げたらdocker-compose upが失敗するようになり"docker-compose"コマンドを使っているのが良くないんじゃ?という事実に気づいた
  • docker compose upとしたらうまくいきました
  • コマンド履歴でdocker-compose upを実行していたのが良くなかったという話

E2Eテストでバリデーションを調整してタイムアウトを抑制する

class DailyReport < ApplicationRecord  
  validates :body,  
            presence: true,  
            length: { maximum: -> { ValidationConfig.daily_report[:body][:maximum] } }
end            
around do |example|  
  original = ValidationConfig.daily_report[:body][:maximum]  
  ValidationConfig.daily_report[:body][:maximum] = 10  
  example.run  
  ValidationConfig.daily_report[:body][:maximum] = original  
end