https://buildersbox.corp-sansan.com/entry/2022/04/18/110000

Eightでフロントエンドエンジニアをしている青山です。

今回はEightのCI環境にtextlintという文書校正ツールを導入してみたので、その経緯や実施した内容をお伝えします。 サービスを複数抱えているなど、文書管理が煩雑になってチェックが大変、といった場合に活用できるかもしれません。

ある日のフィードバック

Eight(およびSansanの各プロダクト)では、社内のslackでフィードバックを受け取るチャンネルが存在しています。活発に社内外からのフィードバックが投稿されていますが、ある日の投稿で以下のようなものがありました。

今日届いたお知らせの文言に「副業」というのが使われてました。

Eightでは「副業」使わずに「複業」とする、みたいな方針だった気がしたので、気になりました。

実際このフィードバックが上がった直後には、素早く修正リリースが行われたのですが、初期リリース時にはどうやら担当者のチェックフローが漏れてしまったようでした。

目視によるチェックは負荷が大きいですし、当然人間ならミスもします。こういった場合には、そう、自動化です。 というわけで、textlintをCIに組み込むことを思いつき、作業を進めていきました。

要件を整理

textlintによるチェックを導入したいとひとことに言っても、適用内容やその範囲など、やりたいことを整理する必要があります。 今回は以下のような内容を検討しました。

これらを実現するに当たって、textlintのカスタマイズ性やルールをまとめて公開できる機能が適していると考えました。*1

共通ルールセット作成

要件にそって、社内用のtextlintルールセットとして@eightcard/textlint-rule-preset-eightを作成し、各プロダクトに適用してきました。 まずは@eightcard/textlint-rule-preset-eightそのものについてです。

ベース定義

textlint-rule-preset-japaneseという日本語文書用のルール定義を参考に、以下のようなコードを作成しました。ほとんどtextlint-rule-preset-japaneseを流用させてもらい、後述するprhルールを追加しているというかたちです。

"use strict";
const path = require('path');
const { moduleInterop } = require("@textlint/module-interop");
const presetJapanese = moduleInterop(require("textlint-rule-preset-japanese"));

module.exports = {
  ...presetJapanese,
  rules: {
    ...presetJapanese.rules,
    "prh": moduleInterop(require("textlint-rule-prh")),
  },
  rulesConfig: {
    ...presetJapanese.rulesConfig,
    "prh": {
      "rulePaths" :[path.join(__dirname, "./prh.yml")]
    },
  },
};