CIコスト下げたい、テスト実行時間減らしたい時のアイデアまとめ

友人にcircle ci 料金下げる。または、rspec実行時間減らした時にやるべきことを聞かれたのでまとめておく

Railsプロダクト前提です。

  • テストしない (野蛮だけどアイデアの一つとしてね....)
  • 不要なコードとテストを削除
  • 並列化
  • 完了時間は実行時間の長いテストに引きずられるので実行時間が均一にする(並列化した後)
  • bundle config使ってdevelopment groupライブラリをinstallさせない (メモリも少なくなります)
  • bundle install や yarn installを別jobで動かしコンテナイメージ作成。テスト実行jobでコンテナfetch
  • draft prだったらcircleci実行しない。open prだけci回す
  • skip ci 活用する
  • resource_class調整
  • 不安定なテストを直す(リトライしている場合)
  • defaultブランチ以外ではカバレッジなどのレポート系を取らない。正直テストちゃんと書くチームにしかいなかったのでカバレッジ不要だと思ってる。
  • logレベル warnとかに変更する (ログ出力量減らす)
  • gemだけではなくwebpack, asset:compile などもcacheする
  • circleci以外を利用する。ex: github action使う

「金払えば速くなるか考える」その後に「金安くなる方法考える」のが効率良いと思ってる。

一番重要なのは各stepの計測結果を地道に見て改善施策考えること。やっていこう。

追記

他にアイデアあったら追記したいので教えてね!

https://twitter.com/imaharuTech/status/1687084010651234304 にリプライよろしく

奈良在住 お酒好きからのお便り (転記承諾済)

Railsの話

  • bootsnapをテスト環境で入れておく
    • まれに古いレイルズ設定を引きずっていて開発環境だけrequireしてたり、削除していたりする
    • Railsを何度も再起動すると効いてくる

Rspec

  • できる限りlet!をやめてletにする(不要なケースでもレコード生成をしていることが多い)
    • とくにグローバル(最も外側のcontext)でlet!とかbeforeとかでいらないレコードを作ってるのを外して、必要最小限のテストケースのコンテキストだけに閉じ込める
  • factoryで「気を利かせて」関連する親・子レコードを作っているのをやめて必要な箇所で都度生成する
    • とくに関連子レコードをつくるコールバックはtraitに閉じ込める(明示的に指定しない限り暗黙生成しない)
  • system spec(シナリオテスト)は最小限にする(考え方によるけどフロント分離してたらいらない感)
    • 組合せ爆発しがちな網羅的なテストは、なるべく単体テスト(クラス1つだけの軽いテスト)に寄せる
    • requestスペックはざっくり正常系とメジャーな異常系を見るとか、認証認可だけを見るとかにする(考え方による)
  • 単体テストで1ケースに複数期待値を書くのを許す
    • 個人的には「ケースで表明していること、中でやっていることが合わなくなって改修で死ぬ」「単体テストなのに手続的なシナリオテストが頻繁に書かれる」ので、メンテ性が悪化するため反対。だけど考え方による

e2eの話

  • system spec(capibara)重い。cypressも結構重かった。PlayWrightよかった(けど、これはrailsじゃない現場だからわからない)
  • フレームワークによって結構速度違う感ある
  • あとchrome前提か、electronでやるのか、他のブラウザも担保したいのか・・(減らすに越したことないけど、オプションまずってなぜかelectronベースでやってるとかはあった)

CIの話

  • 共通の依存に関してキャッシュを利用する
    • ステップごとに全部ダウンロードしなおすとかよくあるので、gem関係はキャッシュを使う
      • ただしnode_modulesはめちゃくちゃ増えがちで、実際はキャッシュがあふれて無効になることも多いので、色々みてお手盛り調整が必要
    • keyを適切に貼る
      • バージョンが違うキャッシュがやってきたら無駄だけでなく、最悪エラーにもなるし、同バージョンの上書き合戦になってキャッシュ全体の有効性が薄まる
    • persist_to_workspaceをうまく利用する
      • セーブとかロードの時間が余計にかかるので、実際これで速くなるのか要計測感ある
  • マルチステージビルドつかう
  • 全ステップ通過を要求するかどうか吟味(とくにe2eの使い所)
    • たとえばgit flowのようなリリースフローだったとして、「ブランチpushや、本番リリースではe2e回す」「mainマージ(stgリリース)時はe2e回さない」とかrequirementを吟味する

社会人の趣味 第346位!JAIST科目履修生 体験談

趣味の一環で北陸先端科学技術大学院大学(以降、JAISTと呼ぶ)に科目履修生として通っていました。

テストが返却され落ち着いたので、備忘録を残しておこうと思います。JAIST科目履修を考える人に少しでも役立てば嬉しいです。

受講きっかけ

RailsエンジニアからSREエンジニアにキャリアチェンジしネットワーク、CPU、OSに関する知識をインプットする機会が増えました。興味が移りやすい性分なので、半強制的にインプットできる方法を探っていました。以前、JAISTに通っている友人がCPUやメモリの宿題について話していたのを思い出しました。シラバスを覗いたところ「統合アーキテクチャ」というピッタリの講義を見つけたので応募しました。

科目履修生を考えてる人へのアドバイス

受講受理までに迷ったことを残しておきます。正確な情報は大学に確認して下さい。

  • 年度毎に開講講義が異なるので、受講したいならとりあえず申し込む
  • 講義開始月の前月末日まではキャンセル可能
  • わからないことは、サイト読むより電話した方が早い
  • 申込用紙の正規課程への入学希望には、「いいえ」と回答しても受講できた

統合アーキテクチャについて

講義について

CPUパイプラインやメモリキャッシュに思いを馳せ、キャッシュミスペナルティの重要性に気づかせてくれるような講義でした。長年積読になっていた「コンピュータの構成と設計」に自然と手を伸す気力を与えてくれました。

講義の後、毎回30分ほど延長して先生を質問攻めにする会が開かれるなど活発的なクラスでした。

私は、講義中にもわからない点があったら質問し若干進行を妨げてしまった感があったので申し訳なかったですが、とても楽しかったです。

講義は録画されているので、何でも見返すことができます。オンラインでも受講できるのですが、先生に質問しやすいのでオフラインがオススメです。

参考までに講義中に出た用語を紹介します。

データハザード、パイプラインレジスタ、フォーワーディング、ストール、Direct-mapped cache、Set-associative cache、オフラインスケージュリング、オンラインスケジューリング、Rate Monotonic、Earliest Deadline First、優先度逆転問題、優先度継承プロトコル、優先度上限プロトコル

学んだこと、考えたこと

  • 命令数を少なくするとメモリ使用量を少なくできる。
    • 不要なコードがあるとメモリ使用量が多くなるので、不要なコードを削除するのは大事
  • 部分最適をしても全体が速くなるとは限らない
    • パイプラインステージの一部だけ高速化しても意味がない。遅いものに律速する。速いステージをなんとか活かそうとすると回路が複雑になってクロック数が小さくなる可能性がある。
      • Webシステムに応用すると、一部ユーザーのレイテンシを下がることでプロダクト価値は高くならない。平均的なレイテンシを下げるのが重要。
      • 自チームから見ると非効率でも組織全体で捉えると効率な時がありそう。
  • 何事にもメリットとデメリットがある。もし、デメリットが出てこないなら知識不足を疑った方がいい
    • 再帰関数は、メモリ使用量がコードから解析するのが難しいというデメリットというのを知らなかった
  • キャッシュミスは痛い。できるだけキャッシュに乗せろ vs キャッシュを許すな (最悪実行時間が計測できない)

評価について

レポート49点。テスト43点。合計92点でした。

評価Aなので素直に嬉しいですが、理解不足でレポート満点を逃したり、テストで応用問題が解けなかったなど悔しさもあります。

先生曰く、平均点80点を目指してレポートとテストを作成しているようです。

レポート内容発表から2週間後が提出期限でした。レポートに費やした時間は10時間です。内訳は、講義動画復習と課題にそれぞれ5時間。

テストは、資料持ち込み可でした。試験対策として講義動画を4時間復習しました。

(私の)改善ポイント

先生と生徒間のコミュニケーションは活発でしたが、生徒同士の交流はなかったのが少し勿体ないなかったです。

レポートを一緒に作ったり、テスト後の打ち上げなどのイベントを自分で開催すればより楽しめただろうなと思いました。

10月には、「並列処理」と「コンピュータネットワーク特論」を履修予定なのでやっていきます!

雑感

1ヶ月大学院に通う中で、独学で学ぶ環境が整っている時代に敢えて大学に通う意味はなんだろうという考える機会がありました。

良質な問い。そして、問いに対する議論できる場の提供が大学の価値ではないかとないかと考えました。JAISTはその両方が提供されている場ではないかと思います。

最後に

私が考えなかった視点で質問していた受講生の皆さん。JAIST Slackで共に議論したDさんとYさん。遅くまで残って質問攻めにしたにも関わらず嫌な顔をせず付き合って下さった田中先生。ほんの一か月でしたが、皆さんのおかげで楽しい学生生活を送ることができました。本当にありがとうございました。

週報 01/30 - 02/05

技術メモ

  • Nginxのリクエストヘッダーは、$http_names で取れる。例えば、Content-Typeの場合、$http_content_typeね。ドキュメントわかりにくい….。お前が改善していけ。

    $http_*name*

    arbitrary request header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores

    Module ngx_http_core_module

  • MySQLのデータ移行後、データが一致しているか検証する方法

    • CHECKSUM TABLE
    • information_schemaのtable row

日記

  • 週報をサボった
  • 書籍の内容をブログに書けないので辛い。
  • 自作サービス作ると言って行動してないので今週からやります。とりあえず、Twitterアカウントと紙でモック作る
  • IPAの申し込み忘れた。0次試験突破ならず
  • 仕事は朝終わらせたい。早起きします!
  • 社内制度を使って別部署の仕事をできるかもしれない。オンプレ触れるかも?楽しみだ。
  • 服に3万円ほど消費した。
  • 服を購入したら毎回タクシーを利用するようにしている。タクシー広告を見た。タクシー広告のターゲットユーザーは、社長なんだろうな〜と感じた。Saasを導入するのは、社長なのか?という疑問は残ったまま。
    • fondest
    • Brash
    • カイギオ
    • Perk
    • EggForward
    • ACN
  • 来週は、スノボー。5時半起き。やってくぞ
  • Linuxのしくみの輪読会を友人と開催することになった。

読んだ本・記事

  • [試して理解]Linuxのしくみ 1-2章
  • 詳解 システム・パフォーマンス 1章

週報 01/17-01/23

技術メモ

日記

  • リザードンでした
  • 人類締め切り直前にしか活動しない。本当の〆切は誰にも教えるな!
    • MTGの事前予習の話。
  • Aurora v2にするので無限に調べていた。
  • ピカソとその時代ベルリン国立ベルクグリューン美術館展に行った。
    • 時代の変化によって作風が変化していた。情報量が多すぎて時代の大きな流れを追うのが難しくなった。ウクライナの戦争によって心が動いてない。震災もそう。自分事化できないと感情は動かない。自分の場所や時間は固定化されているので、外界(人)の繋がりを多く持つことで補うことができるのではないだろうか。
    • リモートを推奨している人は新しい出会いを意図的に作らないと辛そう。
  • 日本酒の講座を受けた。テイスティングの方法を知った。

読んだ本・記事

週報 01/10-01/16

技術メモ

忘れた… 週報ちゃんと書きます!

今Qは、AuroraとK8sにコミットします!

日記

  • スノボに行った。自分がカービングターンだと思ったやつが、ただのターンだった。2月の中旬にも2回ほどスノボに行くので極めたい。
  • あんまり興味ない人とLINEしてる。円満にフェードアウトする方法を知りたい。
  • リザードンでした
  • 人生で初めて楽しいカジュアル面談を受けた。
    • 初手事業ポートフォリオするの説明するの最高。惚れた。株買いました。
    • どうやって金を稼いでいるかマネージャクラスが説明できるの大事。というかチームメンバーレベルでも意識してるところで働きたい。
    • 会社選びの軸にエンジニアが贔屓されてないのがある。顧客と仲間が幸せな状態で仕事したいやん。
    • https://www.youtube.com/watch?v=iWmXp7xW86Y を見てキャリア、文化、報酬水準を確かめる質問を考えてぶつけた。
      • 入社後、3ヶ月、半年、2-3年で求められる姿や成果があれば教えて下さい
      • 会社または開発組織の文化を体現していると最近感じたエピソードがあれば教えて下さい。また文化を根付かせるために取り組んでいること。また、課題などがあれば教えて下さい
      • 500万、600万、700万のエンジニアに求められるスキルや行動、成果を教えて下さい
      • 新人がドメインを理解するためにやっている取り組みがあれば教えて下さい
    • 時間がなかったので出来なかったが、以下も聞きたかった。
      • 今の技術スタックになった理由を教えて下さい。もし、今からリアーキテクティングするならどのような技術を選択するか。また、その理由を教えて下さい。
        • 今の技術スタックには、あまり興味がない。(触ってみたい技術であれば最高だが最優先ではない。)導入された理由が大事。
        • ステークホルダー関心毎やプロダクト特性を考慮してるか判断したい。
  • カジュアル面談前にIR情報と業界の書籍読むの大事。

読んだ本・記事

そろそろ俺が考える最強の鳥貴族の過ごし方を教える

はじめに

それぞれの鳥貴族の過ごし方が存在する。俺が考える最強の鳥貴族過ごし方を紹介しておく。

https://www.torikizoku.co.jp/menu/

過ごし方

席についたら、濃いめのレモンサワー。生ビール頼むやつは、2流。

はじめの注文は

  • とり釜飯
  • もも貴族焼(たれ)2つ
  • ホルモンねぎ盛ポン酢

ご飯ものの提供は遅いので始めに頼みたい。 とり釜飯が至高。とり雑炊、とり白湯めんは頼んだことがない。 焼鳥は、1つにつき2本なので注意。焼鳥はネギを美味しく食うためにあると思ってるので、もも貴族焼一択である。

ホルモンねぎ盛ポン酢は一回食ってみろ。わかるから。

ホルモンねぎ盛ポン酢を食っている間に、2杯目のドリンクを頼むことになるだろう。

ここで満を辞して生ビール。メガ金麦でもいいが他のドリンクを飲めなくなるので、最近辞めた。

料理がなくなってきたら、以下を頼む。

  • つくねたれ1つ
  • 枝豆

とり釜飯がきたら知多ハイボールを注文。

以上。

まとめ

鳥貴族最高だね。

週報 01/02-01/09

技術メモ

  • jobsコマンドは、シェルに紐づいている。新しいシェルを立ち上げた時は、psコマンドで確認する必要がある。
  • systemctl restart nginxするとリクエストを受け付けない時間が発生する。systemctl reload nginxは、workerを増やす。古いworkerは、処理が終わったらstopさせる。
  • 本番のdumpを取るときにmysqldumpコマンドのオプションは以下。
    • mysqldump --single-transaction --set-gtid-purged=OFF -no-tablespaces
    • -opt オプションを便利
  • dumpするとCPU負荷が上がるので、リードレプリカに対して実施するとよい。
  • Amazon EC2 Auto Scalingの起動設定上限は、500
  • Terraform Stateは、GoFのProxyパターンなのかな〜と思った。Gitで説明してもいいかも。

日記

  • 教育ドメインの会社に勤めているので、リスキリングについて調べていた。ビジネス戦略から人材定義をし、リスキリングで人材確保する必要がある。buy(採用)よりmake(育成)の方がコストが低くなってきた。採用した場合は、定着に難あり。
  • 家の近所にBECK置いてある漫画喫茶を見つけた。行くぞ!
  • 大学時代の友人とオンライン飲み会をした。どこかのタイミングで旅行に行きたい。
  • 最強のぼっち飯について考えていた
    • 飲食店の売上を上げるには、客席数 × 客席回転率 × 客単価 × 営業日数のどれかを改善すればいい。
    • ぼっち飯は、客席回転率の観点で迷惑をかけるので諸々の所作が求められる。
      • カウンター席に行く
      • 早くお店を出る
      • 混雑していない時間にいく
        • 開店後
        • 閉店1時間前
      • 相席を断らない
      • 注文時間を短くする
        • とりあえずビールを頼め
        • 一度に注文する
    • https://squareup.com/jp/ja/townsquare/how-to-calculate-restaurants-turnrate-effect
    • システム設計時には、どうやれば利益を出すことができるのか考えると良い。席単位で会計すると思い込んでいると、相席に対応できないぞ!
  • スノボの服を買った。店員さんによると洗うと撥水機能が低下するので干しだけでよいらしい。

読んだ本・記事

https://blog.kamipo.net/entry/2015/12/08/075800

https://www.youtube.com/watch?v=CfX2aqpOR_E

https://speakerdeck.com/j5ik2o/eiptoakkanituite

https://twitter.com/j5ik2o/status/1295932120188121089?s=20&t=VKxwBfhsmnkrx9ZysquyJA

行ったお店

今週の英語

  • reskilling: リスキリング

来週やりたいこと

  • 書類関係
  • 新しいサービスのビジネスプランを書く
  • 評価面談に向けて読んだ書籍のまとめを書く

週報 12/27-01/01

技術メモ

フロントエンドのデザインパターンをやっていた。

https://zenn.dev/morinokami/books/learning-patterns-1/viewer/forward

日記

読んだ本・記事

今週の英語

寝てました。