こちらの記事は「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秒で終わるようになりました。
爆速!