name: (gha) Validate Helm Charts

on:
  pull_request:
    branches:
      - master
    paths:
      - "charts/**"
      - ".github/workflows/gha-validate-chart.yaml"
      - "!charts/actions-runner-controller/**"
      - "!**.md"
  push:
    paths:
      - "charts/**"
      - ".github/workflows/gha-validate-chart.yaml"
      - "!charts/actions-runner-controller/**"
      - "!**.md"
  workflow_dispatch:
env:
  KUBE_SCORE_VERSION: 1.16.1
  HELM_VERSION: v3.17.0

permissions:
  contents: read

concurrency:
  # This will make sure we only apply the concurrency limits on pull requests
  # but not pushes to master branch by making the concurrency group name unique
  # for pushes
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  validate-chart:
    name: Lint Chart
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 0

      - name: Set up Helm
        uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4
        with:
          version: ${{ env.HELM_VERSION }}

      # python is a requirement for the chart-testing action below (supports yamllint among other tests)
      - uses: actions/setup-python@v6
        with:
          python-version: "3.11"

      - name: Set up chart-testing
        uses: helm/chart-testing-action@0d28d3144d3a25ea2cc349d6e59901c4ff469b3b

      - name: Run chart-testing (list-changed)
        id: list-changed
        run: |
          ct version
          changed=$(ct list-changed --config charts/.ci/ct-config-gha.yaml)
          if [[ -n "$changed" ]]; then
            echo "changed=true" >> $GITHUB_OUTPUT
          fi

      - name: Run chart-testing (lint)
        run: |
          ct lint --config charts/.ci/ct-config-gha.yaml

      - name: Set up docker buildx
        uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435
        if: steps.list-changed.outputs.changed == 'true'
        with:
          version: latest

      - name: Build controller image
        uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83
        if: steps.list-changed.outputs.changed == 'true'
        with:
          file: Dockerfile
          platforms: linux/amd64
          load: true
          build-args: |
            DOCKER_IMAGE_NAME=test-arc
            VERSION=dev
          tags: |
            test-arc:dev
          cache-from: type=gha
          cache-to: type=gha,mode=max

      - name: Create kind cluster
        uses: helm/kind-action@a1b0e391336a6ee6713a0583f8c6240d70863de3
        if: steps.list-changed.outputs.changed == 'true'
        with:
          cluster_name: chart-testing

      - name: Load image into cluster
        if: steps.list-changed.outputs.changed == 'true'
        run: |
          export DOCKER_IMAGE_NAME=test-arc
          export VERSION=dev
          export IMG_RESULT=load
          make docker-buildx
          kind load docker-image test-arc:dev --name chart-testing

      - name: Run chart-testing (install)
        if: steps.list-changed.outputs.changed == 'true'
        run: |
          ct install --config charts/.ci/ct-config-gha.yaml
  test-chart:
    name: Test Chart
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v5
      - uses: actions/setup-go@v6
        with:
          go-version-file: "go.mod"
          cache: false
      - name: Test gha-runner-scale-set
        run: go test ./charts/gha-runner-scale-set/...
      - name: Test gha-runner-scale-set-controller
        run: go test ./charts/gha-runner-scale-set-controller/...
