diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-build-and-push.yml similarity index 100% rename from .github/workflows/docker-image.yml rename to .github/workflows/docker-build-and-push.yml diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml deleted file mode 100644 index 4c7b0655..00000000 --- a/.github/workflows/docker-build.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Build Docker image - -on: - pull_request: - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Docker meta - id: meta - uses: docker/metadata-action@v5 - with: - images: pokeapi/pokeapi - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v3 - - name: Inspect builder - run: | - echo "Name: ${{ steps.buildx.outputs.name }}" - echo "Endpoint: ${{ steps.buildx.outputs.endpoint }}" - echo "Status: ${{ steps.buildx.outputs.status }}" - echo "Flags: ${{ steps.buildx.outputs.flags }}" - echo "Platforms: ${{ steps.buildx.outputs.platforms }}" - - name: Build - id: docker_build - uses: docker/build-push-action@v5 - with: - context: . - file: ./Resources/docker/app/Dockerfile - push: false - platforms: local,linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - - name: Image digest - run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/.github/workflows/docker-k8s.yml b/.github/workflows/docker-k8s.yml new file mode 100644 index 00000000..b90c1210 --- /dev/null +++ b/.github/workflows/docker-k8s.yml @@ -0,0 +1,101 @@ +name: Build Docker image and create k8s with it + +on: + pull_request: + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: pokeapi/pokeapi + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + - name: Build + id: docker_build + uses: docker/build-push-action@v5 + with: + context: . + file: ./Resources/docker/app/Dockerfile + push: false + platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 + tags: pokeapi/pokeapi:local + labels: ${{ steps.meta.outputs.labels }} + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} + k8s: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: pokeapi/pokeapi + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + - name: Build + id: docker_build + uses: docker/build-push-action@v5 + with: + context: . + file: ./Resources/docker/app/Dockerfile + push: false + load: true + platforms: local + tags: pokeapi/pokeapi:local + labels: ${{ steps.meta.outputs.labels }} + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} + - name: Lint k8s + run: (cd Resources/k8s/kustomize && yamllint .) + - name: Create k8s Kind Cluster + uses: helm/kind-action@v1.10.0 + with: + cluster_name: pokeapi + version: v0.21.0 + - name: Create deployment configuration + run: | + cp Resources/k8s/kustomize/base/secrets/postgres.env.sample Resources/k8s/kustomize/base/secrets/postgres.env + cp Resources/k8s/kustomize/base/secrets/graphql.env.sample Resources/k8s/kustomize/base/secrets/graphql.env + cp Resources/k8s/kustomize/base/config/pokeapi.env.sample Resources/k8s/kustomize/base/config/pokeapi.env + - name: Load local image to Kind + run: kind load docker-image pokeapi/pokeapi:local --name pokeapi + - name: K8s Apply + run: | + make kustomize-local-apply + kubectl proxy & + sleep 1 + bash Resources/scripts/wait.sh http://localhost:8001/api/v1/namespaces/pokeapi/services/pokeapi/proxy/api/v2/ + - name: Set default namespace and print info + run: | + kubectl config set-context --current --namespace pokeapi + kubectl describe deployment + - name: Migrate and build data + run: | + make k8s-migrate + make k8s-build-db + bash Resources/scripts/wait.sh http://localhost:8001/api/v1/namespaces/pokeapi/services/pokeapi/proxy/api/v2/pal-park-area/5/ + - name: K8s wait for job + run: | + kubectl wait --timeout=600s --for=condition=complete job/load-graphql + last_command=$(kubectl get job -o jsonpath='{.status.succeeded}' load-graphql) + test "$last_command" -eq 1 + - name: Get GQL output + run: kubectl logs jobs/load-graphql diff --git a/.github/workflows/kustomize.yml b/.github/workflows/kustomize.yml deleted file mode 100644 index f26a3cb2..00000000 --- a/.github/workflows/kustomize.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Deploy Kustomize k8s cluster - -on: - workflow_run: - workflows: ["Build and Push Docker image"] - branches: [master, staging] - types: - - completed - schedule: - - cron: '0 0 1 * *' - -jobs: - create-kustomize-cluster: - runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'success' }} - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - submodules: recursive - - name: Lint - run: (cd Resources/k8s/kustomize && yamllint .) - - name: Create k8s Kind Cluster - uses: helm/kind-action@v1.1.0 - with: - version: v0.11.1 - - name: Create deployment configuration - run: | - cp Resources/k8s/kustomize/base/secrets/postgres.env.sample Resources/k8s/kustomize/base/secrets/postgres.env - cp Resources/k8s/kustomize/base/secrets/graphql.env.sample Resources/k8s/kustomize/base/secrets/graphql.env - cp Resources/k8s/kustomize/base/config/pokeapi.env.sample Resources/k8s/kustomize/base/config/pokeapi.env - - name: K8s Apply - run: | - if [ ${GITHUB_REF#refs/heads/} = 'master' ]; then make kustomize-apply; else make kustomize-staging-apply; fi - kubectl proxy & - kubectl describe deployment - bash Resources/scripts/wait.sh http://localhost:8001/api/v1/namespaces/pokeapi/services/pokeapi/proxy/api/v2/ - - name: Set default namespace - run: | - kubectl config set-context --current --namespace pokeapi - - name: Migrate and build data - run: | - make k8s-migrate - make k8s-build-db - bash Resources/scripts/wait.sh http://localhost:8001/api/v1/namespaces/pokeapi/services/pokeapi/proxy/api/v2/pal-park-area/5/ - - name: K8s Apply - run: | - kubectl wait --timeout=120s --for=condition=complete job/load-graphql - last_command=$(kubectl get job -o jsonpath='{.status.succeeded}' load-graphql) - test "$last_command" -eq 1 diff --git a/Makefile b/Makefile index 2d081bd8..1ba8c169 100755 --- a/Makefile +++ b/Makefile @@ -116,9 +116,12 @@ hasura-get-anon-schema: # Dumps GraphQL schema kustomize-apply: # (Kustomize) Run kubectl apply -k on the connected k8s cluster kubectl apply -k Resources/k8s/kustomize/base/ -kustomize-staging-apply: # (Kustomize) Run kubectl apply -k on the connected k8s cluster +kustomize-staging-apply: # (Kustomize) Run kubectl apply -k on the connected k8s cluster using pokeapi/pokeapi:staging kubectl apply -k Resources/k8s/kustomize/staging/ +kustomize-local-apply: # (Kustomize) Run kubectl apply -k on the connected k8s cluster using the locally available pokeapi/pokeapi:local + kubectl apply -k Resources/k8s/kustomize/local/ + k8s-migrate: # (k8s) Run any pending migrations kubectl exec --namespace pokeapi deployment/pokeapi -- python manage.py migrate ${docker_config} diff --git a/Resources/k8s/kustomize/base/config/pokeapi.env.sample b/Resources/k8s/kustomize/base/config/pokeapi.env.sample index e964f3cf..76fb7424 100644 --- a/Resources/k8s/kustomize/base/config/pokeapi.env.sample +++ b/Resources/k8s/kustomize/base/config/pokeapi.env.sample @@ -1,2 +1,3 @@ ADMINS=PokeAPI,change.me@pokeapi.co BASE_URL=http://localhost/ +POKEAPI_CHECKOUT_REF=master \ No newline at end of file diff --git a/Resources/k8s/kustomize/base/deployments/graphql-deployment.yaml b/Resources/k8s/kustomize/base/deployments/graphql-deployment.yaml index 20a80d40..8e2f4347 100644 --- a/Resources/k8s/kustomize/base/deployments/graphql-deployment.yaml +++ b/Resources/k8s/kustomize/base/deployments/graphql-deployment.yaml @@ -25,7 +25,7 @@ spec: done; containers: - name: graphql-engine - image: hasura/graphql-engine:v2.16.1 + image: hasura/graphql-engine:v2.36.4 ports: - containerPort: 8080 env: diff --git a/Resources/k8s/kustomize/base/deployments/pokeapi-deployment.yaml b/Resources/k8s/kustomize/base/deployments/pokeapi-deployment.yaml index 6d7e3634..863b7479 100644 --- a/Resources/k8s/kustomize/base/deployments/pokeapi-deployment.yaml +++ b/Resources/k8s/kustomize/base/deployments/pokeapi-deployment.yaml @@ -26,7 +26,7 @@ spec: containers: - name: pokeapi image: pokeapi/pokeapi:master - imagePullPolicy: Always + imagePullPolicy: IfNotPresent ports: - containerPort: 8080 securityContext: # CI: Github Actions kills this container if not run with root. Otherwise, it's safe to use the default pokeapi/pokeapi user and remove these lines. diff --git a/Resources/k8s/kustomize/base/jobs/load-graphql.yaml b/Resources/k8s/kustomize/base/jobs/load-graphql.yaml index c644ad5f..cc43bb4d 100644 --- a/Resources/k8s/kustomize/base/jobs/load-graphql.yaml +++ b/Resources/k8s/kustomize/base/jobs/load-graphql.yaml @@ -25,13 +25,17 @@ spec: secretKeyRef: name: graphql-env-secret key: HASURA_GRAPHQL_ADMIN_SECRET + - name: POKEAPI_CHECKOUT_REF + valueFrom: + configMapKeyRef: + name: pokeapi-configmap + key: POKEAPI_CHECKOUT_REF command: ["sh", "-c"] args: - - apt-get update && - apt-get install -y git curl && - curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash && - hasura update-cli --version v2.0.8 && + - apt-get update && apt-get install -y curl git && + curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | VERSION=v2.36.4 bash && + cd /tmp && git clone https://github.com/PokeAPI/pokeapi.git && cd pokeapi && - git checkout staging && + (git checkout $(POKEAPI_CHECKOUT_REF) || git checkout master) && hasura md apply --endpoint http://graphql:8080 --project graphql --admin-secret $(HASURA_GRAPHQL_ADMIN_SECRET) diff --git a/Resources/k8s/kustomize/base/kustomization.yaml b/Resources/k8s/kustomize/base/kustomization.yaml index 93828994..7fdf034c 100644 --- a/Resources/k8s/kustomize/base/kustomization.yaml +++ b/Resources/k8s/kustomize/base/kustomization.yaml @@ -5,7 +5,7 @@ namespace: pokeapi configMapGenerator: - name: pokeapi-configmap - files: + envs: - config/pokeapi.env secretGenerator: diff --git a/Resources/k8s/kustomize/local/kustomization.yaml b/Resources/k8s/kustomize/local/kustomization.yaml new file mode 100644 index 00000000..371b3533 --- /dev/null +++ b/Resources/k8s/kustomize/local/kustomization.yaml @@ -0,0 +1,9 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +bases: + - ../base + +images: + - name: pokeapi/pokeapi + newTag: local diff --git a/docker-compose.yml b/docker-compose.yml index 7b53f7c7..10587881 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -44,7 +44,7 @@ services: - ./Resources/nginx/ssl:/ssl:ro - graphql_cache:/tmp/cache graphql-engine: - image: hasura/graphql-engine:v2.36.1-ce + image: hasura/graphql-engine:v2.36.4 ports: - "8080:8080" depends_on: