Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Dockerizando aplicações em uma Fintech

677 views

Published on

Dockerizando aplicações em uma Fintech - O bom, o mau e o feio/as surpresas

É minha experiência de criar aplicação em imagem Docker na Paycertify

Published in: Technology

Dockerizando aplicações em uma Fintech

  1. 1. Dockerizando aplicações em uma Fintech O bom, o mau e o feio/as surpresas
  2. 2. Rafael Gomes Pai de um menino DevOps Engineer #PayCertify Soteropolitano Docker Captain Membro do Core Team do DevOpsDays #devops #docker INICIATIVAS Raul Hacker Club Gatilho Kosmico: gatilhokosmico.com.br CONTATOS @gomex https://gomex.me/ https://www.linkedin.com/in/rbgomes/
  3. 3. O que estou fazendo? Docker para Desenvolvedores Pague quanto quiser Inclusive nada Aberto Você só precisa citar o autor Colaborativo https://github.com/gomex/docker-para-desenvolvedores Link https://leanpub.com/dockerparadesenvolvedores
  4. 4. A Fintech
  5. 5. Ecossistema de pagamento 100+ clientes Processa 50m dólares mês 20 desenvolvedores 10+ APIs 4 anos de empresa
  6. 6. O desafio
  7. 7. Transformar em imagem docker uma aplicação escrita em Ruby on Rails.
  8. 8. Web Worker
  9. 9. - Usa NodeJS - Deploy manual no Heroku
  10. 10. O método
  11. 11. Entrega = Atender expectativas do cliente
  12. 12. O método - Um exemplo
  13. 13. Dockerizar uma app Ambiente Prod Ambiente QA Ambiente só de dev Entregue Criar CI Lint Entregue Criar artefato Deploy Teste Sonar Entregue
  14. 14. Primeiros passos
  15. 15. Entregar um ambiente de desenvolvimento automatizado e padronizado 1
  16. 16. Entendendendo as demandas de Dev
  17. 17. 1. Não pode demorar o build da imagem 2. Possibilidade de manter cache de instalação de gems 3. Possibilidade de debugar o código da gem 4. Armazenar histórico irbrc 5. Precisa automatizar o primeiro uso (db creation, migration e etc) 6. Usuário diferente de root
  18. 18. Exemplo do Dockerfile FROM ruby:2.5.1 as builder RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && curl -sS https://dl.yarnpkg.com/debian/pubkey.g pg | apt-key add - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list ARG NODE_DATE_INSTALL=20180710 RUN apt-get update && apt-get install -y locales graphviz imagemagick postgresql-client-9.6 yarn nodejs && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && /usr/sbin/locale-gen && rm -rf /var/lib/apt/lists/*
  19. 19. … continuação do Dockerfile ARG BUNDLE_GITHUB__COM ENV BUNDLE_GITHUB__COM $BUNDLE_GITHUB__COM ENV GEM_HOME /gems/vendor ENV GEM_PATH /gems/vendor ENV GEM_SPEC_CACHE /gems/specs ENV BUNDLE_PATH /gems/vendor ENV BUNDLE_BIN /gems/vendor/bin ENV PATH /app/bin:/gems/vendor/bin:$PATH ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV ENV APP_ROOT /app WORKDIR $APP_ROOT/ RUN mkdir -p /gems RUN groupadd -r app && groupmod -g 1000 app && useradd -g app -ms /bin/bash app && chown app $APP_ROOT && chown -R app /gems USER app
  20. 20. Exemplo do docker-compose version: '3.4' services: app: working_dir: $PWD build: context: . target: builder args: BUNDLE_GITHUB__COM: $BUNDLE_GITHUB__COM RAILS_ENV: development
  21. 21. …continuação do docker-compose image: app:development env_file: - ./.env command: bundle exec rails server -b 0.0.0.0 volumes: - ./utils_ruby:/utils_ruby - .:$PWD - gems_2_5_1:/gems - app_home:/home/app/ - .irbrc:/home/app/.irbrc ports: - 3010:3000 depends_on: - mailcatcher - postgres - redis
  22. 22. 1. Não pode demorar o build da imagem 2. Possibilidade de manter cache de instalação de gems 3. Possibilidade de debugar o código da gem 4. Armazenar histórico irbrc 5. Precisa automatizar o primeiro uso (db creation, migration e etc) 6. Usuário diferente de root
  23. 23. Exemplo do Makefile dev: ## Start complete app dev environment docker-compose up --build dev-first: ## Start complete app dev environment docker-compose rm -f docker-compose build docker-compose run app bundle install --gemfile=Gemfile docker-compose run app yarn install docker-compose run app rails db:drop docker-compose run app rails db:create db:migrate db:seed docker-compose stop
  24. 24. 1. Não pode demorar o build da imagem 2. Possibilidade de manter cache de instalação de gems 3. Possibilidade de debugar o código da gem 4. Armazenar histórico irbrc 5. Precisa automatizar o primeiro uso (db creation, migration e etc) 6. Usuário diferente de root
  25. 25. Criando CI
  26. 26. Entregar as melhores práticas de um pipeline de entrega de imagens docker como artefato 2
  27. 27. Pipeline completo até QA
  28. 28. Precisamos incluir o conceito de lint no CI
  29. 29. Exemplo do Jenkinsfile stages { stage('lint') { agent { docker { image 'paycertify/docker-lint:v2' } } steps { sh 'dockerfile_lint -f Dockerfile -r /rules/default_rules.yaml' } }
  30. 30. Exemplo do Dockerfile do Docker-lint FROM projectatomic/dockerfile-lint:latest LABEL maintainer "Rafael Gomes <rafael.gomes@paycertify.com>" COPY default_rules.yaml /rules/default_rules.yaml
  31. 31. Exemplo do default_rules do Docker-lint required_instructions: - instruction: "EXPOSE" count: 1 level: "info" message: "There is no 'EXPOSE' instruction" description: "Without exposed ports how will the service be accessed?" reference_url: - "https://docs.docker.com/engine/reference/builder/" - "#expose"
  32. 32. Resultado do lint no pipeline
  33. 33. O teste precisa de Banco
  34. 34. Exemplo do Jenkinsfile stage('test') { steps { sh 'make dev-first' sh 'make rspec-test' sh 'make db-drop' } }
  35. 35. Exemplo do Makefile dev-first: ## Start complete app dev environment docker-compose rm -f docker-compose build docker-compose run app bundle install --gemfile=Gemfile docker-compose run app yarn install docker-compose run app rails db:drop docker-compose run app rails db:create db:migrate db:seed docker-compose stop
  36. 36. ...Continuação do Makefile rspec-test: ## Run rspec test docker-compose rm -f docker-compose build docker-compose run app rspec . docker-compose stop db-drop: ## Drop DB docker-compose rm -f docker-compose build docker-compose run app rails db:drop docker-compose stop
  37. 37. Resultado do rspec no pipeline
  38. 38. Uma imagem docker apenas!
  39. 39. Dockerfile MultiStage Build FROM ruby:2.5.1 as builder … FROM builder as install <Copia gemfile e package.json para instalar pacotes nodes e gems> FROM install as preprod <Copia o código e compila os assets do node>
  40. 40. Dockerfile MultiStage Build FROM paycertify/ruby:2.5.1-slim as prod ... WORKDIR /app/ ... COPY --from=preprod /usr/local/bundle/ /usr/local/bundle/ COPY --from=preprod /app/ /app/ COPY --from=preprod /gems/ /gems/ EXPOSE 3000 CMD ["bundle","exec","rails","server","-b","0.0.0.0"]
  41. 41. Exemplo do Jenkinsfile stage('build') { steps { script { sh "make qa-build" println "Newly generated app image" } } }
  42. 42. Makefile qa-build: ## Build QA image docker build -t app:$(GIT_COMMIT) --target prod .
  43. 43. Aplicando tag e mandando pra Heroku
  44. 44. Exemplo do Jenkinsfile stage('tag-push-qa') { when { branch "staging" } steps { script { sh 'make heroku-tag-qa' } } }
  45. 45. Makefile heroku-tag-qa: docker-heroku-login ## Tag QA image docker tag app:$(GIT_COMMIT) registry.heroku.com/app/web docker tag worker:$(GIT_COMMIT) registry.heroku.com/app/worker docker push registry.heroku.com/app/web docker push registry.heroku.com/app/worker # HELPERS docker-heroku-login: ## Auto login to Heroku Docker Registry docker login --username=_ --password=$(API_KEY) registry.heroku.com
  46. 46. Fazendo deploy no heroku
  47. 47. Exemplo do Jenkinsfile stage('deploy-heroku-qa') { when { branch "staging" } steps { sh 'make heroku-release-qa' } }
  48. 48. Makefile heroku-release-qa: ## Release QA image heroku container:release --app app web heroku run -a app rails db:migrate
  49. 49. A aplicação precisa ser testada end-to-end (capybara)
  50. 50. Exemplo do Jenkinsfile stage('QA e2e test') { when { branch "staging" } steps { script { sh 'make e2e_test' } } }
  51. 51. Makefile e2e_test: ## Start complete app QA environment docker run --rm -e URL_STAGING=$$URL_STAGING -e EMAIL_ADMIN=$$EMAIL_ADMIN -e EMAIL_MERCHANT=$$EMAIL_MERCHANT -e PASSWORD=$$PASSWORD -e HUB=$$HUB -v $$PWD/test/e2e_tests:/test paycertify/capybara:0.4
  52. 52. Pipeline completo até QA
  53. 53. Obtendo feedback
  54. 54. A solução proposta atende às expectativas dos desenvolvedores? Lembre-se nosso objetivo aqui é isso! 3
  55. 55. Cada passo, cada mudança no projeto foi revisada e aceita o PR por ao menos um pessoa do time de dev
  56. 56. Parear com o time de dev e obter experiência
  57. 57. Deploy em produção
  58. 58. A janela de mudança precisa ser a menor possível 4
  59. 59. Um backup e restore do banco de produção manual para o ambiente automatizado é necessário
  60. 60. Exemplo de comandos do Heroku heroku pg:backups:download b001 --app manual-prod-app heroku pg:backups:restore latest.dump --app auto-prod-app
  61. 61. Obrigado!
  62. 62. Rafael Gomes Pai de um menino DevOps Engineer #PayCertify Soteropolitano Docker Captain Membro do Core Team do DevOpsDays #devops #docker INICIATIVAS Raul Hacker Club Core team do DevOpsDays CONTATOS @gomex https://gomex.me/ https://www.linkedin.com/in/rbgomes/

×