理系学生日記

おまえはいつまで学生気分なのか

GitLab CI/CD で textlint を実行する

きちんとしたガイドを書く、そしてそのガイドを多人数で変更するというケースでは、文章の揺れ等をで きるだけ防ぎたい。 このため、GitLab CI/CD で textlint を導入したい。

textlint 用 Docker Image の作成

Docker Hub を探してみたのですが、広く使われている textlint のイメージは無いようでした。 それぞれのドキュメントで必要なルールも異なるということも多分に影響しているのでしょう。 このため、自分で Docker Image をビルドし、Container Registry へと push することにしました。

Dockerfile はこんな感じにしました。package.jsonpackage-lock.json を組み込んで npm install するだけです。

FROM node:current-alpine3.11

COPY ./package*.json ./
RUN npm install

ENTRYPOINT ["textlint"]

ルールやフィルタは以下を有効にしています。 詳細な設定については .textlintrc に記載します。

フィルタ

  • textlint-filter-rule-comments
    • <!-- textlint-disble --><!-- textlint-enable --> で囲まれた箇所を textlint の対象外にできるフィルタです
  • textlint-filter-rule-whitelist
    • 特定のパターンに合致する文字列を textlint の対象外にできるフィルタです。

それぞれについては、以下の Qiita 記事が参考になります。

ルール

Docker Image の build、push

GitLab は無料で Container Registry の機能を使用できます 。このため、Dockerfile や package.json などに変更があった場合に build-textlint ジョブを起動させるようにしました。当該ジョブで Image の build と push をするように構成しています。

stages:
  - preflight
build-textlint:
  stage: preflight
  image: docker:${DOCKER_VERSION}
  services:
    - docker:${DOCKER_VERSION}-dind
  only:
    changes:
      - "docker/textlint/*"
  before_script:
    - docker login -u ${CI_REGISTRY_USER} -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
  script:
    - docker build -t ${CI_REGISTRY}/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/textlint:latest docker/textlint
    - docker push ${CI_REGISTRY}/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/textlint:latest

DinD を使っていますが、技術的な詳細をしっかり理解できていません。このあたりは勉強しないといけないなぁと思っています。

textlint の適用

textlint を実行するジョブは非常にシンプルですね。 markdown ドキュメント等に変更があった場合に、全ドキュメントに対して textlint を実行するだけです。

textlint:
  stage: lint
  image:
    name: ${CI_REGISTRY}/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/textlint
    entrypoint: [""]
  script:
    - npx textlint "**/*.md"
  only:
    changes:
      - "**/*.md"
      - .gitlab-ci.yml
      - .textlintrc
      - prh.yml
      - docker/textlint/Dockerfile

まだ正式なガイド等を記載していない状況なので、時期尚早な印象もあります。 ただ、早いフィードバックこそが正義だとは思っているので、やはり早期に適用した方が良いのかなと考えています。