diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9c07d0024..8af3b835c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ concurrency: jobs: test_ci: runs-on: ubuntu-latest - name: test_ci + name: maven build strategy: matrix: java-version: [ 11, 17, 21 ] @@ -72,191 +72,102 @@ jobs: mvn -B verify -Dit.skip=false cd .. e2e_smoke_test: - name: Operator smoke test - runs-on: ubuntu-latest + name: Smoke test strategy: matrix: http-client: [ "okhttp", "jdk", "jetty", "vertx" ] - version: ["v1_20"] - mode: ["native"] - namespace: ["default", "flink"] - java-version: ["11", "17", "21"] + java-version: [ "11", "17", "21" ] + uses: ./.github/workflows/e2e.yaml + with: + java-version: ${{ matrix.java-version }} + flink-version: "v1_20" + http-client: ${{ matrix.http-client }} + test: test_application_operations.sh + e2e_namespace_tests: + name: Alternative namespace tests + needs: e2e_smoke_test + strategy: + matrix: + flink-version: + - "v1_20" + - "v1_18" + - "v1_19" + - "v1_17" + - "v1_16" + mode: + - "native" + - "standalone" test: - test_application_operations.sh - steps: - - uses: actions/checkout@v4 - - name: Set up JDK ${{ matrix.java-version }} - uses: actions/setup-java@v4 - with: - java-version: ${{ matrix.java-version }} - distribution: 'temurin' - cache: 'maven' - - name: Start minikube - run: | - source e2e-tests/utils.sh - start_minikube - - name: Install cert-manager - run: | - kubectl get pods -A - kubectl apply -f e2e-tests/cert-manager.yaml - kubectl -n cert-manager wait --all=true --for=condition=Available --timeout=300s deploy - - name: Build image - run: | - export SHELL=/bin/bash - export DOCKER_BUILDKIT=1 - eval $(minikube -p minikube docker-env) - JAVA_VERSION=${{matrix.java-version}} - HTTP_CLIENT=${{ matrix.http-client }} - docker build --progress=plain --no-cache -f ./Dockerfile -t flink-kubernetes-operator:ci-latest --progress plain --build-arg JAVA_VERSION="${JAVA_VERSION:-11}" --build-arg HTTP_CLIENT="${HTTP_CLIENT:-okhttp}" . - docker images - - name: Start the operator - run: | - source e2e-tests/utils.sh - create_namespace flink - helm --debug install flink-kubernetes-operator -n ${{ matrix.namespace }} helm/flink-kubernetes-operator --set image.repository=flink-kubernetes-operator --set image.tag=ci-latest --create-namespace --set "watchNamespaces={default,flink}" - kubectl wait --for=condition=Available --timeout=120s -n ${{ matrix.namespace }} deploy/flink-kubernetes-operator - kubectl get pods -n ${{ matrix.namespace }} - - name: Run Flink e2e tests - run: | - sed -i "s/image: flink:.*/image: ${{ matrix.image }}/" e2e-tests/data/*.yaml - sed -i "s/flinkVersion: .*/flinkVersion: ${{ matrix.version }}/" e2e-tests/data/*.yaml - sed -i "s/mode: .*/mode: ${{ matrix.mode }}/" e2e-tests/data/*.yaml - git diff HEAD - echo "Running e2e-tests/$test" - bash e2e-tests/${{ matrix.test }} || exit 1 - git reset --hard - - name: Stop the operator - run: | - helm uninstall -n ${{ matrix.namespace }} flink-kubernetes-operator - - name: Stop minikube - run: | - source e2e-tests/utils.sh - stop_minikube + - test_multi_sessionjob.sh + - test_autoscaler.sh + - test_dynamic_config.sh + exclude: + - mode: standalone + test: test_autoscaler.sh + - mode: standalone + test: test_dynamic_config.sh + - flink-version: v1_16 + test: test_autoscaler.sh + - flink-version: v1_16 + test: test_dynamic_config.sh + + uses: ./.github/workflows/e2e.yaml + with: + java-version: 11 + flink-version: ${{ matrix.flink-version }} + test: ${{ matrix.test }} + namespace: "flink" + create-namespace: true + mode: ${{ matrix.mode }} e2e_ci: needs: e2e_smoke_test - runs-on: ubuntu-latest strategy: matrix: - version: ["v1_20","v1_19","v1_18","v1_17","v1_16"] - namespace: ["default","flink"] - mode: ["native", "standalone"] - java-version: [ 11 ] + flink-version: + - "v1_20" + - "v1_18" + - "v1_19" + - "v1_17" + - "v1_16" + mode: + - "native" + - "standalone" test: - test_application_kubernetes_ha.sh + - test_application_operations.sh - test_dynamic_config.sh - test_sessionjob_kubernetes_ha.sh - test_sessionjob_operations.sh - - test_multi_sessionjob.sh - test_autoscaler.sh - test_flink_operator_ha.sh - test_snapshot.sh - include: - - namespace: flink - extraArgs: '--create-namespace --set "watchNamespaces={default,flink}"' - - version: v1_20 - image: flink:1.20 - - version: v1_19 - image: flink:1.19 - - version: v1_18 - image: flink:1.18 - - version: v1_17 - image: flink:1.17 - - version: v1_16 - image: flink:1.16 exclude: - - namespace: default - test: test_multi_sessionjob.sh - - namespace: default - test: test_autoscaler.sh - - namespace: default - test: test_dynamic_config.sh - - mode: standalone + - flink-version: v1_16 test: test_autoscaler.sh - - mode: standalone + - flink-version: v1_16 test: test_dynamic_config.sh - - mode: standalone - test: test_snapshot.sh - - version: v1_16 - test: test_autoscaler.sh - - version: v1_16 - test: test_dynamic_config.sh - - version: v1_16 + - flink-version: v1_16 test: test_flink_operator_ha.sh - - version: v1_16 + - flink-version: v1_16 test: test_snapshot.sh - - version: v1_17 + - flink-version: v1_17 test: test_dynamic_config.sh - - version: v1_17 + - flink-version: v1_17 test: test_flink_operator_ha.sh - - version: v1_17 + - flink-version: v1_17 test: test_snapshot.sh - - version: v1_18 + - flink-version: v1_18 test: test_dynamic_config.sh - - version: v1_18 + - flink-version: v1_18 test: test_flink_operator_ha.sh - - version: v1_18 + - flink-version: v1_18 test: test_snapshot.sh - - version: v1_19 + - flink-version: v1_19 test: test_snapshot.sh - - version: v1_16 - java-version: 17 - - version: v1_17 - java-version: 17 - - version: v1_16 - java-version: 21 - - version: v1_17 - java-version: 21 - - version: v1_18 - java-version: 21 - name: e2e_ci - steps: - - uses: actions/checkout@v4 - - name: Set up JDK ${{ matrix.java-version }} - uses: actions/setup-java@v4 - with: - java-version: ${{ matrix.java-version }} - distribution: 'temurin' - cache: 'maven' - - name: Start minikube - run: | - source e2e-tests/utils.sh - start_minikube - - name: Install cert-manager - run: | - kubectl get pods -A - kubectl apply -f e2e-tests/cert-manager.yaml - kubectl -n cert-manager wait --all=true --for=condition=Available --timeout=300s deploy - - name: Build image - run: | - export SHELL=/bin/bash - export DOCKER_BUILDKIT=1 - eval $(minikube -p minikube docker-env) - JAVA_VERSION=${{ matrix.java-version }} - docker build --progress=plain --no-cache -f ./Dockerfile -t flink-kubernetes-operator:ci-latest --progress plain --build-arg JAVA_VERSION="${JAVA_VERSION:-11}" . - docker images - - name: Start the operator - run: | - if [[ "${{ matrix.test }}" == "test_flink_operator_ha.sh" ]]; then - sed -i "s/# kubernetes.operator.leader-election.enabled: false/kubernetes.operator.leader-election.enabled: true/" helm/flink-kubernetes-operator/conf/flink-conf.yaml - sed -i "s/# kubernetes.operator.leader-election.lease-name: flink-operator-lease/kubernetes.operator.leader-election.lease-name: flink-operator-lease/" helm/flink-kubernetes-operator/conf/flink-conf.yaml - sed -i "s/replicas: 1/replicas: 2/" helm/flink-kubernetes-operator/values.yaml - fi - helm --debug install flink-kubernetes-operator -n ${{ matrix.namespace }} helm/flink-kubernetes-operator --set image.repository=flink-kubernetes-operator --set image.tag=ci-latest ${{ matrix.extraArgs }} - kubectl wait --for=condition=Available --timeout=120s -n ${{ matrix.namespace }} deploy/flink-kubernetes-operator - kubectl get pods -n ${{ matrix.namespace }} - - name: Run Flink e2e tests - run: | - sed -i "s/image: flink:.*/image: ${{ matrix.image }}/" e2e-tests/data/*.yaml - sed -i "s/flinkVersion: .*/flinkVersion: ${{ matrix.version }}/" e2e-tests/data/*.yaml - sed -i "s/mode: .*/mode: ${{ matrix.mode }}/" e2e-tests/data/*.yaml - git diff HEAD - echo "Running e2e-tests/$test" - bash e2e-tests/${{ matrix.test }} || exit 1 - git reset --hard - - name: Stop the operator - run: | - helm uninstall -n ${{ matrix.namespace }} flink-kubernetes-operator - - name: Stop minikube - run: | - source e2e-tests/utils.sh - stop_minikube + uses: ./.github/workflows/e2e.yaml + with: + java-version: 11 + flink-version: ${{ matrix.flink-version }} + test: ${{ matrix.test }} + mode: ${{ matrix.mode }} diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml new file mode 100644 index 000000000..ba0d7d44d --- /dev/null +++ b/.github/workflows/e2e.yaml @@ -0,0 +1,91 @@ +name: E2E test workflow + +on: + workflow_call: + inputs: + java-version: + required: true + type: string + flink-version: + required: true + type: string + http-client: + required: false + type: string + default: "okhttp" + namespace: + required: false + type: string + default: "default" + mode: + required: false + type: string + default: "native" + test: + required: true + type: string + create-namespace: + type: boolean + default: false + +jobs: + e2e_test: + name: ${{ inputs.test }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up JDK ${{ inputs.java-version }} + uses: actions/setup-java@v4 + with: + java-version: ${{ inputs.java-version }} + distribution: 'temurin' + cache: 'maven' + - name: Start minikube + run: | + source e2e-tests/utils.sh + start_minikube + - name: Install cert-manager + run: | + kubectl get pods -A + kubectl apply -f e2e-tests/cert-manager.yaml + kubectl -n cert-manager wait --all=true --for=condition=Available --timeout=300s deploy + - name: Build image + run: | + export SHELL=/bin/bash + export DOCKER_BUILDKIT=1 + eval $(minikube -p minikube docker-env) + JAVA_VERSION=${{ inputs.java-version }} + HTTP_CLIENT=${{ inputs.http-client }} + docker build --progress=plain --no-cache -f ./Dockerfile -t flink-kubernetes-operator:ci-latest --progress plain --build-arg JAVA_VERSION="${JAVA_VERSION:-11}" --build-arg HTTP_CLIENT="${HTTP_CLIENT:-okhttp}" . + docker images + - name: Create ${{ inputs.namespace }} == ${{ inputs.create-namespace }} + id: namespace-creator + if: ${{ inputs.create-namespace }} + run: | + source e2e-tests/utils.sh + create_namespace ${{ inputs.namespace }} + echo EXTRA_HELM_INSTALL_ARGS="--set "watchNamespaces={default,flink}"" >> $GITHUB_OUTPUT + - name: Start the operator + run: | + helm --debug install flink-kubernetes-operator -n ${{ inputs.namespace }} helm/flink-kubernetes-operator --set image.repository=flink-kubernetes-operator --set image.tag=ci-latest ${{ steps.namespace-creator.outputs.EXTRA_HELM_INSTALL_ARGS }} + kubectl wait --for=condition=Available --timeout=120s -n ${{ inputs.namespace }} deploy/flink-kubernetes-operator + kubectl get pods -n ${{ inputs.namespace }} + - name: Run Flink e2e tests + run: | + FLINK_IMAGE=$(sed --regexp-extended 's/v([0-9]+)_([0-9]+)/flink:\1.\2/g' <<< ${{ inputs.flink-version }} ) + echo FLINK_IMAGE=${FLINK_IMAGE} + sed -i "s/image: flink:.*/image: ${FLINK_IMAGE}/" e2e-tests/data/*.yaml + sed -i "s/flinkVersion: .*/flinkVersion: ${{ inputs.flink-version }}/" e2e-tests/data/*.yaml + sed -i "s/mode: .*/mode: ${{ inputs.mode }}/" e2e-tests/data/*.yaml + git diff HEAD + echo "Running e2e-tests/$test" + bash e2e-tests/${{ inputs.test }} || exit 1 + git reset --hard + - name: Stop the operator + run: | + helm uninstall -n ${{ inputs.namespace }} flink-kubernetes-operator + - name: Stop minikube + run: | + source e2e-tests/utils.sh + stop_minikube +