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 .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 # run-tests: # stage: test # tags: # - docker-privileged # image: docker:${DOCKER_VERSION} # services: # - name: docker:${DOCKER_VERSION}-dind # alias: containerhost # script: # - docker run -p 27017:27017 -d --name mongo-container --rm mongo:${MONGO_VERSION} # - docker build # --tag "${CONTAINER_TAG}-test" # --target=test # --build-arg MONGODB_URL_TEST=mongodb://containerhost:27017/todo-app # --build-arg JWT_SECRET_TEST=my-very-secret-jwt # "./app" # after_script: # - docker stop mongo-container # - docker images -a | grep "mongo" | awk '{print $3}' | xargs docker rmi --force # - docker image rm --force "${CONTAINER_TAG}-test" build-image: stage: build # needs: # - 'run-tests' tags: - docker-privileged image: docker:${DOCKER_VERSION} services: - name: docker:${DOCKER_VERSION}-dind before_script: - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} script: - docker image build --tag "${CONTAINER_TAG}" --target=build "./app" # - docker image build # --tag "${CONTAINER_TAG}-google-sdk" # "./gcloud-image" - docker push "${CONTAINER_TAG}" # - docker push "${CONTAINER_TAG}-google-sdk" after_script: - docker image rm --force "${CONTAINER_TAG}" # - docker image rm --force "${CONTAINER_TAG}-google-sdk" create-release_image: stage: release tags: - docker-privileged image: docker:${DOCKER_VERSION} services: - name: docker:${DOCKER_VERSION}-dind before_script: - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} - docker pull "${CONTAINER_TAG}" script: - VERSION=$(cat ./app/client/package.json | docker run --interactive stedolan/jq --raw-output '.version') - docker tag "${CONTAINER_TAG}" "${CI_REGISTRY_IMAGE}:${VERSION}" - docker push "${CI_REGISTRY_IMAGE}:${VERSION}" after_script: - docker image rm --force $(docker images --format '{{.Repository}}{{.Tag}}' | grep '${CI_REGISTRY_IMAGE}') # create-release_tag: # stage: release # needs: # - 'create-release_image' # rules: # - if: $CI_COMMIT_REF_NAME =~ /main/ # when: 'always' # tags: # - docker-privileged # image: docker:${DOCKER_VERSION}-git # services: # - name: docker:${DOCKER_VERSION}-dind # script: # - VERSION=$(cat ./src/package.json | docker run --interactive stedolan/jq --raw-output '.version') # - echo ${VERSION} # #- git tag "v${VERSION}" && git push origin "v${VERSION}" deploy-image: extends: .gke-initialization stage: deploy needs: - 'create-release_image' rules: - if: $CI_COMMIT_REF_NAME =~ /staging/ when: 'always' variables: ENVIRONMENT_NAME: 'staging' - if: $CI_COMMIT_REF_NAME !~ /main/ when: 'always' variables: ENVIRONMENT_NAME: 'production' tags: - docker image: google/cloud-sdk:${GOOGLE_CLOUD_SDK_IMAGE_VERSION} script: - VERSION="${CI_PIPELINE_IID}-${CI_COMMIT_SHORT_SHA}" - IMAGE="${CI_REGISTRY_IMAGE}:${VERSION}" - cd "./k8s-manifests" - kubectl apply -f secrets.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" - kubectl apply -f gitlab-registry-credentials.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" - kubectl apply -f configmap.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" - kubectl apply -f deployment.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" - kubectl apply -f service.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}" - kubectl apply -f ingress.yaml --namespace "${ENVIRONMENT_NAME}-${K8S_NAMESPACE}"