📝

GitHub Actionsのワークフローの静的解析

2024/10/07に公開

概要

下記の記事でBashスクリプトの静的解析を実装しました。
https://zenn.dev/jnxjez/articles/b88268e408d3d4

今回はGitHub Actionsのワークフローを静的解析するためにyamllintとactionlintを導入します。
yamllintはYAMLファイルの静的解析、actionlintはGitHub Actionsワークフローの静的解析を実施します。

ファイル構成

% tree -aFI .git
./
├── .github/
│   └── workflows/
│       ├── actionlint.yml
│       ├── healthcare-data-registration.yml
│       ├── shellcheck.yml
│       └── yamllint.yml
├── config/
│   └── yamllint_config.yml
├── get_last_time.flux
├── healthcare.csv
├── memo.md
└── update.sh

4 directories, 9 files

以下のファイルを追加・修正しています。

ファイル名 追加・修正内容
actionlint.yml actionlint実行用のワークフローを追加。
healthcare-data-registration.yml yamllintとactionlintの指摘事項を修正。
shellcheck.yml yamllintの指摘事項を修正。
yamllint.yml yamllint実行用のワークフローを追加。
yamllint_config.yml yamllintの設定ファイルを追加。

各ファイルの説明

actionlint.yml

actionlint.yml
actionlint.yml
---
name: Actionlint

run-name: Actionlint

on:  # yamllint disable-line rule:truthy
  push:
    branches:
      - develop
    paths:
      - ".github/workflows/*.yml"
  workflow_dispatch:

defaults:
  run:
    shell: bash

jobs:
  Actionlint:
    runs-on: ubuntu-24.04
    timeout-minutes: 10
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install actionlint
        run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) latest /usr/local/bin

      - name: Running actionlint
        run: actionlint .github/workflows/*.yml

ワークフローのトリガーを指定するためのon:がyamllintで指摘されるので、ドキュメントに記載されている通りon:の行はtruthyルールを除外します。

on:  # yamllint disable-line rule:truthy
  push:
    branches:
      - develop

https://yamllint.readthedocs.io/en/stable/integration.html#integration-with-github-actions

actionlintはGitHub Actionsのホステッドランナーにインストールが必要です。
インストール用のスクリプトを実行し、/usr/local/binディレクトリにactionlintコマンドをインストールします。

      - name: Install actionlint
        run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) latest /usr/local/bin

healthcare-data-registration.yml

yamllintのdocument-startの対応で1行目に「---」を追加しました。
また、on:の行はyamllintのtruthyルールを除外しています。

@@ -1,8 +1,9 @@
+---
 name: Healthcare Data Registration
 
 run-name: Healthcare data registration
 
-on:
+on:  # yamllint disable-line rule:truthy
   push:
     branches:
       - main

actionlintはワークフロー内のShellCheckも実施してくれます。
ShellCheckでSC2086が指摘されたので、変数をダブルクォートで囲むように修正しました。

@@ -29,7 +30,7 @@ jobs:
         env:
           INFLUX_CLI_URL: https://download.influxdata.com/influxdb/releases/influxdb2-client-2.7.5-linux-amd64.tar.gz
         run: |
-          wget ${INFLUX_CLI_URL}
+          wget "${INFLUX_CLI_URL}"
           tar xvzf ./influxdb2-client-2.7.5-linux-amd64.tar.gz
           mv ./influx /usr/local/bin/

https://github.com/koalaman/shellcheck/wiki/SC2086

ここもShellCheckのSC2086の対応をしています。
また、ymllintでnew-line-at-end-of-fileが指摘されたので、ファイル末尾に改行文字を追加しています。

@@ -38,7 +39,7 @@ jobs:
           INFLUXDB_ORG: Test
           INFLUXDB_TOKEN: ${{ secrets.INFLUXDB_TOKEN }}
           INFLUXDB_URL: https://us-east-1-1.aws.cloud2.influxdata.com
-        run: influx config create -a -n healthcare_rw -u ${INFLUXDB_URL} -t "${INFLUXDB_TOKEN}" -o ${INFLUXDB_ORG}
+        run: influx config create -a -n healthcare_rw -u "${INFLUXDB_URL}" -t "${INFLUXDB_TOKEN}" -o "${INFLUXDB_ORG}"
 
       - name: Healthcare data registration
-        run: sh ./update.sh
\ No newline at end of file
+        run: sh ./update.sh

shellcheck.yml

yamllintの指摘対応で、ファイル1行目に「---」を追加、on:の行はtruthyルールを除外しています。

@@ -1,8 +1,9 @@
+---
 name: ShellCheck
 
 run-name: ShellCheck
 
-on:
+on:  # yamllint disable-line rule:truthy
   push:
     branches:
       - develop

yamllint.yml

yamllint.yml
yamllint.yml
---
name: Yamllint

run-name: Yamllint

on:  # yamllint disable-line rule:truthy
  push:
    branches:
      - develop
    paths:
      - ".github/workflows/*.yml"
      - "config/*.yml"
  workflow_dispatch:

defaults:
  run:
    shell: bash

jobs:
  Yamllint:
    runs-on: ubuntu-24.04
    timeout-minutes: 10
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Running yamllint
        run: yamllint -c config/yamllint_config.yml .github/workflows/*.yml config/*.yml

yamllintコマンドはGitHub Actionsのホステッドランナー(ubuntu-24.04)にインストールされています。
yamllintのデフォルト設定では1行の最大文字数が80文字に制限されているため、-cオプションに制限を緩和したyamllint_config.ymlを指定します。
静的解析の対象として以下の2種類を設定してyamllintコマンドを実行します。

  • ワークフロー(.github/workflows/*.yml)
  • yamllintコマンドの設定ファイル(config/*.yml)
      - name: Running yamllint
        run: yamllint -c config/yamllint_config.yml .github/workflows/*.yml config/*.yml

yamllint_config.yml

yamllint_config.yml
yamllint_config.yml
---

extends: default

rules:
  line-length:
    max: 140

yamllintの1行の文字数制限を拡張するため、line-lengthのmaxを設定します。

rules:
  line-length:
    max: 140

参考

https://yamllint.readthedocs.io/en/stable/
https://github.com/rhysd/actionlint

Discussion