#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

name: Precommit - Pulsar Helm Chart (JWT Secret Key Installation)
on:
  pull_request:
    branches:
      - '*'
    paths:
      - 'deployment/kubernetes/helm/**'
jobs:
  lint-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Check if this pull request only changes documentation
        id:   docs
        uses: apache/pulsar-test-infra/diff-only@master
        with:
          args: site2 .asf.yaml ct.yaml

      - name: Run chart-testing (install)
        run: |
          .ci/chart_test.sh .ci/clusters/values-jwt-asymmetric.yaml
        env:
          SYMMETRIC: "false"
        # Only build a kind cluster if there are chart changes to test.
        if: steps.docs.outputs.changed_only == 'no'
