# Development Install instructions in INSTALL.md. Read it before proceeding. ## Basic commands for development Load env variables (**don't skip this step**): source script/env.sh .env .env.development Start development: docker-compose up --build development Build or rebuild: docker-compose build` Debug: docker attach ensl_development To get inside docker web+test containers: docker-compose exec -u root development /bin/bash` docker-compose exec -u web development /bin/bash` docker-compose exec -u root test /bin/bash` docker-compose exec -u web test /bin/bash` Restart the web container docker-compose restart web` Run some tests: docker-compose up --build test docker-compose exec -u web test bundle exec rspec` docker-compose exec -u web test bundle exec rspec spec/controllers/shoutmsgs_controller_spec.rb` ## Debugging Enable debug: 1. For tests, Make sure ``require 'pry-byebug'`` is uncommented at spec_helper.rb 1. Uncomment add `byebug` anywhere ## Unresolved issues for development There are some unresolved issues to setup dev env. 1. Make sure docker has access to its dirs. You might have to chown if you have permission issues with docker. sudo chown -R 1000:1000 . sudo chown -R 999:999 db/data 1. You might have to run migrations manually. bundle exec rake db:migrate` ## Tips 1. If you need to run stuff on your host (eg. ruby, rubocop, bundle install etc) run all commands from the: `Dockerfile`. It should setup identical setup for your machine. 1. Add docker container names to /etc/hosts. This makes it possible to run test from local machine without using the container since editor/IDE don't integrate with Docker so well. sudo echo `docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ensl_dev_db` db >> /etc/hosts 1. VS Code and RubyMine are great IDE's/editors. 1. To run VS Code plugin Ruby Test Explorer in docker container you need to create path to custom path, copy the formatter and it whines about and it [still fails a bit](https://github.com/connorshea/vscode-ruby-test-adapter/issues/21). 1. You can run tests easier if you setup the stuff on your own computer. 1. Do not commit too much without testing. Also keep commits small for documentation and reversability issues. 1. You need to rebuild the docker image when you change gems. 1. To restart NGINX docker-compose exec nginx nginx -s 1. To restart PUMA touch tmp/restart.txt ## Design of ENSL Application Read this to understand design decisions and follow them! 1. Env variables should be used everywhere and loaded from .env* files using Dotenv * Load order is in [here]|(https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use) * Local changes go to .env*local and **not** .env * Passwords are in ENV variables for now so they don't have to duplicated between DB and Rails. 1. Everything should be running on containers. * Docker-compose is the heart of deployment * Dockerfile should contain the gems and prebuilt assets for production * The app is mounted as **volume**. It will override the Dockerfile content. * The app is only put inside the Dockerfile to precompile assets for production and staging. It could be removed to reduce space. * For production or staging could have the content in either image or as a volume. Doesn't really matter. 1. The public directory contains everything public. NGINX will try to find files there and ask from PUMA if it doesn't. * The local public directories (images, files, icons, avatars etc.) are to be addeed to .gitignore * Assets are compiled on-fly in development mode. * In production/staging etc. assets are precompiled and stored. Entry script can do this. * The public folder is a mix of auto-generated data (assets), static data (images) and user-generated data (avatars/files etc.). * No app folder in repo outside public is supposed to be shared by webserver. 1. Do not comment out tests that are taken out of use temporarily but use **skip** ## Tags in code * ``FIXME`` bugs or bad coding that need to fixed one day * ``TODO`` for things that are left undone * ``EXPLAIN`` please explain what the following code does * ``OBSOLETE`` remove this at some point * ``DEBUG`` uncomment following lines to enable debug ## TODO issues for dev 1. Puma should be running (eg. spring), and if debugger is used it should be able to connect via docker-compose up 1. Should directories exist? 1. docker-compose has some .env specific vars and then 1. The env variables are not always loaded causing mysterious issues. 1. How much in env vars? ## Best practices Take a look at these before writing anything. 1. https://nvie.com/posts/a-successful-git-branching-model/ 1. https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ 1. https://github.com/rubocop-hq/ruby-style-guide 1. https://rails-bestpractices.com/ 1. http://www.betterspecs.org/ 1. https://github.com/rubocop-hq/rspec-style-guide 1. Run rubocop