ensl.org/DEVELOPMENT.md
2020-11-15 04:58:28 +02:00

4.9 KiB

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
  2. 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

  2. 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.

  2. 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

  3. VS Code and RubyMine are great IDE's/editors.

  4. 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.

  5. You can run tests easier if you setup the stuff on your own computer.

  6. Do not commit too much without testing. Also keep commits small for documentation and reversability issues.

  7. You need to rebuild the docker image when you change gems.

  8. To restart NGINX

    docker-compose exec nginx nginx -s

  9. 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
  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
  2. Should directories exist?
  3. docker-compose has some .env specific vars and then
  4. The env variables are not always loaded causing mysterious issues.
  5. 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/
  2. https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
  3. https://github.com/rubocop-hq/ruby-style-guide
  4. https://rails-bestpractices.com/
  5. http://www.betterspecs.org/
  6. https://github.com/rubocop-hq/rspec-style-guide
  7. Run rubocop