Add helm-lint, shellcheck, and tag-check actions
These are the remaining verification jobs on our main list, outside
of sanity tests.
Since none of these have any overlap in their implementation (that is,
no two jobs use the exact same combination of actions), no new shared
workflows are being added.
Signed-off-by: Eric Ball <eball@linuxfoundation.org>
Change-Id: I912f0d5a8c1baed84657bccfadbf9c7caecbcdc2
diff --git a/.github/actions/helm-lint-action/README.md b/.github/actions/helm-lint-action/README.md
new file mode 100644
index 0000000..3714283
--- /dev/null
+++ b/.github/actions/helm-lint-action/README.md
@@ -0,0 +1,77 @@
+<!--
+SPDX-License-Identifier: Apache-2.0
+SPDX-FileCopyrightText: 2026 The Linux Foundation
+-->
+
+# Helm Lint Action
+
+A GitHub Action that lints and tests Helm charts using the chart-testing tool.
+
+## Description
+
+This composite action validates Helm charts by linting their structure and installing them on a kind cluster. It only processes charts that have changed compared to the target branch.
+
+## Usage
+
+```yaml
+- name: Lint and Test Charts
+ uses: ./.github/actions/helm-lint-action
+ with:
+ target-branch: main
+```
+
+### Inputs
+
+| Input | Description | Required |
+|-------|-------------|----------|
+| `target-branch` | Target branch to compare against for detecting changed charts | Yes |
+
+### Example Workflow
+
+```yaml
+name: Helm Chart CI
+
+on:
+ pull_request:
+ push:
+ branches:
+ - main
+
+jobs:
+ lint-test:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Lint and test Helm charts
+ uses: ./.github/actions/helm-lint-action
+ with:
+ target-branch: main
+```
+
+## How It Works
+
+The action performs the following steps:
+
+1. Checks out the repository with full git history
+2. Sets up Helm and Python (required for chart-testing)
+3. Installs the chart-testing CLI tool
+4. Detects charts that changed compared to the target branch
+5. Lints the changed charts
+6. Creates a kind Kubernetes cluster
+7. Installs and tests the changed charts on the cluster
+
+## Requirements
+
+- Repository must contain valid Helm charts
+- Charts should follow Helm best practices for linting to pass
+
+## Configuration
+
+For advanced configuration, add a `ct.yaml` file to your repository root. See the [chart-testing documentation](https://github.com/helm/chart-testing) for available options.
+
+## Dependencies
+
+This action uses the following tools:
+
+- [helm/chart-testing-action](https://github.com/helm/chart-testing-action) - Chart testing CLI
+- [azure/setup-helm](https://github.com/azure/setup-helm) - Helm installation
+- [helm/kind-action](https://github.com/helm/kind-action) - Kind cluster creation
diff --git a/.github/actions/helm-lint-action/action.yaml b/.github/actions/helm-lint-action/action.yaml
new file mode 100644
index 0000000..cdf0cc3
--- /dev/null
+++ b/.github/actions/helm-lint-action/action.yaml
@@ -0,0 +1,53 @@
+---
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileCopyrightText: 2026 The Linux Foundation
+
+name: Lint and Test Charts
+description: "Lint and test Helm charts"
+
+inputs:
+ target-branch:
+ description: "Target branch to compare against for detecting changed charts"
+ required: true
+
+runs:
+ using: "composite"
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v5
+ with:
+ fetch-depth: 0
+
+ - name: Set up Helm
+ uses: azure/setup-helm@v4.3.1
+
+ - uses: actions/setup-python@v6.0.0
+ with:
+ python-version: "3.x"
+ check-latest: true
+
+ - name: Set up chart-testing
+ uses: helm/chart-testing-action@v2.8.0
+
+ - name: Run chart-testing (list-changed)
+ id: list-changed
+ shell: bash
+ run: |
+ changed=$(ct list-changed --target-branch ${{ inputs.target-branch }})
+ if [[ -n "$changed" ]]; then
+ echo "changed=true" >> "$GITHUB_OUTPUT"
+ fi
+
+ - name: Run chart-testing (lint)
+ if: steps.list-changed.outputs.changed == 'true'
+ shell: bash
+ run: ct lint --target-branch ${{ inputs.target-branch }}
+
+ - name: Create kind cluster
+ if: steps.list-changed.outputs.changed == 'true'
+ uses: helm/kind-action@v1.12.0
+
+ - name: Run chart-testing (install)
+ if: steps.list-changed.outputs.changed == 'true'
+ shell: bash
+ run: ct install --target-branch ${{ inputs.target-branch }}