ShellCheckで自動化の品質を向上させる

nwiizo

2023.10.31

はじめに

Site Reliability Engineering (SRE) の領域では、トイル (toil) の削減と効率的なオペレーションが大きな課題となっています。
トイルというのは、手作業で繰り返し行う作業のことを指します。これらを減らすことで、SREチームはもっと価値のある改善や新機能の開発に力を入れることができます。

しかし、自動化はトイルを減らす方法でありながら、新しい問題を生む可能性もあります。そのため、自動化の品質を保ち、信頼性を上げることがとても大切です。
その時、自動化の手段としてよく選ばれるのがシェルスクリプトです。シェルスクリプトは手軽で便利ですが、予期せぬ動きを避けるのは案外難しいものです。
特に大規模プロジェクトやたくさんのエンジニアが関わる場合、コードの品質を保つのはかなり難しいです。

ShellCheckは、これらの問題を解決し、シェルスクリプトをより信頼できるものにするのに役立ちます。

トイルの定義と判別方法

トイルは、反復的でマニュアルな作業を指します。これには、例えば、手動でのシステムのスケーリングや、エラーのトラブルシューティング、ルーティンなメンテナンス作業などが含まれます。
トイルを特定し、それを自動化することで、エンジニアはより創造的なタスクやプロジェクトに焦点を合わせることができます。

参考資料:

トイルの自動化によりヒューマンエラーのリスクを減らせる

トイルの自動化はヒューマンエラーのリスクを減らし、効率を向上させることができます。しかし、自動化されたプロセスが正しく機能することが重要であり、そのためには自動化の品質を確保する必要があります。

自動化による失敗

自動化による失敗は、通常のオペレーションミスより大規模になる可能性があります。
スクリプトのエラーやバグ、不適切なエラーハンドリングはこれらに起因する可能性があります。問題を特定し、修正するために、静的解析ツールを使用することが時には有効です。

ShellCheckは、シェルスクリプトの静的解析を提供するツールであり、コードの品質を向上させ、バグや潜在的な問題を特定することができます。

ShellCheckの紹介

ShellCheckは、シェルスクリプトの静的解析ツールであり、コードの品質と信頼性を向上させる目的で使用されます。
ShellCheckは、シェルスクリプトのバグ、コードの欠陥、潜在的な問題点を特定し、解決策を提供することができます。

これにより、エラーやバグを早期に検出し、修正することが可能となり、最終的にはヒューマンエラーのリスクを減らし、自動化の品質を向上させることができます。

コマンドラインから簡単に使用することができ、既存のコードはもちろん、継続的インテグレーション (CI) と統合することも可能です。これにより、開発プロセスの早い段階でコードの品質を確保し、トイルの自動化による失敗を減らすこともできます。

ShellCheckの検知サンプル例

ShellCheckは、シェルスクリプトに潜む様々な問題を特定することができます。ここでは、特に事故につながる可能性のある問題の例をいくつか紹介します。

変数の安全な扱い(SC2115)

変数が空または未設定の場合には予期せぬ問題やデータの損失を引き起こす可能性があります。${var:?} という構文は、変数 var がnullまたは未設定の場合にコマンドを失敗させるためのものです。これにより、変数が空の場合に危険な操作を防止することができます。

#!/bin/bash
rm -rf "$STEAMROOT/"*

このコードスニペットは、$STEAMROOT 変数が空の場合、システムのルートディレクトリ (/) のすべてのファイルとディレクトリを削除 (rm -rf /*) する危険があります。これは非常に危険な動作であり、システムを完全に破壊する可能性があります。

rm -rf "${STEAMROOT:?}/"*

この修正により、$STEAMROOT 変数が null または未設定の場合、コマンドは失敗し、危険な操作は実行されません。

変数の未定義(SC2154)

#!/bin/bash
echo "Hello, $name!"

上記のスクリプトでは、$name 変数が未定義です。これにより、意図しない出力が生成される可能性があります。ShellCheckは未定義の変数を警告し、変数を正しく定義することを推奨します。

クオートなしの変数展開(SC2086)

#!/bin/bash
file_path="/some path/with spaces/file.txt"
cat $file_path

この例では、$file_path 変数はクオートなしで展開されています。このため、空白を含むパスが正しく解釈されず、catコマンドは意図しないファイルを操作する可能性があります。ShellCheckはこのような問題を警告し、変数をクオートすることを推奨します。

これらの例は、ShellCheckがシェルスクリプトの安全性と信頼性を向上させる方法を示しています。事故を防ぐために、ShellCheckの静的解析を利用して、スクリプトの問題を早期に特定し、修正することが重要です。

これらの例は、ShellCheckの静的解析がどのようにしてシェルスクリプトの潜在的な危険や問題を検出し、事故を防ぐのに役立つかを一部の例として示しています。
他にもどのようなパターンがあるかは ぜひ、Wiki を見てみてください。
全ては必要ない、サクッと知りたいという場合にはGallery of bad codeを見ていただければどのようなものがあるのかがわかります。

SREの導入実績豊富な弊社がサポートします

SREを導入する際、トイルをどう判別するかは重要なポイントです。今回紹介したトイルの定義に基いて判別し、解決へのステップを進めることでトイル削減に着手できます。
しかし、「トイルを判別できたが解決方法が分からない」「トイルが多すぎて優先順位がつけられない」「最適な自動化方法が分からない」といったケースもあるかと思います。

弊社はこれまで多くの企業様のSRE導入のお手伝いをしてきました。トイルの削減はもちろん、サービスの戦略策定から設計・構築・運用、ならびSREに必要なSaaSの導入支援までサービスの成長に必要な要素を統合的に提供可能です。

もし少しでもSREに興味があるという企業様がいらっしゃいましたら、気軽にお問い合わせください。

ブログ一覧へ戻る

お気軽にお問い合わせください

SREの設計・技術支援から、
SRE運用内で使用する
ツールの導入など、
SRE全般についてご支援しています。

資料請求・お問い合わせ