Skip to content
Snippets Groups Projects
.gitlab-ci.yml 6.00 KiB
workflow:
  rules:
    - if: '$CI_COMMIT_BRANCH == "staging" || $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
      when: always
    - when: never

variables:
  DOCKER_VERSION: '20.10.17'
  MONGO_VERSION: '4.4'
  K8S_NAMESPACE: 'todoapp-devops'
  GOOGLE_CLOUD_SDK_IMAGE_VERSION: '400.0.0'
  GCP_PROJECT_ID: ss22-devops-app
  GCP_COMPUTE_REGION: 'europe-west4'
  CONTAINER_TAG: '${CI_REGISTRY_IMAGE}:${CI_PIPELINE_IID}-${CI_COMMIT_SHORT_SHA}'

stages:
  - test
  - build
  - release
  - deploy
  - upgrade-connection

.gke-initialization:
  before_script:
    - echo $BASE64_GOOGLE_CREDENTIALS | base64 -d > ~/service_account.json
    - gcloud auth activate-service-account --key-file ~/service_account.json
    - gcloud config set project ${GCP_PROJECT_ID}
    - gcloud config set compute/zone ${GCP_COMPUTE_REGION}
    - gcloud container clusters get-credentials ${GCP_PROJECT_ID}-gke

.gke-deployment:
  extends: .gke-initialization
  tags:
  - docker
  image: google/cloud-sdk:${GOOGLE_CLOUD_SDK_IMAGE_VERSION}
  script:
    - IMAGE="${CI_REGISTRY_IMAGE}:${VERSION}"
    - cd "./k8s-manifests"
    - kubectl apply -f gitlab-registry-credentials.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}"
    - SECRETS_MANIFEST=$(sed -e "s,{{jwtSecret}},${JWT_SECRET},g" ./secrets.yaml.tmpl)
    - echo "${SECRETS_MANIFEST}" | kubectl apply --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" --filename -
    - kubectl apply -f configmap.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}"
    - DEPLOYMENT_MANIFEST=$(sed -e "s,{{image}},${IMAGE},g" ./deployment.yaml.tmpl)
    - echo "${DEPLOYMENT_MANIFEST}" | kubectl apply --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" --filename -
    - kubectl apply -f service.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}"
    - INGRESS_MANIFEST=$(sed -e "s,{{static-ip-name}},${STATIC_IP},g" -e "s,{{allowHttpFlag}},false,g" -e "s,{{portNumber}},80,g" ./ingress.yaml.tmpl)
    - echo "${INGRESS_MANIFEST}" | kubectl apply --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" --filename -

run-tests:
  stage: test
  tags:
    - docker-privileged
  image: docker:${DOCKER_VERSION}
  services:
    - name: docker:${DOCKER_VERSION}-dind
      alias: localhost
  variables:
    MONGODB_URL_TEST: mongodb://localhost:27017/todo-app
  script:
    - docker run -p 27017:27017
      --detach
      --name mongo-container
      --rm
      --network=host
      mongo:${MONGO_VERSION}
    - docker build
      --tag "${CONTAINER_TAG}-test"
      --network=host
      --build-arg MONGODB_URL_TEST=$MONGODB_URL_TEST
      --build-arg JWT_SECRET_TEST=$JWT_SECRET