Go

contextのキャンセル時にtesting.T.Cleanupのようにクリーンアップ処理を実行できるパッケージdonegroupを作った

Go

contextのキャンセルとそれに対応したクリーンアップ処理 Goにおいてcontextはさまざまな値を伝搬させるために使用します。その1つがキャンセル信号です。 ctx, cancel := context.WithCancel(context.Background()) defer cancel() contextを通じてキャンセ…

GoのHTTPミドルウェアやその周辺パッケージを配布する新しいGitHub Orgをはじめました

Go

このエントリは GMOペパボエンジニア Advent Calendar 2023 および、 Go Advent Calendar 2023 シリーズ3 の19 日目の記事です。 以下のエントリでも少し触れられていますが、現在プロキシサーバをGoで書くプロジェクトがあります。 ten-snapon.com k1low.ha…

カジュアルに使えるスタブサーバとしてhttpstubとgrpcstubを作って使っている

Go

このエントリは Go Advent Calendar 2023 12 日目の記事です。 Goのテスティングパッケージで一番好きなパッケージは net/http/httptest です。 テスト実行時に実際にHTTPサーバを立ててHTTPリクエストを受けるというシンプルかつ強力なアプローチが良いです…

Go Conference mini 2023 Winter IN KYOTOに参加してきた #kyotogo

Go

京都に行ってきました。 Go Conference mini 2023 Winter IN KYOTO kyotogo.connpass.com すでに、ne-sachirouさんによりスライド資料などが集められています。感謝! scrapbox.io 「miniとは?」となるGoで濃縮された1日になりました。運営の皆様、本当にあ…

スタブの役割をするためだけに生まれてきたバイナリstubin

Go

複数のコンポーネントが連動するアプリケーションのテストを書くとき、「どこまでを本物を使ってどこからモックするか」みたいな話は開発の現場のいたるところであると思います。 「要はバランス」だったり「答えは現場の数だけあ」ったり*1。 外部コマンド…

octocovで任意のメトリクスを記録できるようにした(カスタムメトリクス)

Go

octocov octocovはコードカバレッジのためのツールキットです。 github.com コードカバレッジなどのコードメトリクスを手元のターミナルで確認したり、GitHub ActionsのActionとしてPull Requestにレポートしたりできます。 計測したコードメトリクスを、さ…

テストでしか使わないパッケージをgo.modに含めない方法

Go

元エントリは↓で、これが全てです。 dev.to 最高じゃんhttps://t.co/c1hfSYhgx2— k1LoW (@k1LoW) 2023年8月26日 Goでツールではなくライブラリ(パッケージ)を作っているとき、テストにしか使わないパッケージがgo.modに入って依存関係ができてしまうのが、…

gh auth loginで作成されたクレデンシャルだけで生活するためにgh-doを作った

やっとgh auth loginで得たクレデンシャル(OSのセキュアストレージに保存されているもの)のみを使う生活になったぞ— k1LoW (@k1LoW) 2023年5月15日 GitHub CLIの gh auth login で作成されたクレデンシャルはOSのセキュアストレージに保存されるようになり…

Calendar Versioningを扱うパッケージ/ツールとしてcalverを作った

Go

提供する機能とは関係なくリリースを定期的に実施するようなプロダクトや、バージョンにSemantic Versioning(以下SemVer)のような意味付けがしにくいプロダクトの場合、バージョン管理手法にCalendar Versioning(以下、CalVer)というものが採用されるこ…

tblsをセットアップするGitHub Actionとしてsetup-tbls(を作るツールとしてgh-setup)を作った

タイトルが何を言っているのかよくわからないと思いますので順を追って紹介したいと思います。 tblsをセットアップするGitHub Actionとしてsetup-tbls を作った setup-tblsはtblsをインストールしてくれるGitHub Actionです。 github.com 各所で「ないの?」…

データベースドキュメント生成コマンド tbls 更新情報(Mermaid対応 / schema.json / tbls outの強化)

Go

久しぶりのtblsの新機能紹介エントリです。 ドキュメントのER図出力にMermaidを指定できるようになりました ER図の出力フォーマットにMermaidを指定できるようになりました。次のように er.format: セクションか --er-format オプションに mermaid を指定す…

経過時間を内訳も含めて計測するためのストップウォッチライブラリ stopw を作った

Go

runn を使ってシナリオテストを順調に積み上げていった結果、順調にテスト実行時間が長くなってきました。 そこでテストのどの部分に時間がかかっているかを計測したくなったのですが、runnにその時間計測機能はなかったのでそれを作ろうと考えました。 とこ…

シナリオテスティングツール/パッケージであるrunnをgRPCに対応させた

Go

gRPC、Unary以外のメソッドの挙動が面倒すぎてうまくrunnの実装の落とせない特にBidirectional-Streaming、お前だ— k1LoW (@k1LoW) 2022年6月26日 なんとかgRPC対応ができました。 「そもそもrunnって何?」については会社のテックブログにエントリを書きま…

gomockで「呼ばれるべき」と指定した関数の非同期な実行を待ちたいのでテストヘルパーを書いてみた

Go

gomockでデータベース操作などをモックすることはよくあると思います。 そのテスト関数内で「呼ばれるべき(EXPECT())」と指定した関数に非同期に実行される挙動がある場合、テスト関数の書き方によっては実行終了までにその関数が実行されないことがあり、…

データベースにクエリを投げて結果をプリントするライブラリqpを作った

Go

データベースを伴うテストを書いていて、何故かテスト結果が安定しない事象に出くわして「なんでだ?????」と混乱した結果、データベースの状況をprintデバッグをしたくなって作りました*1。 github.com 使い方は package main import ( "database/sql" …

ファイルの一部の文字列を差し替えするためのコマンド/パッケージ repin を作った

Go

継続的ドキュメンテーション関連です。 README.mdなどのドキュメントを運用していると、そのドキュメントの一部を(CIなどで)自動で差し替えたいことがあります。 例えば xxx help コマンドの出力をもって機能一覧にしているようなREADMEだと、機能が追加さ…

awsdoに ~/.aws/(config|credentials)の設定情報がなくてもAssumeRoleできるようにするためのオプションと、AssumeRoleしたロールでAWSコンソールにログインするオプションを追加した

1年以上前からの久しぶりのアップデートです。 k1low.hatenablog.com --role-arn --source-profile 複数のAWSアカウントを横断して作業することがあり、AssumeRoleのための設定を~/.aws/(config|credentials)に書くのすら面倒になってきたので、設定なしでAs…

せめてリポジトリの各ディレクトリの概要説明だけでも欲しい思ったので dirmap というツールを作ってみた

Go

既存の開発に参加するときや、0->1の開発をしているとき、いつも「せめてリポジトリの各ディレクトリの概要説明だけでも欲しい」と思っていました。 既存のプロジェクトに参加するときは「プロジェクトの理解をする側」、0->1のプロジェクトで開発をしている…

ディレクトリ内のPDFとEPUBをタイトル付きでリストアップする ebk ls を作った

Go

1つのディレクトリに雑に放り込んでいた電子書籍をPDFとEPUB横断でCLIからタイトル検索して開けるようになった。オライリーとかファイル名から中身を類推できなくて困っていたのでこれで「あの書籍どのファイルだっけ?」がはかどる。 pic.twitter.com/0wVSj…

go-githubのClientをいい感じに組み立ててインスタンスを生成するだけのgo-github-clientを作った

毎回、go-githubのclientをGITHUB_*やらGH_*やらを判定して組み立てたり、外部パッケージのgo-githubのバージョンに合わせたりするのが面倒になって、カッとなって作ったhttps://t.co/8zhsP3V8cvサブディレクトリの使い方がひどい(go-githubのバージョンに…

Monorepoなリポジトリでgo.modがネストされた位置にあるときのgoplsの設定

$ gopls version golang.org/x/tools/gopls v0.7.3 golang.org/x/tools/gopls@v0.7.3 h1:Lru57ht8vtDMouRskFC085VAjBAZRAISd/lwvwOOV0Q= Monorepoなリポジトリ内のサブプロジェクトの開発でEmacs + goplsが動かないなーと思っていて *lsp-log* bufferをみる…

GitHub上にあるリポジトリに対してAPIを通じてgit grepライクに走査できるツール gh-grep (gh grep) を作った

git grep 便利ですよね。 私は git grep と git gsub は本当によく使います。 ところで git grep はローカルリポジトリがないと実行できません。 ローカルにリポジトリがなければ git clone して、 git grep すればいいのですが、もう少し簡単にgrepするため…

YAMLファイルの全ての値にos.Expandenv(os.Expand)を適用するgithub.com/k1LoW/expandを作った

Go

私は作るツールの設定ファイルのフォーマットをYAMLにすることが多いです。 そして各値で環境変数を展開できるようにする機能を追加することがあります。 以下のような設定ファイルを読み込んだ際に、 ${COVERAGE_ACCEPTABLE} や ${COVERAGE_BADGE_PATH} を…

メンテナンスが終了しているgithub.com/dgrijalva/jwt-goの脆弱性CVE-2020-26160に対応する

go.modでコミュニティメンテナンスバージョンの github.com/golang-jwt/jwt に replace すれば良さそうです。 replace github.com/dgrijalva/jwt-go => github.com/golang-jwt/jwt v3.2.2+incompatible github.com/dgrijalva/jwt-goは様々なパッケージで利用…

GitHub Actionsのサプライチェーンを構成しているDockerイメージやサードパーティActionのコード対して任意のコマンドを実行するツールを作ってみた

注意: 本エントリで紹介するツールは現時点でPoCな実装であり、効果や効率を保証するものではありません。 ちょっと前に社内でGitHub Actionsのサプライチェーン攻撃についての話題があがって、「なるほどー。今時は、リポジトリのコードだけの脆弱性や第三…

任意のPull Requestの内容を複数のリポジトリに対して一括コピーするツールpr-bulletを作った

GitHub Actions便利ですよね。 ペパボではGitHub Enterprise Server(以下、GHES)が運用されており、GHESでもGitHub Actionsが利用できます。 uses: だけで利用できるリポジトリを横断で再利用可能なActionの存在はかなり生産性を上げていると思います。 そ…

フォント周りで作成したGoパッケージの紹介

Go

Goでフォントを扱うことって(おそらく、たぶん、きっと)ほとんどないと思うのですが、私はなぜか文字が入っているpngファイルの生成とかER図とかを出すようなOSSを開発していることから、フォント周りのGoパッケージを作る機会がありました。 どれもパッケ…

Trivy DBを他のデータベースにマイグレーションするツール trivy-db-toを作った

Trivyは言わずと知れた脆弱性スキャナです。 私は最近までコンテナ専用のスキャナだと思っていましたがそんなことはなく、様々な環境に対してOSパッケージやアプリケーションの依存ライブラリの脆弱性を高速に検知してくれる汎用的なスキャナです。 k1low.ha…

データベースドキュメント生成コマンド tbls 更新情報 (テンプレート変更機能/ドキュメント内リンクのbaseUrl変更機能/テーブルリレーション自動検出機能)

Go

https://t.co/bxDrGgWriy がマージされたらtblsの新機能紹介エントリ書く— k1LoW (@k1LoW) 2020年11月9日 無事マージされてさらに便利になったtblsの新機能紹介エントリです。ちなみに、自分が追加した機能は1つもありません。 tblsをさらに便利にしてくれる…

GitHubやSTNSと会話して公開鍵を取得・更新するツールkeypを作った

GMOペパボではLinuxユーザ、グループの管理にSTNSやOCTOPASSを利用しています*1。 stns.jp github.com これらは簡単に言うとそれぞれTOMLファイルやGitHub(GHE)のユーザ情報をデータソースとしてLinuxユーザ、グループ、さらに公開鍵の管理をするものです。…