生涯未熟

生涯未熟

プログラミングをちょこちょこと。

Next.jsでyarn exportが何故か失敗する

謎の地雷を踏み抜いたのでメモ。

Next.jsで静的HTMLを出力する next export がありますが、これをローカルで実行すると何故かエラーが吐かれ失敗するという事象がありました。

Error occurred prerendering page "/hoge". Read more: https://nextjs.org/docs/messages/prerender-error
Error: Cannot find module for page: /hoge

CIだと通るのに不思議だな〜と思っていましたが、以下に解決法が載っておりました。

github.com

私の場合、別のターミナルでyarn dev (next)コマンドを実行させていました。そのプロセスを停止して、yarn build && yarn exportを実行したら、問題は解決しました。

あっ・・・ next dev やりながらだとダメなのね・・・
ということで next dev を止めて next export したら無事通りました。めでたしめでたし。

CypressのinterceptでGAと通信してるか確かめてみた

Cypress入門1日目だけどやってみてハマったので書く。

interceptについて

ネットワークリクエスト・レスポンスのSpyとStubが出来るよって機能らしい。

docs.cypress.io

今回のやりたいことはGAと通信しているかどうかなので、GAへのリクエストをSpyしてレスポンスを見るなりすれば疎通確認が取れる。

やったこと

そんなこんなでこういうコードが出来た。

ハマったところ

「こんな短いコードのどこにハマんねん」って感じでしょうが、 cy.intercept する際にどうやって別ドメインを指定すればいいのかサッパリわからず、変に cy.origin 使ってみたり右往左往してました。
で、結局optionに hostname があるのを発見してこれ使えばよかったんかいとなりました。
めでたしめでたし。

GitHub API v4でProjectV2のNode IDを取得する

GitHubから2022/10/01よりプロジェクト情報を取得する ProjectNext が廃止となり、代わりに ProjectV2 を使おうというお達しがありました。

docs.github.com

ProjectNext で使っていたNode IDを ProjectV2 でも使えるのかなとやってみたらダメだったので、新たに取得してみた。

やり方

仕事上でAPIを使っているということもあり、今回は会社のorganizationから取得してみました。
クエリはこんな感じ。

プロジェクト番号は各プロジェクト上に割り振られている番号でURL見るとわかると思います。

それかクエリ実行するのめんどくせーって人は単純に PN_XXXXXXX ってなってるIDを PVT_XXXXXXX って置換すれば良さそう。

Next.js + TypeScriptな環境にRollbarを組み込んだ(SourceMap対応付)

やってみたのでメモとして書く。

やらなきゃいけないこと

対応しないといけないことは以下になります。

  • CIなどでSourceMapをRollbarにアップロードする
  • productionBrowserSourceMapsを有効化する
  • TypeScriptでSourceMapを有効化する
  • スニペットを組み込む

CIなどでSourceMapをRollbarにアップロードする

今回対応したCIはCircleCIなので、こんな感じで組み込んでみました。

設定している ROLLBAR_CODE_VERSION はdocker build時にARGで渡して、アプリケーションでClientに組み込むようにします。
こうしないとcode_versionをClientとSourceMapで同期できないので、Rollbarからしたらエラーは報告されたけど、どのSourceMapを突き合わせたらいいのか分からなくなるわけです。

あとは、公式でも紹介されているWebpack Pluginがあるのですが( https://github.com/thredup/rollbar-sourcemap-webpack-plugin )、正直活発だとは言い難い状況なので今回は使いませんでした。もし気になさらない方は使ってもいいのかも?

productionBrowserSourceMapsを有効化する

Next.jsでは本番環境でのbuild時にSourceMapを出力しないようになっているのですが、 next.config.jsproductionBrowserSourceMaps: true とすることで出力するようになりますのでやっておきましょう。

nextjs.org

TypeScriptでSourceMapを有効化する

TypeScriptもやってる人は tsconfig.json にて "sourceMap": true をしておきましょう。 inlineSourceMap ってのもあるのですが、こっちを有効化した場合はNext.jsがどういう認識をするのかは未検証・・・

スニペットを組み込む

最後にクライアントでのRollbarへのエラー送信のためのスニペットを組み込みます。これはRollbarがNext.jsのサンプルを用意してくれているので参考にしてこんな感じで書きました。

docs.rollbar.com

最後に

これで上手く行っていたらエラー時にRollbarに報告されるはずです。
設定できているかの確認方法としては、ブラウザの開発ツールにあるコンソールで window.onerror("TestRollbarError: testing window.onerror", window.location.href) を実行してみたり、スタックトレースがきちんとできているかを確認する方法としてボタンを押したら throw new Error("TestRollbarError"); を実行するようにしたらいいと思います。

あとSourceMapが上手くいっていない時はこんな感じの警告が出るかもです。

私の場合はうまくcode_versionの同期ができておらず、SourceMapをminified_urlからダウンロードしようとしていたため起こっていました。
何かSourceMap周りでうまく行っていないときは、RollbarのProjects -> Source Mapsも確認してみるとそちらでエラーが出ていたりするので確認してみるといいかもしれません。

※この時はcode_versionがクライアントでundefinedを設定していたので上手くいかなかった・・・

正直Sentry使ってたらあんまりハマることなく、スッといけたんだろうな〜と思いつつもRollbarでの対応を書いておきました。 特に選定に制限がない方はSentry使いましょう。

遊撃部隊を立ち上げてみて10ヶ月経った

所属しているチームで遊撃部隊の立ち上げをしてから上期・下期を経て、色々とまとめていきたくなったのでまとめる。

遊撃部隊 is 何?

前段として弊チームではバックエンド・フロントエンド・アプリ・インフラの垣根なく、皆で全領域をこなせるようになろうをモットーで普段の仕事をこなしていますが、それでも個々人の得手不得手がありタスクを持つ人が偏るという現状があります。
その中でも特にインフラを触れる人が少なく、インフラ系統のタスクが拾いきれずに埋もれてしまっていました。私が手の空いた時にインフラタスクをこなしてはいたのですが、それでも片手間では処理しきれないサイズのタスクがチラホラとあり手に余っている状況が続いていました。

こういった事象は他の会社でも起きているだろうと調べてみると、Misocaさんのテックブログで参考になる良い記事がありました。

「重要度: 非常に高いわけではないが、無視できるほどは低くない」「大きさ: プロジェクト化するほどは大きくないが、一人がプロジェクトの片手間でやるには手に余るボリューム」といったこぼれタスクを片手間でやるのではなく、しっかりとチームを組んで対応しましょうというのがMisocaさんがやってらっしゃる遊軍チームでした。
「なるほど、遊軍という概念があるのか」と感銘を受け、マネージャーに掛け合い"遊撃部隊"という名で立ち上げ許可を頂き、たった一人ですが遊撃部隊が誕生するに至りました。

立ち上げからやったこと

まずは対応が必要なタスクの棚卸しから開始しました。弊チームではスクラムを導入しているのですが、そこで利用しているGitHub Projectのボードとは別のボードを作成し、スクラムからは独立して管理するようにしました。
この背景としては、遊撃部隊のタスクとしてDX(開発体験の方)に繋がるツールの調査・検証などストーリーポイントが付けづらいタスクが多いということと、実際にサービスに形作られていくものがあるタスクではないのでタスクの性質が別なものは分けた方がいいだろうという思惑からでした。
ただし、タスク状況が私しか分からないというのは非常に不健全ですので、「今何をやっていてどのようなメリットがあるのか?どのような進捗なのか?」を毎日のミーティングの中で個別に報告するという形式を取っています。

タスクの棚卸しの後は、優先度の高いものから順にこなしながらも「(SRE文脈での)トイルを洗い出す」「アラート類の整理」「開発チームからの不便だと思っている点・アイデアの吸い出し」「DX向上に繋がるツールの調査・検証・導入」を並行しながら行いました。
主に埋没タスクの掘り出しと生産性向上という未来への投資タスクの2軸ですね。独立部隊で活動する意味合いをより強固にするためにも、今あるタスクをこなすことだけに注力した近視眼的な活動だけはやめようと決めていたので、それらの2軸も活動の芯として据えた次第です。
これ以外にも遊撃の名に沿うよう、開発チームで負いきれないバグの調査やQAチームなど部署の離れた他チームへの技術フォローも散発的にやっておりました。(こう書くと何でも屋さんですね😇)

アレコレと書きましたが、この10ヶ月では主にやったことをまとめます。

  • GKE
  • ArgoCD
    • バージョンアップ対応(v1.7 -> v2.3)
    • Syncが回り続ける問題の解決
    • Sync Failed問題の解決
    • migrage jobのSyncが終わらない問題の解決
    • ArgoCDのapp - repo server間の疎通断調査
  • Cloud SQL Proxy
    • バージョンアップ対応
    • imageをalpineベースimageへ変更
    • 終了時にActive Connectionが存在していても終了してしまう問題の解決
  • DX改善
    • 各種アラートの追加・整備(オオカミ少年アラートにならないように)
    • SLAを算出するためにサービスの死活監視の導入
    • リリースPull Requestの自動作成・更新botを導入
    • IAP有効化されているかのチェックbotの作成
    • Workload Identity連携の実施
      • 不要となったサービスアカウントキーを削除できた
    • CircleCIに存在するubuntuイメージやgoogle/cloud-sdkイメージなどのアップグレードに関する調査・対応
    • デプロイ担当決めbotの運用(現在はデプロイフローが整ったため廃止)
    • Renovateの導入とバックエンド/フロントエンドの依存ライブラリアップデート
    • Rollbarの導入
    • Figmaでの新着コメントをSlackへ通知するスクリプト実装
    • ログ情報を構造化ロギングへ対応
    • 開発環境の使用状況の可視化( 「開発環境の使用状況分かるくん」を作って冗長コミュニケーションを無くした話 - 生涯未熟
  • インフラ
    • 非推奨となったKubernetes External SecretsからExternal Secrets Operatorへの移行作業
    • External Secrets Operatorのv0.4.4 -> v0.5.1へのアップグレードに関する調査・対応
    • IaCリポジトリにHelm Kubeconform Actionを使ったCIを構築
    • インフラドキュメントの作成・整理
    • 廃止された古いTLSバージョンを制限したTLSポリシーの適用
    • 社内セキュリティ脆弱性指摘への調査・対応
    • GraphQLのセキュリティ調査
    • log4j2など緊急性の高いセキュリティ脆弱性への調査・共有・啓蒙活動(社内のセキュリティチャンネルをチェックする癖がつきました)
    • Locustを用いた負荷環境の作成
  • パフォーマンス改善
    • 一部GraphQLクエリのLatency調査・改善
    • 画像リソースが一部外部ストレージへのリクエストになっていなかったので修正
    • CIの高速化(2倍~6倍短縮)
  • その他
    • 開発チームの悩み事の解決
    • インシデント対応・調査のサポート
    • エラーログの調査・トリアージ・共有(最近は自分以外にもやってくれる方が増えました)
    • イベントに向けた負荷調査・他メンバーへの知見共有
    • GCPプロジェクト誤削除に対するインシデントハンドリング・対応・再発防止策の調査・実施( GCPプロジェクトが削除されたら何が起こるのかメモ - 生涯未熟
    • インシデント発生時対応のドキュメント作成などの文化醸成(ポストモーテムの導入)
    • 退職者に紐付くリソースの調査・対応。必要なものに関してはバックアップ取得
    • 遊撃部隊への相談アワーの実施(遊撃部隊で拾い上げられそうな個々人が抱えているお悩みの共有など)
    • 秘密情報の一元管理化(スプレッドシート管理など散らばっている情報群から1Password管理へ変更)
    • 各種自作ツールのメンテナンス
    • サービスに関するツイートをSlackへ通知するスクリプト実装
    • SlackとGitHubの連携(ユーザー名変換)が上手くいかないバグに対するGitHubとのやり取り対応(結局GitHub側のバグでした)
    • スクラム便利ツールの開発
      • GitHub Project betaで管理しているタスクの各ステータス毎の合計ストーリーポイント数を表示するChrome拡張を作成
      • 特定のステータスのissueに関する特定ラベルを一括削除するスクリプトの作成
      • 機能実装タスクに必須のリリース作業タスクなどのissueを一括作成するスクリプトの作成
      • バーンダウンチャートと付随するスクリプトの作成
    • QA作業円滑化のためのデバッグツールの作成
    • QAで利用しているMagicPodを使った自動化のお手伝い
    • 社内ツールの検証作業

ザッと羅列してみましたが、一人でやっているとこのくらいが限界でした・・・
ここに列挙した以外にも社内関連で採用活動や、社内イベントに向けたアレコレなどをやっていましたが、まだまだやりたいことが多いです🤔
特に最近は色々な会社さんがやられているプレビュー環境自動作成の構築とかはとてもやってみたいですが、なかなか時間が取れず。

ここまで遊撃部隊をやった感想としては、自分にはこういう裏方作業というか縁の下の力持ちな役割が向いていたんだなと気付かされました。こういう発見があるので新しいことに挑戦してみることは良いですね。
あとは遊撃部隊という取り組みを通じて、Googleさんが提唱しているSREという職種についての造形が深くなりました。特にGoogleさんが主催でやってらっしゃるSRE研修に参加させていただたいのですが、何故SREという新しい職種が必要なのか?組織にどういったメリットがあるのかがよりクリアになる良い研修でした。もう少し今やっている様々なタスク群が落ち着けばSLA/SLOの設定などなどSRE活動へ着手していきたいです。

という遊撃部隊を立ち上げてみたまとめでした。