🔦

GitHub ActionsでBashの静的解析

2024/10/04に公開

概要

下記の記事でInflluxDBにデータを格納するためのBashスクリプトを作りました。
https://zenn.dev/jnxjez/articles/51c977c718e004

今回は、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については以下に説明があります。
https://github.com/koalaman/shellcheck/wiki/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