【typos-cli】タイポをAzure Pipelinesで爆速チェックする
2022-12-26
azblob://2022/12/26/eyecatch/2022-12-20-quickly-check-typos-with-Azure-Pipelines-000.jpg

こちらの記事は「FIXER Advent Calendar 2022」20日目の記事です。

はじめに

こんにちは、本田です。

コードを書いているといつの間にかtypoをしてしまい、だれも気付かないままmainにmergeされるなんてことありませんか?

このようなことが起こらないように我々のチームではRust製のタイポ検出ツール、typos-cliをAzure Pipelinesに導入しています。

導入してみましたが、、、Azure Pipelines上で遅い!

typosの実行時間は早いのですが、typos-cliのcargo installが2~3分と比較的長い!

というわけで今回はtypos-cliの基本を紹介しつつAzure Pipelinesでtypos-cliを爆速で実行させる方法を書きます。

あ、Gihub Actionsにtypos-cliはありますので、Azure Pipelinesにこだわらない方はこちらからお試しください。本田はAzure Pipelinesにこだわりました。

typos-cliについて

typos-cliはRust製のソースコードのスペルチェッカーです。

install

cargo install typos-cli

もしくは

brew install typos-cli

でインストールしてください。

使い方

typos

とやればtypoを検出してくれます。

こんな感じでtypoを怒ってくれます

$> typos
error: `numebr` should be `number`
 --> .\src\lib.rs:112:13
    |
112 |         let numebr = 0;
    |             ^^^^^^
    |

意図的な単語に対してtypoを検知をした場合は _typos.toml に単語を追加して上げればいいです。

[default.extend-words]
numebr = "numebr"

これでnumebrに関しては検知しなくなります。

その他オプション(?)として、

// 正しい単語に修正してくれる
typos -w

// 正しい単語に修正した場合の差分を修正してくれる
typos --diff

// 標準入力されたものを正しい単語に修正して標準出力してくれる
typos - -w

があります、適宜使いましょう。

typos-cliを使ってAzure Pipelinesでtypoを爆速チェックする

さて、本題です。まあ爆速でチェックする方法ですが、cargo installが長いだけなのでビルド済みのtypos-cliを持ってくればいいです。

releaseに各環境のビルド済みファイルが上がっているのでそれをwgetなりで手元に持ってきて展開していい感じに配置してやります。

結果的にyamlはこんな感じになりました。

trigger:
- main
pr:
  branches:
    include:
    - '*'

pool:
  vmImage: ubuntu-latest

steps:
  - script: |
      mkdir $(Pipeline.Workspace)/_tmp
      URL=$(curl -s https://api.github.com/repos/crate-ci/typos/releases/latest | grep "browser_download_url.*linux.*tar\.gz" | cut -d : -f 2,3 | tr -d \")
      NAME=$(curl -s https://api.github.com/repos/crate-ci/typos/releases/latest | grep "name.*linux.*tar\.gz" | cut -d : -f 2,3 | tr -d \",)
      sudo apt install wget -y
      wget -q -P $(Pipeline.Workspace)/_tmp ${URL}
      export FILE_PATH=`echo $(Pipeline.Workspace)/_tmp/${NAME} | tr -d " "`
      tar -zxf ${FILE_PATH} -C $(Pipeline.Workspace)/_tmp
      cp $(Pipeline.Workspace)/_tmp/typos $(Build.SourcesDirectory)
      export RESULT=`$(Build.SourcesDirectory)/typos`
      echo "${RESULT}"
      RESULT="${RESULT//'%'/'%25'}"
      RESULT="${RESULT//$'\n'/'%0A'}"
      RESULT="${RESULT//$'\r'/'%0D'}"
      RESULT="${RESULT//$'`'/' '}"
      echo '##vso[task.setvariable variable=typos.result;]'${RESULT}
    displayName: check typo
    workingDirectory: '$(Build.SourcesDirectory)'
  - script: |
        echo "##vso[task.LogIssue type=error;]$(typos.result)"
        echo "##vso[task.complete result=Failed;]"
    displayName: Post Result
    condition: ne(variables['typos.result'], '')

注意点として以下があります。

  • workingDirectoryなどファイルの配置位置は環境によって変えてください。
  • 最新版のtypos-cliを使うために、ダウンロードURLとtypos-cliのフルネームをGithub APIで取得しています。いらない場合は消してください。
  • Azure Pipelines実行時の数分前にtypos-cliのrelease行われた場合はエラーが出ることを確認してます。ちょっと待てばいつも通り使えます。
  • RESULT周りですが、typosのpipelinesの実行結果をいい感じにGithubから見えるようにゴニョニョしてます。いらない場合は消してください。

 

おわりに

これで実行時間が2~3分あったtyposのPipelinesが13秒で終わるようになりました。

爆速!