GitHub Actionsのワークフローの静的解析
概要
下記の記事でBashスクリプトの静的解析を実装しました。
今回は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
---
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
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/
ここも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
---
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
---
extends: default
rules:
line-length:
max: 140
yamllintの1行の文字数制限を拡張するため、line-lengthのmaxを設定します。
rules:
line-length:
max: 140
参考
Discussion