gitlab ci cd docker
play

- GitLab - PowerPoint PPT Presentation

- GitLab CI/CD Docker DevOps- What we have NGINX + Tomcat (Java) + MySQL + Redis + SOLR


  1. Автотестирование и автодеплой веб- приложений с GitLab CI/CD и Docker Руслан Гайнанов DevOps-инженер ГК НАС

  2. What we have NGINX + Tomcat (Java) + MySQL + Redis + SOLR NGINX + Payara (Java) + PostgreSQL x 9 x 7

  3. CI/CD software Comparison of continuous integration software

  4. Good Plan

  5. Basic terms •Dependency (зависимость) • Pipeline (пайплайн ) • Stage (стадия) • Job (работа) • Runner (раннер) •Artifact (артефакт) •Push , commit , branch , production , deploy , feature , repository , project , ...

  6. "Hello" web application https://github.com/GRomR1/java-servlet-hello

  7. Test Infrastructure

  8. Simple Pipeline

  9. Simple Pipeline

  10. Let's code

  11. Prepare Runner https://docs.gitlab.com/runner/ gitlab-runner register -n \ --url "https://YOUR_GITLAB_URL/" \ --registration-token "XXXXXXXXXXXXXXXXXXXXXXX" \ --description "stand" \ --tag-list " stand-shell " \ --executor "shell" \ --limit 1

  12. Edit .gitlab-ci.yml (1/3) build_app: stage : build dependencies : [] tags : - stand-shell script : - docker run --rm -i -v ${PWD}:/hello -w /hello maven mvn clean install artifacts : paths: - hello.war expire_in: 1 week

  13. Edit .gitlab-ci.yml (1/3)

  14. Edit .gitlab-ci.yml (2/3) deploy:stand: stage : deploy dependencies : - build_app tags : - stand-shell script : - docker run -d --rm --name hello- ${CI_COMMIT_SHA:0:8} -P -v ${PWD}/hello.war:/usr/local/tomcat/webapps/hello.war tomcat:9.0-jre8-alpine - docker ps -f "name=hello- ${CI_COMMIT_SHA:0:8} " --format '{{.Ports}}'

  15. Edit .gitlab-ci.yml (2/3)

  16. Edit .gitlab-ci.yml (3/3) deploy:prod: stage : deploy dependencies : - build_app tags : - prod-shell script : - docker stop hello - docker run -d --rm --name hello -p 80:8080 -v ${PWD}/hello.war:/usr/local/tomcat/webapps/hello.war tomcat:9.0-jre8-alpine

  17. Add some magic

  18. Real Pipelines

  19. Branch Pipeline

  20. Master Pipeline

  21. Back to reality

  22. The scripts is overloaded .deploy_to_stand_template: script: &deploy_stand - echo "Stopping container $MYSQL_CONTAINER" && [[ $(docker ps -f "name=$MYSQL_CONTAINER" --format '{{.Names}}') == $MYSQL_CONTAINER ]] && docker stop $MYSQL_CONTAINER - sudo cp -r ${DB_DUMP_PATH}/${DB_DUMP_DIR_NAME}/* ${DB_PATH}/${CI_COMMIT_REF_SLUG}/${CI_COMMIT_SHA:0:8} - sudo chown -R 999:999 ${DB_PATH}/${CI_COMMIT_REF_SLUG}/${CI_COMMIT_SHA:0:8} - if echo ${COMMIT_MESSAGE} | grep '(_debug_)'; then export DEBUG_OPTS='- agentlib:jdwp=transport=dt_socket,address=0.0.0.0:1003,server=y,suspend=n '; fi ............. 250 rows...........

  23. The scripts is overloaded .deploy_to_stand_template: script: &deploy_stand - echo "Stopping container $MYSQL_CONTAINER" && [[ $(docker ps -f "name=$MYSQL_CONTAINER" --format '{{.Names}}') == $MYSQL_CONTAINER ]] && docker stop $MYSQL_CONTAINER - sudo cp -r ${DB_DUMP_PATH}/${DB_DUMP_DIR_NAME}/* ${DB_PATH}/${CI_COMMIT_REF_SLUG}/${CI_COMMIT_SHA:0:8} - sudo chown -R 999:999 ${DB_PATH}/${CI_COMMIT_REF_SLUG}/${CI_COMMIT_SHA:0:8} - if echo ${COMMIT_MESSAGE} | grep '(_debug_)'; then export DEBUG_OPTS='- agentlib:jdwp=transport=dt_socket,address=0.0.0.0:1003,server=y,suspend=n '; fi ............. 250 rows...........

  24. Too many manual actions

  25. P-U-S-H !!!

  26. Need tests

  27. Solution?

  28. Solution

  29. Our Workflow

  30. GitLab CI job:deploy job:run_tests 1. app-deploy-scripts • cd /app/scripts && git pull 2. app • cd /app/scripts/ansible • ansible-playbook playbook-app.yml • ansible-playbook playbook-app.yml -e deploy_stand=true -e run_tests=true -e stop_stand=true -e test_type=smoke -e branch= ${CI_COMMIT_REF_SLUG} -e mysql_port= ${MYSQL_PORT} -e commit= ${CI_COMMIT_SHA} -e stand_port= ${STAND_PORT} -e project_dir= ${CI_PROJECT_DIR} • artifacts: - tomcat_port - mysql_port

  31. CI Pipeline (Branch)

  32. CI Pipeline (Master)

  33. CI Output job:deploy .... TASK [app: Show info ] ok: [stand] => { "branch": "es-2158", "mysql_port": "21963", "stand_url": " http://192.168.0.1:11040 ", "title": "Merge branch 'origin/master' into ES-2158" }

  34. CI Output job:run_tests .... TASK [app: Result of tests ] ok: [stand] => { "msg": " 26 Scenarios ( 1 failed , 25 passed )" } TASK [app: Fail exit when tests failed ] fatal: [stand]: FAILED! => { "msg": " http://URL/es-2158/2018-08-13_08-20-36/ " }

  35. Test Results [1/4]

  36. Test Results [2/4]

  37. Test Results [3/4]

  38. Test Results [4/4]

  39. Regress Test job:auto_run_regress .... TASK [uc : Result of tests ] ok: [stand] => { "msg": " 191 Scenarios (35 failed, 156 passed)" }

  40. Deploy databases

  41. Run MySQL in Ansible Task - name : "run mysql-{{ branch }}" docker_container: name: "mysql-{{ branch }}" image: mysql:5.7 volumes: - "/uc/dev/{{ branch }}/db:/var/lib/mysql" - "/uc/scripts/db/conf/stand/base:/etc/mysql/mysql.conf.d:ro" ports: - "{{ mysql _ port }}:3306"

  42. Running DB containers

  43. Deploy on Production

  44. Online Deploy on Production [1/5]

  45. Online Deploy on Production [2/5]

  46. Online Deploy on Production [3/5]

  47. Online Deploy on Production [4/5]

  48. Online Deploy on Production [5/5]

  49. GitLab Environments https://docs.gitlab.com/ee/ci/environments.html

  50. Conclusion • GitLab CI/CD - удобный и надежный инструмент для автоматизации тестирования и развертывания •Для каждого проекта свой CI •Настройки в файле .gitlab-ci.yml (формат YAML) •Запуск скриптов от пользователя gitlab-runner

  51. Some advices •Группируйте и разделяйте задачи ( only и except ) •Используйте переменные ( $CI_COMMIT_SHA, $CI_COMMIT_REF_SLUG, ... ) •Используйте права доступа ( только Master обновляет Production ) •Помещайте в артефакты всё важное ( или почти всё ) •Runner делает вызов внешних скриптов ( ansible-playbook ... ) •Храните скрипты деплоя в отдельном репозитории ( app-deploy-scripts ) •Отдельная стадия для редких, но важных скриптов ( admin_only ) •Nginx + Docker = обновление backend незаметно •MySQL + Docker = легкость в управлении

  52. Some useful links • GitLab CI/CD (GR blog) • GitLab CI/CD Official Documentation • Configuration of your jobs with .gitlab-ci.yml • GitLab CI: Учимся деплоить • GitLab Runner: Executors • GitLab Container Registry

  53. Questions •Как расшифровывается DDD?

  54. Questions •Как расшифровывается DDD? •Domain-driven design - Предметно-ориентированное проектирование

  55. Questions •Как расшифровывается DDD? •Domain-driven design - Предметно-ориентированное проектирование •Чем отличается стадия от работы?

  56. Questions •Как расшифровывается DDD? •Domain-driven design - Предметно- ориентированное проектирование •Чем отличается стадия от работы? •Stage - стадия - набор работ выполняемых последовательно (Build -> Stage -> T est -> Deploy) •Job - работа - последовательность скриптов выполняемых Runner'ом. •Работы внутри одной стадии запускается параллельно

  57. Questions •Как расшифровывается DDD? •Чем отличается стадия от работы? •Какую команду NGINX необходимо выполнить после запуска нового backend?

  58. Questions •Как расшифровывается DDD? •Чем отличается стадия от работы? •Какую команду NGINX необходимо выполнить после запуска нового backend? •nginx -s reload

  59. Questions •Как расшифровывается DDD? •Чем отличается стадия от работы? •Какую команду NGINX необходимо выполнить после запуска нового backend? •nginx -s reload •Как быть, если БД занимает сотни ГБ?

Recommend


More recommend