Created by Viktor Farcic for Technology Conversations / @vfarcic
vagrant plugin install vagrant-cachier
git clone https://github.com/vfarcic/books-service.git
cd books-service
vagrant up dev
vagrant ssh dev
scala -version
sudo docker ps -a
exit
vagrant halt dev
cd ~
git clone https://github.com/vfarcic/cd-workshop.git
cd cd-workshop
vagrant up cd
vagrant ssh cd
sudo docker ps -a
exit
Open http://localhost:8080/
vagrant up prod
vagrant ssh prod
ssh-keygen # Enter to all questions
exit
vagrant ssh cd
ssh-keygen # Enter to all questions
ssh-copy-id 192.168.50.92 # Pass: vagrant
git clone https://github.com/vfarcic/books-service.git
cd books-service
sudo ./build_tests.sh
sudo docker images | grep vfarcic/books-service-tests
sudo docker run -t --rm \
-v $PWD/target/scala-2.10:/source/target/scala-2.10 \
-v /data/.ivy2:/root/.ivy2/cache \
vfarcic/books-service-tests
ll target/scala-2.10/books-service-assembly-1.0.jar
cd ~
git clone https://github.com/vfarcic/books-fe.git
cd books-fe
clear && cat create_docker.md
Instructions
cd ~/books-service
sudo docker build -t vfarcic/books-service .
sudo docker run -d --name books-service \
-p 9001:8080 \
-v /data/books-service/db:/data/db \
vfarcic/books-service
curl -H 'Content-Type: application/json' -X PUT -d \
'{"_id": 1, "title": "My First Book", "author": "John Doe", "description": "Not a very good book"}' \
http://localhost:9001/api/v1/books | python -mjson.tool
curl -H 'Content-Type: application/json' -X PUT -d \
'{"_id": 2, "title": "My Second Book", "author": "John Doe", "description": "Not a bad as the first book"}' \
http://localhost:9001/api/v1/books | python -mjson.tool
curl -H 'Content-Type: application/json' -X PUT -d \
'{"_id": 3, "title": "My Third Book", "author": "John Doe", "description": "Failed writers club"}' \
http://localhost:9001/api/v1/books | python -mjson.tool
curl http://localhost:9001/api/v1/books | python -mjson.tool
curl http://localhost:9001/api/v1/books/_id/1 | python -mjson.tool
sudo docker rm -f books-service
sudo docker ps -a
cd ~/books-fe
sudo docker run -t --rm \
-v $PWD/stories:/opt/bdd/data/stories \
vfarcic/bdd-runner-phantomjs \
-P url=http://172.17.42.1:9001 \
-P widthHeight=1024,768 \
--story_path data/stories/functional/**
sudo docker rm -f books-fe-mock
sudo docker tag -f vfarcic/books-service-tests \
192.168.50.91:5000/books-service-tests
sudo docker tag -f vfarcic/books-service \
192.168.50.91:5000/books-service
sudo docker images | grep books-service
sudo docker push \
192.168.50.91:5000/books-service-tests
sudo docker push \
192.168.50.91:5000/books-service
curl http://localhost:5000/v1/search?q=books-service | python -mjson.tool
ansible-playbook /vagrant/ansible/docker.yml \
-i /vagrant/ansible/hosts/prod
exit
vagrant ssh prod
sudo docker run -d --name books-service \
-p 9001:8080 \
-v /data/books-service/db:/data/db \
192.168.50.91:5000/books-service
curl -H 'Content-Type: application/json' -X PUT -d \
'{"_id": 1, "title": "My First Book", "author": "John Doe", "description": "Not a very good book"}' \
http://localhost:9001/api/v1/books | python -mjson.tool
curl -H 'Content-Type: application/json' -X PUT -d \
'{"_id": 2, "title": "My Second Book", "author": "John Doe", "description": "Not a bad as the first book"}' \
http://localhost:9001/api/v1/books | python -mjson.tool
curl -H 'Content-Type: application/json' -X PUT -d \
'{"_id": 3, "title": "My Third Book", "author": "John Doe", "description": "Failed writers club"}' \
http://localhost:9001/api/v1/books | python -mjson.tool
curl http://localhost:9001/api/v1/books | python -mjson.tool
exit
vagrant ssh cd
curl -H 'Content-Type: application/json' \
http://192.168.50.92:9001/api/v1/books | python -mjson.tool
curl -H 'Content-Type: application/json' \
http://192.168.50.92/api/v1/books | python -mjson.tool
ansible-playbook /vagrant/ansible/nginx_with_books.yml \
-i /vagrant/ansible/hosts/prod
curl -H 'Content-Type: application/json' \
http://192.168.50.92/api/v1/books | python -mjson.tool
sudo docker run -t --rm \
-e "TEST_TYPE=integ" \
-e "DOMAIN=http://192.168.50.92" \
-v /data/.ivy2:/root/.ivy2/cache \
192.168.50.91:5000/books-service-tests
cd ~
git clone https://github.com/vfarcic/books-stress.git
cd books-stress
sudo docker build -t vfarcic/books-stress .
sudo docker tag vfarcic/books-stress 192.168.50.91:5000/books-stress
sudo docker push 192.168.50.91:5000/books-stress
sudo docker run -t --rm \
-e "DOMAIN=http://192.168.50.92" \
-e "USERS=10" \
-e "USERS_OVER_SECONDS=20" \
-e "MAX_RESPONSE_TIME=1000" \
-e "DURATION=120" \
-v /data/stress/results:/stress/results \
192.168.50.91:5000/books-stress
exit
vagrant ssh prod
curl http://192.168.50.92/api/v1/books | python -mjson.tool
sudo docker pull 192.168.50.91:5000/books-service
sudo docker rm -f books-service
curl http://192.168.50.92/api/v1/books | python -mjson.tool
sudo docker run -d --name books-service \
-p 9001:8080 \
-v /data/books-service/db:/data/db \
192.168.50.91:5000/books-service
curl http://192.168.50.92/api/v1/books | python -mjson.tool
sudo docker rm -f books-service
sudo docker run -d --name books-service-db \
-p 27017:27017 \
-v /data/books-service/db:/data/db \
mongo
sudo docker run -d --name books-service-blue \
-p 9001:8080 \
--link books-service-db:db \
192.168.50.91:5000/books-service
curl http://192.168.50.92/api/v1/books | python -mjson.tool
sudo docker pull 192.168.50.91:5000/books-service
sudo docker run -d --name books-service-green \
-p 9002:8080 \
--link books-service-db:db \
192.168.50.91:5000/books-service
sudo docker ps -a | grep books-service
curl http://192.168.50.92:9002/api/v1/books | python -mjson.tool
cat /data/nginx/sites-enabled/services.conf
exit
vagrant ssh cd
sudo docker run --rm \
-e "TEST_TYPE=integ" \
-e "DOMAIN=http://192.168.50.92:9002" \
-v /data/.ivy2:/root/.ivy2/cache \
192.168.50.91:5000/books-service-tests
sudo docker run -t --rm \
-e "DOMAIN=http://192.168.50.92:9002" \
-e "USERS=10" \
-e "USERS_OVER_SECONDS=20" \
-e "MAX_RESPONSE_TIME=1000" \
-e "DURATION=120" \
-v /data/stress/results:/stress/results \
192.168.50.91:5000/books-stress
exit
vagrant ssh prod
cat /data/nginx/sites-enabled/services.conf
sudo sed -i 's/9001/9002/g' /data/nginx/sites-enabled/services.conf
cat /data/nginx/sites-enabled/services.conf
sudo docker kill -s HUP nginx
sudo docker stop books-service-blue
sudo docker ps -a | grep books-service
exit
vagrant ssh cd
sudo docker run -it --rm \
-e "TEST_TYPE=integ" \
-e "DOMAIN=http://192.168.50.92" \
-v /data/.ivy2:/root/.ivy2/cache \
192.168.50.91:5000/books-service-tests
exit
vagrant ssh prod
sudo docker rm -f books-service-blue
sudo docker ps -a | grep books-service
curl http://192.168.50.92/api/v1/books | python -mjson.tool
exit
vagrant ssh cd
ansible-playbook /vagrant/ansible/etcd.yml \
-i /vagrant/ansible/hosts/prod
exit
vagrant ssh prod
etcdctl set /books-service/color green
etcdctl set /books-service/port 9002
etcdctl get /books-service/color
etcdctl get /books-service/port
sudo docker pull 192.168.50.91:5000/books-service
sudo docker run -d --name books-service-blue \
-p 9001:8080 \
--link books-service-db:db \
192.168.50.91:5000/books-service
# Run tests
sudo sed -i 's/9002/9001/g' /data/nginx/sites-enabled/services.conf
cat /data/nginx/sites-enabled/services.conf
sudo docker kill -s HUP nginx
sudo docker stop books-service-green
# Run tests
curl -H 'Content-Type: application/json' \
http://192.168.50.92/api/v1/books | python -mjson.tool
sudo docker rm -f books-service-green
etcdctl set /books-service/color blue
etcdctl set /books-service/port 9001
exit
vagrant ssh cd
ansible-playbook /vagrant/ansible/books-service.yml \
-i /vagrant/ansible/hosts/prod
- hosts: books-service
remote_user: vagrant
sudo: yes
roles:
- docker
- nginx
- etcd
- books-fe
ansible-playbook /vagrant/ansible/books-fe.yml \
-i /vagrant/ansible/hosts/prod --tags "books-fe"
container: books-fe
blue_port: 9011
green_port: 9012
- name: Colors are retrieved
blue_green:
name: {{ container }}
blue_port: {{ blue_port }}
green_port: {{ green_port }}
register: colors
tags: [books-fe]
- debug: var=colors
tags: [books-fe]
- name: Set port
set_fact: port={{ colors.new_port }}
tags: [books-fe]
- debug: var=port
tags: [books-fe]
- name: Latest container is pulled
shell: docker pull {{ registry }}/{{ container }}
tags: [books-fe]
- name: Container is absent
docker:
image: '{{ registry }}/{{ container }}'
name: '{{ container }}-{{ colors.new_color }}'
state: absent
tags: [books-fe]
- name: New container is running
docker:
name: '{{ container }}-{{ colors.new_color }}'
image: '{{ registry }}/{{ container }}'
ports: '{{ colors.new_port }}:8080'
state: running
tags: [books-fe]
location / {
proxy_pass http://172.17.42.1:{{ port }}/;
}
- name: nginx config files are present
template:
src: {{ container }}.conf.j2
dest: /data/nginx/includes/{{ container }}.conf
register: nginx_result
tags: [books-fe]
- debug: var=nginx_result
tags: [books-fe]
- name: nginx container is restarted
shell: docker kill -s HUP nginx
when: nginx_result|changed
tags: [books-fe]
- name: Integration tests are absent
docker:
name: '{{ container }}-tests'
image: '{{ registry }}/{{ container }}-tests'
state: absent
delegate_to: 127.0.0.1
tags: [books-fe]
- name: Integration tests are run
command: >
sudo docker run -t --name {{ container }}-tests
-v /home/vagrant/books-fe/stories:/opt/bdd/data/stories
vfarcic/bdd-runner-phantomjs
-P url=http://192.168.50.92
-P widthHeight=1024,768
--story_path data/stories/integration/**
delegate_to: 127.0.0.1
register: test_results
ignore_errors: yes
tags: [books-fe]
- debug: var=test_results
tags: [books-fe]
- name: Revert colors
set_fact: port={{ colors.current_port }}
when: test_results|failed
tags: [books-fe]
- debug: var=port
tags: [books-fe]
- name: nginx config files are present
template:
src: {{ container }}.conf.j2
dest: /data/nginx/includes/{{ container }}.conf
when: test_results|failed
tags: [books-fe]
- name: nginx container is restarted
shell: docker kill -s HUP nginx
when: test_results|failed
tags: [books-fe]
- name: fail deployment
fail: msg="Deployment failed"
when: test_results|failed
tags: [books-fe]
- name: Colors are changed
blue_green:
name: {{ container }}
blue_port: {{ blue_port }}
green_port: {{ green_port }}
state: changed
register: colors
when: test_results|success
tags: [books-fe]
- debug: var=colors
tags: [books-fe]
- name: Container is stopped
docker:
image: '{{ registry }}/{{ container }}'
name: '{{ container }}-{{ colors.old_color }}'
state: stopped
when: test_results|success
tags: [books-fe]
ansible-playbook /vagrant/ansible/cd.yml -c local