| --- |
| # SPDX-License-Identifier: Apache-2.0 |
| # SPDX-FileCopyrightText: 2026 The Linux Foundation |
| |
| name: ShellCheck Lint |
| description: "Lint shell scripts with ShellCheck" |
| |
| inputs: |
| path: |
| description: "Path to search for shell scripts" |
| required: false |
| default: "." |
| severity: |
| description: "Minimum severity level (error, warning, info, style)" |
| required: false |
| default: "style" |
| exclude: |
| description: "Comma-separated list of ShellCheck codes to exclude (e.g., SC1090,SC2034)" |
| required: false |
| default: "" |
| |
| runs: |
| using: "composite" |
| steps: |
| - name: Install ShellCheck |
| shell: bash |
| run: | |
| if ! command -v shellcheck &> /dev/null; then |
| echo "Installing ShellCheck..." |
| sudo apt-get update |
| sudo apt-get install -y shellcheck |
| fi |
| echo "ShellCheck version:" |
| shellcheck --version |
| |
| - name: Run ShellCheck |
| shell: bash |
| run: | |
| set +e |
| fail_shellcheck=0 |
| files_checked=0 |
| |
| echo "=> Linting shell scripts with ShellCheck" |
| echo " Path: ${{ inputs.path }}" |
| echo " Severity: ${{ inputs.severity }}" |
| |
| # Build exclude argument if provided |
| exclude_arg="" |
| if [[ -n "${{ inputs.exclude }}" ]]; then |
| exclude_arg="--exclude=${{ inputs.exclude }}" |
| echo " Excluding: ${{ inputs.exclude }}" |
| fi |
| |
| # Find and check all shell scripts |
| while IFS= read -r -d '' script; do |
| echo "" |
| echo "==> CHECKING: ${script}" |
| files_checked=$((files_checked + 1)) |
| |
| if [[ -n "${exclude_arg}" ]]; then |
| shellcheck --severity="${{ inputs.severity }}" "${exclude_arg}" "${script}" |
| else |
| shellcheck --severity="${{ inputs.severity }}" "${script}" |
| fi |
| |
| rc=$? |
| if [[ $rc -ne 0 ]]; then |
| echo "==> FAILED: ${script}" |
| fail_shellcheck=1 |
| else |
| echo "==> PASSED: ${script}" |
| fi |
| done < <(find "${{ inputs.path }}" \( -name "*.sh" -o -name "*.bash" \) -type f -print0) |
| |
| echo "" |
| echo "=> Summary: ${files_checked} file(s) checked" |
| |
| if [[ ${files_checked} -eq 0 ]]; then |
| echo "=> No shell scripts found" |
| elif [[ ${fail_shellcheck} -eq 0 ]]; then |
| echo "=> All checks passed" |
| else |
| echo "=> Some checks failed" |
| exit 1 |
| fi |