name: CI on: pull_request: branches: - "*" paths-ignore: - 'docs/**' - 'deploy/**' - '**.md' - 'images/**' # Images changes should be tested on their own workflow - '!images/nginx/**' push: branches: - main - release-* paths-ignore: - 'docs/**' - 'deploy/**' - '**.md' - 'images/**' # Images changes should be tested on their own workflow workflow_dispatch: inputs: run_e2e: description: 'Force e2e to run' required: false type: boolean permissions: contents: read jobs: changes: permissions: contents: read # for dorny/paths-filter to fetch a list of changed files pull-requests: read # for dorny/paths-filter to read pull requests runs-on: ubuntu-latest outputs: go: ${{ steps.filter.outputs.go }} charts: ${{ steps.filter.outputs.charts }} baseimage: ${{ steps.filter.outputs.baseimage }} steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: filter with: token: ${{ secrets.GITHUB_TOKEN }} filters: | go: - '**/*.go' - 'go.mod' - 'go.sum' - 'rootfs/**/*' - 'TAG' - 'test/e2e/**/*' - 'NGINX_BASE' charts: - 'charts/ingress-nginx/Chart.yaml' - 'charts/ingress-nginx/**/*' - 'NGINX_BASE' baseimage: - 'NGINX_BASE' - 'images/nginx/**' docs: - '**/*.md' lua: - '**/*.lua' lua-lint: runs-on: ubuntu-latest needs: changes if: | (needs.changes.outputs.lua == 'true') || ${{ github.event.workflow_dispatch.run_e2e == 'true' }} steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Lint Lua uses: lunarmodules/luacheck@v1 with: args: --codes --globals lua_ingress --globals configuration --globals balancer --globals monitor --globals certificate --globals tcp_udp_configuration --globals tcp_udp_balancer --no-max-comment-line-length -q rootfs/etc/nginx/lua/ test-go: runs-on: ubuntu-latest needs: changes if: | (needs.changes.outputs.go == 'true') || ${{ github.event.workflow_dispatch.run_e2e == 'true' }} steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Get go version run: echo "GOLANG_VERSION=$(cat GOLANG_VERSION)" >> $GITHUB_ENV - name: Set up Go id: go uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version: ${{ env.GOLANG_VERSION }} check-latest: true - name: Run test run: make test verify-docs: name: Verify Doc generation runs-on: ubuntu-latest needs: changes if: | (needs.changes.outputs.go == 'true') || (needs.changes.outputs.docs == 'true') || ${{ github.event.workflow_dispatch.run_e2e == 'true' }} steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Get go version run: echo "GOLANG_VERSION=$(cat GOLANG_VERSION)" >> $GITHUB_ENV - name: Set up Go id: go uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version: ${{ env.GOLANG_VERSION }} check-latest: true - name: Verify Docs run: make verify-docs build: name: Build runs-on: ubuntu-latest needs: changes outputs: golangversion: ${{ steps.golangversion.outputs.version }} if: | (needs.changes.outputs.go == 'true') || (needs.changes.outputs.charts == 'true') || (needs.changes.outputs.baseimage == 'true') || ${{ github.event.workflow_dispatch.run_e2e == 'true' }} env: PLATFORMS: linux/amd64 steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Get go version id: golangversion run: | echo "version=$(cat GOLANG_VERSION)" >> "$GITHUB_OUTPUT" - name: Set up Go id: go uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 with: go-version: ${{ steps.golangversion.outputs.version }} check-latest: true - name: Set up QEMU uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 with: version: latest - name: Available platforms run: echo ${{ steps.buildx.outputs.platforms }} - name: Prepare Host run: | curl -LO https://dl.k8s.io/release/v1.27.3/bin/linux/amd64/kubectl chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl - name: Build NGINX Base image if: | needs.changes.outputs.baseimage == 'true' run: | export TAG=$(cat images/nginx/TAG) cd images/nginx/rootfs && docker buildx build --platform=${{ env.PLATFORMS }} --load -t registry.k8s.io/ingress-nginx/nginx:${TAG} . - name: Build images env: TAG: 1.0.0-dev ARCH: amd64 REGISTRY: ingress-controller run: | echo "building images..." export TAGNGINX=$(cat images/nginx/TAG) make BASE_IMAGE=registry.k8s.io/ingress-nginx/nginx:${TAGNGINX} clean-image build image image-chroot make -C test/e2e-image image echo "creating images cache..." docker save \ nginx-ingress-controller:e2e \ ingress-controller/controller:1.0.0-dev \ ingress-controller/controller-chroot:1.0.0-dev \ | gzip > docker.tar.gz - name: cache uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: docker.tar.gz path: docker.tar.gz retention-days: 5 chart-lint: name: Chart / Lint runs-on: ubuntu-latest needs: - changes if: fromJSON(needs.changes.outputs.charts) || fromJSON(needs.changes.outputs.baseimage) || fromJSON(github.event.workflow_dispatch.run_e2e) steps: - name: Set up Python uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: python-version: 3.x - name: Set up Helm uses: azure/setup-helm@fe7b79cd5ee1e45176fcad797de68ecaf3ca4814 # v4.2.0 - name: Set up Helm Chart Testing uses: helm/chart-testing-action@e6669bcd63d7cb57cb4380c33043eebe5d111992 # v2.6.1 - name: Set up Artifact Hub run: | curl --fail --location https://github.com/artifacthub/hub/releases/download/v1.19.0/ah_1.19.0_linux_amd64.tar.gz --output /tmp/ah.tar.gz echo "0e430493521ce387ca04d79b26646a86f92886dbcceb44985bb71082a9530ca5 /tmp/ah.tar.gz" | shasum --check sudo tar --extract --file /tmp/ah.tar.gz --directory /usr/local/bin ah - name: Set up Helm Docs uses: gabe565/setup-helm-docs-action@d5c35bdc9133cfbea3b671acadf50a29029e87c2 # v1.0.4 - name: Set up Helm Unit Test run: helm plugin install https://github.com/helm-unittest/helm-unittest - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 - name: Lint chart run: | ct lint --config .ct.yaml ah lint --path charts/ingress-nginx - name: Check docs run: | helm-docs --chart-search-root charts git diff --exit-code charts/ingress-nginx/README.md - name: Run tests run: helm unittest charts/ingress-nginx --file "tests/**/*_test.yaml" chart-test: name: Chart / Test runs-on: ubuntu-latest needs: - changes - build - chart-lint if: fromJSON(needs.changes.outputs.charts) || fromJSON(needs.changes.outputs.baseimage) || fromJSON(github.event.workflow_dispatch.run_e2e) strategy: matrix: k8s: [v1.28.15, v1.29.12, v1.30.8, v1.31.4, v1.32.0] steps: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Download cache uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: name: docker.tar.gz - name: Load cache run: gzip --decompress --stdout docker.tar.gz | docker load - name: Run tests env: K8S_VERSION: ${{ matrix.k8s }} SKIP_IMAGE_CREATION: true run: | sudo mkdir -pm 777 "${HOME}/.kube" make kind-e2e-chart-tests kubernetes: name: Kubernetes needs: - changes - build if: | (needs.changes.outputs.go == 'true') || (needs.changes.outputs.baseimage == 'true') || ${{ github.event.workflow_dispatch.run_e2e == 'true' }} strategy: matrix: k8s: [v1.28.15, v1.29.12, v1.30.8, v1.31.4, v1.32.0] uses: ./.github/workflows/zz-tmpl-k8s-e2e.yaml with: k8s-version: ${{ matrix.k8s }} kubernetes-chroot: name: Kubernetes chroot needs: - changes - build if: | (needs.changes.outputs.go == 'true') || (needs.changes.outputs.baseimage == 'true') || ${{ github.event.workflow_dispatch.run_e2e == 'true' }} strategy: matrix: k8s: [v1.28.15, v1.29.12, v1.30.8, v1.31.4, v1.32.0] uses: ./.github/workflows/zz-tmpl-k8s-e2e.yaml with: k8s-version: ${{ matrix.k8s }} variation: "CHROOT"