# CI/CD Pipeline # dev branch -> staging # master branch -> internal (Custom Downloads) # master branch -> live # Define stages for the CI/CD pipeline stages: - test - test_build_static - build_docker_images - deploy variables: CONTAINER_IMAGE: ${CI_REGISTRY_IMAGE}:nginx-${CI_COMMIT_SHORT_SHA} CONTAINER_NODE_IMAGE: ${CI_REGISTRY_IMAGE}:node-${CI_COMMIT_SHORT_SHA} KUBE_CONTEXT: ens-dev-ctx DEPLOYENV: dev ENVIRONMENT: production DOCKER_TLS_CERTDIR: "" # Template to build static assets .build-static: stage: test_build_static image: node:14.17.0 before_script: - cd src/ensembl - npm install --global npm@7.12.1 - npm ci script: - npm run test - npm run build artifacts: name: build_artifacts paths: - src/ensembl/dist/ - src/ensembl/package.json - src/ensembl/package-lock.json # Template to build nginx docker image for WP k8s cluster # WP k8s cluster uses ingress .build-nginx: image: docker services: - docker:dind stage: build_docker_images before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - apk update && apk add git - git clone --depth 1 https://github.com/Ensembl/ensembl-2020-static-assests.git - git clone https://gitlab.ebi.ac.uk/kamal/ensembl-client-nginx.git - git -C ensembl-client-nginx checkout migration/ssr - docker build -t ${CONTAINER_IMAGE} -f ensembl-client-nginx/Dockerfile --no-cache . - docker push ${CONTAINER_IMAGE} - docker rmi ${CONTAINER_IMAGE} - docker logout $CI_REGISTRY # Template to build node docker image for WP k8s cluster # WP k8s cluster uses ingress .build-node: image: docker services: - docker:dind stage: build_docker_images before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker build -t ${CONTAINER_NODE_IMAGE} -f src/ensembl/Dockerfile.node --no-cache . - docker push ${CONTAINER_NODE_IMAGE} - docker rmi ${CONTAINER_NODE_IMAGE} - docker logout $CI_REGISTRY # Template to deploy to WP k8s cluster .deploy: stage: deploy image: dockerhub.ebi.ac.uk/ensembl-web/deploy-tools:0.1 script: - git clone https://gitlab.ebi.ac.uk/ensembl-web/ensembl-k8s-manifests.git - git -C ensembl-k8s-manifests/ checkout wp-k8s - sed -i "s##${CONTAINER_IMAGE}#g" ensembl-k8s-manifests/ensembl_client_nginx_deployment.yaml - sed -i "s##${CONTAINER_NODE_IMAGE}#g" ensembl-k8s-manifests/ensembl_client_node_deployment.yaml - kubectl apply -f ensembl-k8s-manifests/ensembl_client_nginx_deployment.yaml - kubectl apply -f ensembl-k8s-manifests/ensembl_client_node_deployment.yaml # Template to deploy review-app to WP k8s cluster .deploy-review: stage: deploy image: dockerhub.ebi.ac.uk/ensembl-web/deploy-tools:0.1 script: - git clone https://gitlab.ebi.ac.uk/ensembl-web/ensembl-k8s-manifests.git - git -C ensembl-k8s-manifests/ checkout wp-k8s-review - sed -i "s##${CI_COMMIT_REF_SLUG}#g" ensembl-k8s-manifests/ensembl_client_nginx_deployment.yaml - sed -i "s##${CONTAINER_IMAGE}#g" ensembl-k8s-manifests/ensembl_client_nginx_deployment.yaml - sed -i "s##${CI_COMMIT_REF_SLUG}#g" ensembl-k8s-manifests/ensembl_client_node_deployment.yaml - sed -i "s##${CONTAINER_NODE_IMAGE}#g" ensembl-k8s-manifests/ensembl_client_node_deployment.yaml - kubectl apply -f ensembl-k8s-manifests/ensembl_client_nginx_deployment.yaml - kubectl apply -f ensembl-k8s-manifests/ensembl_client_node_deployment.yaml # Template for stopping review app - Do cleanup here .stop-review: stage: deploy image: dockerhub.ebi.ac.uk/ensembl-web/deploy-tools:0.1 variables: GIT_STRATEGY: none when: manual script: - kubectl delete ingress ensembl-client-${CI_COMMIT_REF_SLUG}-ingress - kubectl delete svc ensembl-client-${CI_COMMIT_REF_SLUG}-svc - kubectl delete deploy ensembl-client-${CI_COMMIT_REF_SLUG}-deployment Test: image: node:14.16.0 stage: test before_script: - cd src/ensembl - npm ci script: - npm run check-types - npm run test only: - /^nodeploy\/.*$/ except: - dev - master # Job to build static asset for staging and live environment # dev branch -> Staging # master branch -> Live Test_N_Build: extends: .build-static variables: GOOGLE_ANALYTICS_KEY: ${GA_KEY} ENVIRONMENT: production API_HOST: "" only: - dev - master # Job to build static asset for internal environment # master branch -> Internal Test_N_Build:internal: extends: .build-static variables: GOOGLE_ANALYTICS_KEY: ${GA_KEY} ENVIRONMENT: internal API_HOST: "" only: - master Test_N_Build:review: extends: .build-static variables: ENVIRONMENT: development API_HOST: "" except: - dev - master - /^nodeploy\/.*$/ # Job to build nginx docker image for staging environment # dev branch -> Staging Nginx:Staging: extends: .build-nginx only: - dev needs: - Test_N_Build # Job to build node docker image for staging environment # dev branch -> Staging Node:Staging: extends: .build-node only: - dev needs: - Test_N_Build # Job to build nginx docker image for live environment # master branch -> Live Nginx:Live: extends: .build-nginx variables: CONTAINER_IMAGE: ${CI_REGISTRY_IMAGE}:nginx-${CI_COMMIT_SHORT_SHA}-prod only: - master needs: - Test_N_Build # Job to build node docker image for live environment # master branch -> Live Node:Live: extends: .build-node variables: CONTAINER_NODE_IMAGE: ${CI_REGISTRY_IMAGE}:node-${CI_COMMIT_SHORT_SHA}-prod only: - master needs: - Test_N_Build # Job to build nginx docker image for internal environment at WP # master branch -> internal Nginx:Internal: extends: .build-nginx variables: DEPLOYENV: internal CONTAINER_IMAGE: ${CI_REGISTRY_IMAGE}:nginx-${CI_COMMIT_SHORT_SHA}-internal only: - master needs: - Test_N_Build:internal # Job to build node docker image for internal environment at WP # master branch -> internal Node:Internal: extends: .build-node variables: DEPLOYENV: internal CONTAINER_NODE_IMAGE: ${CI_REGISTRY_IMAGE}:node-${CI_COMMIT_SHORT_SHA}-internal only: - master needs: - Test_N_Build:internal # Job to build nginx docker image for review environment at WP # all other branch -> dev Nginx:review: extends: .build-nginx variables: DEPLOYENV: dev CONTAINER_IMAGE: ${CI_REGISTRY_IMAGE}:nginx-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_REF_SLUG} except: - dev - master - /^nodeploy\/.*$/ needs: - Test_N_Build:review # Job to build node docker image for review environment at WP # all other branch -> dev Node:review: extends: .build-node variables: DEPLOYENV: dev CONTAINER_NODE_IMAGE: ${CI_REGISTRY_IMAGE}:node-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_REF_SLUG} except: - dev - master - /^nodeploy\/.*$/ needs: - Test_N_Build:review # Job to deploy to staging environment (WP-HX k8s cluster) Staging:HX: extends: .deploy environment: name : wp-hx-staging only: - dev needs: - Test_N_Build - Nginx:Staging - Node:Staging # Job to deploy to staging environment (WP-HL k8s cluster) Staging:HL: extends: .deploy environment: name : wp-hh-staging only: - dev needs: - Test_N_Build - Nginx:Staging - Node:Staging # Job to deploy to live environment (WP-HX k8s cluster) Live:HX: extends: .deploy variables: CONTAINER_IMAGE: ${CI_REGISTRY_IMAGE}:nginx-${CI_COMMIT_SHORT_SHA}-prod CONTAINER_NODE_IMAGE: ${CI_REGISTRY_IMAGE}:node-${CI_COMMIT_SHORT_SHA}-prod environment: name : wp-hx-live only: - master needs: - Test_N_Build - Nginx:Live - Node:Live # Job to deploy to live environment (WP-HL k8s cluster) Live:HL: extends: .deploy variables: CONTAINER_IMAGE: ${CI_REGISTRY_IMAGE}:nginx-${CI_COMMIT_SHORT_SHA}-prod CONTAINER_NODE_IMAGE: ${CI_REGISTRY_IMAGE}:node-${CI_COMMIT_SHORT_SHA}-prod environment: name : wp-hh-live only: - master needs: - Test_N_Build - Nginx:Live - Node:Live # Job to deploy to internal environment (WP-HX k8s cluster) Internal:HX: extends: .deploy variables: CONTAINER_IMAGE: ${CI_REGISTRY_IMAGE}:nginx-${CI_COMMIT_SHORT_SHA}-internal CONTAINER_NODE_IMAGE: ${CI_REGISTRY_IMAGE}:node-${CI_COMMIT_SHORT_SHA}-internal environment: name : wp-hx-internal only: - master needs: - Test_N_Build:internal - Nginx:Internal - Node:Internal # Job to deploy to internal environment (WP-HL k8s cluster) Internal:HL: extends: .deploy variables: CONTAINER_IMAGE: ${CI_REGISTRY_IMAGE}:nginx-${CI_COMMIT_SHORT_SHA}-internal CONTAINER_NODE_IMAGE: ${CI_REGISTRY_IMAGE}:node-${CI_COMMIT_SHORT_SHA}-internal environment: name : wp-hh-internal only: - master needs: - Test_N_Build:internal - Nginx:Internal - Node:Internal Review:HX: extends: .deploy-review environment: name: review/$CI_COMMIT_REF_SLUG url: http://$CI_COMMIT_REF_SLUG.review.ensembl.org on_stop: stop_review kubernetes: namespace: ensembl-dev except: - dev - master - /^nodeploy\/.*$/ needs: - Test_N_Build:review - Nginx:review - Node:review stop_review: extends: .stop-review environment: name: review/$CI_COMMIT_REF_SLUG action: stop kubernetes: namespace: ensembl-dev except: - dev - master - /^nodeploy\/.*$/