yurake/k8s-3tier-webapp

View on GitHub
.github/workflows/minikube-stress-ci.yml

Summary

Maintainability
Test Coverage
name: Minikube Stress CI

on:
  push:
    branches:
      - master
    paths:
      - "application/**"
      - "kubernetes/**"
      - ".github/workflows/minikube-stress-ci.yml"
  pull_request:
    paths:
      - ".github/workflows/minikube-stress-ci.yml"

jobs:
  stress-ci:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        app: [redis, activemq, rabbitmq, hazelcast, kafka]
      fail-fast: false
    steps:
      - name: checkout
        uses: actions/checkout@v4.1.7
      - name: start minikube
        uses: medyagh/setup-minikube@v0.0.18
        with:
          minikube-version: 1.31.0
          kubernetes-version: 1.31.1
          driver: docker
          container-runtime: docker
          cpus: 2
          memory: 6144
          addons: ingress
      - name: minikube settings
        run: |
          minikube addons list
          # https://minikube.sigs.k8s.io/docs/drivers/docker/#troubleshooting
          sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
          sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
          kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
      - name: wait for set up ingress
        run: |
          kubectl wait --all-namespaces=true --for=condition=ready pod --selector=app.kubernetes.io/component=controller --timeout=10m
      - name: apply activemq resource
        if: matrix.app == 'activemq'
        run: |
          kubectl apply -f kubernetes/activemq/activemq-pv.yaml
          kubectl apply -f kubernetes/activemq/activemq-pvc.yaml
          kubectl apply -f kubernetes/activemq/activemq-deployment.yaml
          kubectl apply -f kubernetes/activemq/activemq-service.yaml
          kubectl apply -f kubernetes/activemq/activemq-ingress.yaml
      - name: apply hazelcast resource
        if: matrix.app == 'hazelcast'
        run: |
          kubectl apply -f kubernetes/hazelcast/hazelcast-configmap.yaml
          kubectl apply -f kubernetes/hazelcast/hazelcast-statefulset.yaml
          kubectl apply -f kubernetes/hazelcast/hazelcast-service.yaml
      - name: apply rabbitmq resource
        if: matrix.app == 'rabbitmq'
        run: |
          kubectl apply -f kubernetes/rabbitmq/rabbitmq-configmap.yaml
          kubectl apply -f kubernetes/rabbitmq/rabbitmq-secret.yaml
          kubectl apply -f kubernetes/rabbitmq/rabbitmq-deployment.yaml
          kubectl apply -f kubernetes/rabbitmq/rabbitmq-service.yaml
          kubectl apply -f kubernetes/rabbitmq/rabbitmq-ingress.yaml
      - name: apply redis resource
        if: matrix.app == 'redis'
        run: |
          kubectl apply -f kubernetes/redis/redis-deployment.yaml
          kubectl apply -f kubernetes/redis/redis-service.yaml
      - name: apply kafka resource
        if: matrix.app == 'kafka'
        run: |
          kubectl apply -f kubernetes/zookeeper/zookeeper-statefulset.yaml
          kubectl apply -f kubernetes/zookeeper/zookeeper-service.yaml
          kubectl apply -f kubernetes/kafka/kafka-statefulset.yaml
          kubectl apply -f kubernetes/kafka/kafka-service.yaml
          kubectl apply -f kubernetes/producer-kafka-quarkus/producer-kafka-quarkus-deployment.yaml
      - name: apply minimal service
        run: |
          kubectl apply -f kubernetes/monitoring/monitoring-namespace.yaml
          kubectl apply -f kubernetes/jaeger/jaeger-all-in-one-template.yml
          kubectl apply -f kubernetes/jaxrs-${{ matrix.app }}-quarkus/jaxrs-${{ matrix.app }}-quarkus-deployment.yaml
          kubectl apply -f kubernetes/jaxrs-${{ matrix.app }}-quarkus/jaxrs-${{ matrix.app }}-quarkus-service.yaml
          kubectl apply -f kubernetes/jaxrs-${{ matrix.app }}-quarkus/jaxrs-${{ matrix.app }}-quarkus-service-externalname.yaml
          sleep 10
      - name: run e2e test
        run: |
          kubectl wait --all-namespaces=true --for=condition=ready pod --selector=app=jaxrs-${{ matrix.app }}-quarkus --timeout=10m
          kubectl apply -f kubernetes/monitoring/test/ab/ab-${{ matrix.app }}-job.yaml
      - name: wait for complete e2e job
        run: |
          kubectl -n monitoring wait --for=condition=complete --timeout=15m job/ab-${{ matrix.app }}
          kubectl -n monitoring describe job ab-${{ matrix.app }}
          kubectl -n monitoring logs $(kubectl get pods -n monitoring | awk '{print $1}' | grep ab-${{ matrix.app }})
      - name: check log jaxrs-${{ matrix.app }}
        if: always()
        run: |
          kubectl describe po $(kubectl get pods | awk '{print $1}' | grep jaxrs-${{ matrix.app }})
          kubectl logs $(kubectl get pods | awk '{print $1}' | grep jaxrs-${{ matrix.app }})
      - name: check after test ab-${{ matrix.app }}
        if: always()
        run: |
          kubectl -n monitoring describe po $(kubectl get pods -n monitoring | awk '{print $1}' | grep ab-${{ matrix.app }})
          kubectl -n monitoring logs $(kubectl get pods -n monitoring | awk '{print $1}' | grep ab-${{ matrix.app }})
      - name: check status
        if: always()
        run: |
          kubectl get po --all-namespaces=true
          kubectl get nodes
          kubectl get pv
          kubectl get pvc
          kubectl get all
          kubectl get all -n monitoring
          kubectl get ingress
          df -h /