Skip to content

Commit

Permalink
CI/CD: Add production tooling script (#1916)
Browse files Browse the repository at this point in the history
  • Loading branch information
RishabhJain2018 authored and deshraj committed Nov 20, 2018
1 parent e451d1f commit 257ba05
Show file tree
Hide file tree
Showing 13 changed files with 149 additions and 52 deletions.
11 changes: 8 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,13 @@ media/
# .DS_Store for OSX
.DS_Store

# Encrypted files
# Docker Environment Files
docker/prod/docker_staging.env
# TODO: Add docker_production.env file
docker/prod/docker_prod.env
secrets.tar
scripts/docker_pull.sh

# SSL files
ssl/

# Code editors
.vscode
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ script:
- py.test --cov . --cov-config .coveragerc
after_success:
- coveralls --rcfile=.coveragerc
- ./scripts/deployment/push.sh
notifications:
email:
on_success: change
Expand Down
12 changes: 4 additions & 8 deletions docker-compose-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ services:

django:
image: ${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/evalai-production-backend:${COMMIT_ID}
container_name: django
env_file:
- docker/prod/docker_prod.env
- docker/prod/docker_production.env
build:
context: ./
dockerfile: docker/prod/django/Dockerfile
Expand All @@ -14,25 +13,22 @@ services:

worker:
image: ${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/evalai-production-worker:${COMMIT_ID}
container_name: worker
build:
context: ./
dockerfile: docker/prod/worker/Dockerfile
env_file:
- docker/prod/docker_prod.env
- docker/prod/docker_production.env

nodejs:
image: ${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/evalai-production-frontend:${COMMIT_ID}
container_name: nodejs
build:
context: ./
dockerfile: docker/prod/nodejs/Dockerfile
environment:
NODE_ENV: production
args:
NODE_ENV: production
ports:
- "80:80"
- "443:443"
volumes:
- /code/node_modules
- /code/bower_components
- /etc/nginx/ssl/:/etc/nginx/ssl/
9 changes: 3 additions & 6 deletions docker-compose-staging.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ services:

django:
image: ${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/evalai-staging-backend:${COMMIT_ID}
container_name: django
env_file:
- docker/prod/docker_staging.env
build:
Expand All @@ -14,7 +13,6 @@ services:

worker:
image: ${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/evalai-staging-worker:${COMMIT_ID}
container_name: worker
build:
context: ./
dockerfile: docker/prod/worker/Dockerfile
Expand All @@ -23,12 +21,11 @@ services:

nodejs:
image: ${AWS_ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/evalai-staging-frontend:${COMMIT_ID}
container_name: nodejs
build:
context: ./
dockerfile: docker/prod/nodejs/Dockerfile_staging
environment:
NODE_ENV: production
dockerfile: docker/prod/nodejs/Dockerfile
args:
NODE_ENV: staging
ports:
- "80:80"
volumes:
Expand Down
5 changes: 1 addition & 4 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version: "2"
version: "3"
services:

db:
Expand All @@ -13,7 +13,6 @@ services:
- 9324:9324

django:
container_name: django
hostname: django
env_file:
- docker/dev/docker.env
Expand All @@ -29,7 +28,6 @@ services:
- .:/code

worker:
container_name: worker
env_file:
- docker/dev/docker.env
build:
Expand All @@ -41,7 +39,6 @@ services:
- .:/code

nodejs:
container_name: nodejs
hostname: nodejs
build:
context: ./
Expand Down
File renamed without changes.
7 changes: 3 additions & 4 deletions docker/prod/nodejs/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
FROM node:8.11.2 as node

ARG NODE_ENV
WORKDIR /code

# Add dependencies
Expand All @@ -18,10 +19,8 @@ RUN npm install
RUN bower install --allow-root
ADD frontend /code/frontend

# TODO: Change `gulp dev` to `gulp prod`
RUN gulp prod
EXPOSE 8888
RUN gulp ${NODE_ENV}

FROM nginx:1.13-alpine
COPY docker/prod/nodejs/nginx.conf /etc/nginx/conf.d/default.conf
COPY docker/prod/nodejs/nginx_${NODE_ENV}.conf /etc/nginx/conf.d/default.conf
COPY --from=node /code /code
26 changes: 0 additions & 26 deletions docker/prod/nodejs/Dockerfile_staging

This file was deleted.

40 changes: 40 additions & 0 deletions docker/prod/nodejs/nginx_production.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
upstream django_app {
server django:8000 fail_timeout=0;
}

server {
server_name evalapi.cloudcv.org;
listen 80;
client_max_body_size 400M;
rewrite ^/(.*) https://evalapi.cloudcv.org/$1 permanent;

# Access Logs
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://django_app;
}
}

server {
listen 80;
sendfile on;
default_type application/octet-stream;
#
server_name evalai.cloudcv.org;
client_max_body_size 200M;
gzip on;
gzip_http_version 1.1;
gzip_disable "MSIE [1-6]\.";
gzip_min_length 256;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 9;
root /code/frontend;
location / {
try_files $uri $uri/ /index.html =404;
}
}
File renamed without changes.
2 changes: 1 addition & 1 deletion gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ function watch() {

var parallelTasks = gulp.parallel(vendorcss, vendorjs, css, js, html, images, fonts);

gulp.task('prod', gulp.series(clean, function(done) {
gulp.task('production', gulp.series(clean, function(done) {
production = true;
done();
}, parallelTasks, configProd, injectpaths, lint));
Expand Down
88 changes: 88 additions & 0 deletions scripts/deployment/deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#!/bin/bash
set -e

opt=${1}
env=${2}

aws_login() {
aws configure set default.region us-east-1
eval $(aws ecr get-login --no-include-email)
}

setup() {
export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo add-apt-repository ppa:deadsnakes/ppa
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
apt-cache policy docker-ce
sudo apt-get install -y docker-ce
sudo apt-get install python3.6
sudo apt-get install python3-pip
pip3 install awscli
pip3 install docker-compose
}

if ! python3 -c "import awscli" &> /dev/null; then
echo "Installing packages and dependencies..."
setup;
fi

if [ -z ${AWS_ACCOUNT_ID} ]; then
echo "AWS_ACCOUNT_ID not set."
exit 0
fi

if [ -z ${COMMIT_ID} ]; then
export COMMIT_ID="latest"
fi

case $opt in
pull)
aws_login;
echo "Pulling environment variables file..."
aws s3 cp s3://cloudcv-secrets/evalai/${env}/docker_${env}.env ./docker/prod/docker_${env}.env
echo "Environment varibles file successfully downloaded."
if [ ${env} == "production" ]; then
echo "Pulling ssl certificates and nginx configuration..."
aws s3 cp s3://cloudcv-secrets/evalai/${env}/ssl/ ./ssl/
aws s3 cp s3://cloudcv-secrets/evalai/${env}/nginx_${env}.conf ./docker/prod/nodejs/nginx_${env}.conf
fi
echo "Pulling docker images from ECR..."
docker-compose -f docker-compose-${env}.yml pull
echo "Completed Pull operation."
;;
deploy)
echo "Deploying docker container..."
docker-compose -f docker-compose-${env}.yml up -d
echo "Completed Pull operation."
;;
scale)
service=${3}
instances=${4}
echo "Scaling the containers..."
docker-compose -f docker-compose-${env}.yml scale ${service}=${instances}
;;
clean)
{
docker-compose -f docker-compose-${env}.yml rm -s -v -f
} || {
echo "Delete operation skipped since no container or image found!"
}
docker rmi $(docker images -a -q)
echo "Sucessfully cleaned all the images."
;;
*)
echo "EvalAI deployment utility script"
echo " Usage: $0 {pull|deploy|scale|clean}"
echo
echo " pull : Pull docker images from ECR."
echo " Eg. ./scripts/deployment/deploy.sh pull production"
echo " deploy : Deploy containers in the respective environment."
echo " Eg. ./scripts/deployment/deploy.sh deploy production"
echo " scale : Scale particular docker service in an environment."
echo " Eg. ./scripts/deployment/deploy.sh scale production django 5"
echo " clean : Remove all docker containers and images."
echo " Eg. ./scripts/deployment/deploy.sh clean production"
esac
File renamed without changes.

0 comments on commit 257ba05

Please sign in to comment.