🔦
GitHub ActionsでBashの静的解析
概要
下記の記事でInflluxDBにデータを格納するためのBashスクリプトを作りました。
今回は、BashスクリプトをGitHubにpushした時にShellCheckで静的解析を実施するようにします。
ファイル構成
% tree -aFI .git
./
├── .github/
│ └── workflows/
│ ├── healthcare-data-registration.yml
│ └── shellcheck.yml
├── get_last_time.flux
├── healthcare.csv
├── memo.md
└── update.sh
3 directories, 6 files
以下のファイルを追加・修正しています。
ファイル名 | 追加・修正内容 |
---|---|
shellcheck.yml | GitHubにupdate.shがpushされた時にShellCheckを実行するワークフローを追加。 |
update.sh | ShellCheckの指摘箇所を修正 |
各ファイルの説明
shellcheck.yml
GitHubホステッドランナーを使用し、ubuntu-24.04を指定している場合はShellCheckがインストール済みです。
shellcheckコマンドの引数にシェルスクリプトを指定するだけで静的解析を実行できます。
shellcheck.yml
shellcheck.yml
name: ShellCheck
run-name: ShellCheck
on:
push:
branches:
- develop
paths:
- "update.sh"
workflow_dispatch:
defaults:
run:
shell: bash
jobs:
ShellCheck:
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v4
- name: ShellCheck
run: shellcheck update.sh
update.sh
ShellCheckをupdate.shに対して実行した際にSC2155が検出されました。
SC2155については以下に説明があります。
修正前の記載では変数に値を代入するコマンドとローカル変数を宣言するためのlocalコマンドを1行に書いていました。
この書き方だと変数に値を代入するコマンドが失敗してもlocalコマンドでリターンコードが上書きされる問題がありました。
この問題を修正するためにlocalコマンドで変数を宣言する行と変数に代入する行に分割しました。
@@ -16,8 +16,10 @@ tail -n +2 healthcare.csv | while IFS=',' read -r _ UNIX_TIME STEP_COUNT WALK_AN
# 時間を分に変換する関数
convert_to_minutes() {
local TIME=$1
- local HOUR=$(echo "$TIME" | awk -F':' '{print $1}')
- local MIN=$(echo "$TIME" | awk -F':' '{print $2}')
+ local HOUR
+ HOUR=$(echo "$TIME" | awk -F':' '{print $1}')
+ local MIN
+ MIN=$(echo "$TIME" | awk -F':' '{print $2}')
echo $((HOUR * 60 + MIN))
}
Discussion