name: Common Library Tests concurrency: group: ${{ github.workflow }}-${{ github.ref }} on: workflow_call: push: branches: - master paths: - "charts/library/common/**" - "charts/library/common-test/**" - ".github/workflows/common-tests.yaml" #pull_request: # branches: # - main # paths: # - "charts/charts/library/common/**" # - ".github/workflows/common-tests.yaml" workflow_dispatch: jobs: check_changes: runs-on: group: default outputs: changes_detected: ${{ steps.filter.outputs.changed }} steps: - name: Checkout code uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - name: Filter paths id: filter uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 with: list-files: json filters: | changed: - 'charts/library/common/**' lint: name: Lint Common runs-on: ubuntu-24.04 needs: check_changes if: needs.check_changes.outputs.changes_detected == 'true' strategy: fail-fast: false matrix: helm-version: - v3.14.0 - v3.18.6 steps: - name: Checkout uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 with: fetch-depth: 1 - name: Install Helm uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4 with: version: ${{ matrix.helm-version }} - uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6 with: python-version: "3.10" - name: Set up chart-testing uses: helm/chart-testing-action@6ec842c01de15ebb84c8627d2744a0c2f2755c9f # v2.8.0 - name: Run chart-testing (lint) id: lint run: | ct lint --config .github/ct-lint.yaml \ --lint-conf .github/lint-conf.yaml \ --charts charts/library/common-test \ --debug unittest: needs: - lint name: Unit Tests runs-on: ubuntu-24.04 env: helmUnitVersion: 0.8.1 strategy: fail-fast: false matrix: helm-version: - v3.14.0 - v3.18.6 steps: - name: Checkout uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 with: fetch-depth: 1 - name: Install Helm uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4 with: version: ${{ matrix.helm-version }} - name: Cache helm plugins uses: actions/cache@8b402f58fbc84540c8b491a91e594a4576fec3d7 # v5 with: path: | /home/runner/.local/share/helm/plugins/helm-unittest /tmp/_dist/ key: helm-${{ matrix.helm-version }}-unittest-v${{ env.helmUnitVersion }} restore-keys: | helm-${{ matrix.helm-version }}-unittest-v${{ env.helmUnitVersion }} - name: Run Unittests shell: bash run: | (helm unittest -h > /dev/null) || helm plugin install https://github.com/helm-unittest/helm-unittest --version v${helmUnitVersion} || (sleep 10 && helm plugin install https://github.com/helm-unittest/helm-unittest --version v${helmUnitVersion}) || echo "finished unittest reinstall tries" # Run tests cd charts/library/common-test/ helm dependency update helm unittest -f "tests/**/*.yaml" . -v ./unit-values.yaml install: needs: - lint name: Install Charts runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: # We test the latest k3s version and the lowest supported by either the oldest supported SCALE or FluxCD release k3s-version: - v1.27 - v1.32 - latest # We test the latest k3s version and the lowest supported by either the oldest supported SCALE or FluxCD release helm-version: - v3.14.0 - v3.18.6 values: - basic-values.yaml - configmap-values.yaml - secrets-values.yaml - imagePullSecret-values.yaml - daemonset-values.yaml - job-values.yaml - cron-values.yaml - statefulset-values.yaml - persistence-values.yaml - extra-containers-values.yaml - rbac-values.yaml - ingress-values.yaml - networkPolicy-values.yaml # TODO: broken # - codeserver-values.yaml - netshoot-values.yaml - metrics-values.yaml - cnpg-values.yaml - cnpg-multi-values.yaml - register-operator-values.yaml ## TODO: reenable when we've some credentials ready to rock for testing # - volsync-dest-values.yaml # - volsync-src-values.yaml # - volsync-dest-direct-values.yaml # - volsync-src-direct-values.yaml steps: - name: Checkout uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 with: fetch-depth: 1 - name: Install Helm uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4 with: version: ${{ matrix.helm-version }} - uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6 with: python-version: "3.10" - name: Set up chart-testing uses: helm/chart-testing-action@6ec842c01de15ebb84c8627d2744a0c2f2755c9f # v2.8.0 - name: Create k3d cluster - Attempt 1/3 continue-on-error: true id: createc1 uses: nolar/setup-k3d-k3s@293b8e5822a20bc0d5bcdd4826f1a665e72aba96 # tag=v1.0.9 with: github-token: ${{ secrets.GITHUB_TOKEN }} version: ${{ matrix.k3s-version }} # Flags found here https://github.com/k3d-io/k3d k3d-args: --k3s-arg --disable=metrics-server@server:* - name: Wait 10 second to retry if: steps.createc1.outcome=='failure' run: | sleep 10 - name: Create k3d cluster - Attempt 2/3 continue-on-error: true if: steps.createc1.outcome=='failure' id: createc2 uses: nolar/setup-k3d-k3s@293b8e5822a20bc0d5bcdd4826f1a665e72aba96 # tag=v1.0.9 with: github-token: ${{ secrets.GITHUB_TOKEN }} version: ${{ matrix.k3s-version }} # Flags found here https://github.com/k3d-io/k3d k3d-args: --k3s-arg --disable=metrics-server@server:* - name: Wait 10 second to retry if: steps.createc2.outcome=='failure' run: | sleep 10 - name: Create k3d cluster - Attempt 3/3 id: createc3 if: steps.createc2.outcome=='failure' uses: nolar/setup-k3d-k3s@293b8e5822a20bc0d5bcdd4826f1a665e72aba96 # tag=v1.0.9 with: github-token: ${{ secrets.GITHUB_TOKEN }} version: ${{ matrix.k3s-version }} # Flags found here https://github.com/k3d-io/k3d k3d-args: --k3s-arg --disable=metrics-server@server:* # Install Kail to grab logs from tests, as there are cases ct-install fail to output logs - name: Install Kail run: | export KAIL_VERSION=v0.16.1 wget https://github.com/boz/kail/releases/download/${KAIL_VERSION}/kail_${KAIL_VERSION}_linux_amd64.tar.gz tar -xvzf kail_${KAIL_VERSION}_linux_amd64.tar.gz chmod +x kail - name: Add Dependencies run: | if [[ "${{ matrix.values }}" =~ (ingress|metrics|cnpg|volsync).*-values.yaml ]]; then helm install kube-prometheus-stack oci://ghcr.io/prometheus-community/charts/kube-prometheus-stack --namespace kube-prometheus-stack --create-namespace --set alertmanager.enabled=false --set grafana.enabled=false --set kubeProxy.enabled=false --wait fi if [[ "${{ matrix.values }}" =~ cnpg.*-values.yaml ]]; then helm install cloudnative-pg oci://ghcr.io/cloudnative-pg/charts/cloudnative-pg --namespace cloudnative-pg --create-namespace --wait fi if [[ "${{ matrix.values }}" =~ ingress.*-values.yaml ]]; then helm install cert-manager oci://quay.io/jetstack/charts/cert-manager --namespace cert-manager --create-namespace --set crds.enabled=true --wait helm install ingress-nginx oci://ghcr.io/home-operations/charts-mirror/ingress-nginx --namespace ingress-nginx --create-namespace \ --set controller.ingressClassResource.default=true --set controller.publishService.enabled=false --set controller.service.type="ClusterIP" --set controller.config.allow-snippet-annotations=true --set controller.config.annotations-risk-level="Critical" --wait fi if [[ "${{ matrix.values }}" =~ volsync.*-values.yaml ]]; then helm install snapshot-controller oci://oci.trueforge.org/truecharts/snapshot-controller --namespace snapshot-controller --create-namespace --wait helm install volsync oci://oci.trueforge.org/truecharts/volsync --namespace volsync --create-namespace --wait fi - name: Run chart-testing (install) run: | # Move all ci values on a temp location (or skip if already moved from another matrix job) mv charts/library/common-test/ci charts/library/common-test/runtests || echo "Nothing to move" # Move one values.yaml to the correct location to run the test mv -f charts/library/common-test/runtests/${{ matrix.values }} charts/library/common-test/values.yaml # Stat kail on the background to grab logs from tests ./kail --ignore-ns kube-system --ignore-ns cert-manager --ignore-ns metallb-system --ignore-ns prometheus-operator >> /tmp/output.log & # Actually run the test ct install --config .github/ct-install.yaml \ --charts charts/library/common-test \ --debug || (echo -e "\n\n--===PODLOGS===--\n\n" && \ cat /tmp/output.log && \ rm -f /tmp/output.log && exit 1) kill $! echo -e "\n\n--===PODLOGS===--\n\n" cat /tmp/output.log rm -f /tmp/output.log # Summarize matrix https://github.community/t/status-check-for-a-matrix-jobs/127354/7 common-tests-complete: needs: [lint, unittest, install] if: ${{ always() }} name: Common Tets Completed runs-on: group: default steps: - name: Check Results run: | if [[ "${{ needs.check_changes.outputs.changes_detected }}" == 'true' && ( "${{ needs.lint.result }}" != "success" || \ "${{ needs.unittest.result }}" != "success" || \ "${{ needs.install.result }}" != "success") ]]; then echo "One or more jobs failed!" exit 1 else echo "Common Lint, Tests and unittests Completed Successfully" fi