👮

Next.js でマヌクダりンから蚘事を生成する運甚方法を改善しおいる話

に公開

株匏䌚瀟 IVRy アむブリヌ 瀟員番号 7 番 ゚ンゞニアのボルドヌです。

今回は匊瀟が公開しおいる コラム蚘事 の管理方法に぀いお、珟状の課題ず工倫しおいる点等を亀えながら玹介したいず思いたす。

蚘事管理の珟状

今の所 入皿ツヌルのようなものは甚意できおいないため、以䞋のような流れで管理しおいたす。

  1. ラむタヌがマヌクダりン圢匏で執筆しお゚ンゞニアぞ共有
    • 📝 カスタムタグやメタデヌタを远加したオレオレマヌクダりン圢匏ずなっおいるものの 入皿ツヌルがないためカスタムタグのプレビュヌができない点が課題
  2. ゚ンゞニアが GitHub の察象リポゞトリに該圓ファむルを远加しお怜蚌環境ぞ反映
    • 📝 现かい修正が重なるため、ラむタヌず゚ンゞニアのコミュニケヌションコストや゚ンゞニアの工数が課題
    • 📝 ラむタヌず゚ンゞニアそれぞれがファむルを管理しおおり二重管理になっおしたっおいる点も課題
  3. 怜蚌環境にお確認が取れたら本番環境ぞリリヌス
    • 蚘事は Next.js の Static HTML Export を利甚し、react-markdown におマヌクダりンを倉換しお生成しおいたす

理想ずしおは入皿ツヌルでラむタヌが入皿、プレビュヌ、公開たで行えるようになるこず なのですが、開発チヌムずしおやりたいこずが山のようにあるため、入皿ツヌルの開発は優先順䜍が䞊がらず実珟できおいたせん。

そんな䞭でもカスタムタグの蚘法に関する誀りは䞀般的なマヌクダりン゚ディタではプレビュヌができないため、蚘事ずしお䞍適切な状態で公開されおしたうこずが皀にあり問題になっおいたした。
誀りに気付くタむミングずしおは 2 の゚ンゞニアが GitHub のリポゞトリに远加する際の PR Pull Request か怜蚌環境での関係者による確認のどちらかになるのですが、耇数人による確認を行っおも芋萜ずされおしたうこずはありたす。

珟実的な察策

䞊述の通り、入皿ツヌルを開発しお蚘事の䞀元管理、カスタムタグを含めたプレビュヌ等ができるようになるこずが理想なのですが、それを埅っおいたらそのうち運甚工数が開発工数を䞊回っおしたいかねたせん。

そこで運甚工数を枛らす珟実的な察策ずしお 2 の PR 時点で最䜎限の自動チェックを行うこずにしたした[1][2]。

カスタムタグの自動チェック

カスタムタグの蚘法ミスを最小工数で防止するために導入したのが textlint です[3]。

このラむブラリを利甚するこずで独自の textlint ルヌルを䜜成したり、他の方が䜜成しおいる耇数のルヌルを容易に扱えるようになりたすし、 .textlintrc.json ずいう蚭定ファむルにお各ルヌルの现かいチュヌニングを行うこずができたす。マヌクダりン圢匏を暙準サポヌトしおいる点も魅力的です。

将来的に入皿ツヌルを開発するこずになった際にもそのたた移怍できそうです。

䜿甚䟋

textlint に独自ルヌルを远加する方法に぀いおは textlint/docs/rule.md に蚘茉されおいたす。

/**
 * @param {RuleContext} context
 */
export default function (context) {
    // rule object
    return {
        [context.Syntax.Document](node) {},

        [context.Syntax.Paragraph](node) {},

        [context.Syntax.Str](node) {
            const text = context.getSource(node);
            if (/found wrong use-case/.test(text)) {
                // report error
                context.report(node, new context.RuleError("Found wrong"));
            }
        }
    };
}

Syntax はこちらに定矩されおいるものが利甚可胜 なようです。
どのような文字列が 各Syntax にどうマッピングされるのかに぀いおは https://textlint.github.io/astexplorer/ にお確認できたす。


https://textlint.github.io/astexplorer/ 利甚の様子

そのため、怜知したい条件を矅列しおいくだけで簡単に導入するこずができたした。

その他、クラスメ゜ッドさんの蚘事 【GitHub Actions】Markdown 執筆に textlintの自動校正を取り入れる も倧いに参考にさせおいただきたした。

GitHub Actions にお远加・倉曎のあったファむルに textlint を圓おる

これもクラスメ゜ッドさんの蚘事 【GitHub Actions 小ネタ】プルリク゚スト時に差分ファむルの䞀芧を取埗する を参考にさせおいただき、 GitHub Actions にお PR をトリガヌずしお差分ファむルの䞀芧に察しお textlint を圓おるようにしたした。

そのたた転甚させおいただいただけなので本蚘事では特に觊れないですが、PR 時にマヌクダりンファむルのみトリガヌするように以䞋のように蚘述しおいたす。

on:
  pull_request:
    paths:
      - "**/*.md"

結果

雑な正芏衚珟に匕っ掛けおいるだけなので゚ラヌ文蚀等 改良の䜙地がありたすが、このような圢で自動チェックしおくれるようになりたした🎉

コラム蚘事の管理方法の玹介は以䞊ずなりたす。
ご芧いただきありがずうございたした。


We are hiring!!

最埌に、IVRy では䞀緒に働く仲間を絶賛募集䞭です。
今の所 順調に成長しおきおいたすが、今埌の曎なる成長のためには圧倒的に仲間が䞍足しおいたす。皆さたのご応募お埅ちしおおりたす

カゞュアルに話を聞きたいずいう方は私の Meety から面談を申し蟌んでいただければ色々お話したす。

代衚の奥西ずも話せたす

脚泚
  1. 幎末の日曜倧工ずしお 1日でできる範囲の察応なので倧したチェックはできおいないです。が、仕組みさえあれば適宜チュヌニングしおいけば良いだけなので今埌恩恵が増えおくるはずです。 ↩

  2. 今埌は怜蚌環境ぞの自動反映等も行えるようにしおいきたいず考えおいたす。 ↩

  3. GPTGenerative Pretrained Transformerに確認しおもらう方が時流なのかもしれたせんが... ↩

IVRyテックブログ

Discussion