ensl.org/DEVELOPMENT.md
2020-05-02 16:04:21 +03:00

4.6 KiB

Development

Install instructions in INSTALL.md. Read this whole documentation before posting.

Basic commands for development

Load env variables (don't skip this step):

source script/env.sh .env .env.development

Start:

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 exec -u web test bundle exec rspec`
docker-compose exec -u web test bundle exec rspec spec/controllers/shoutmsgs_controller_spec.rb`

Unresolved issues for dev

There are some unresolved issues to setup dev env.

  1. Make sure tmp, tmp/sockets, tmp/pids and log exist.

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

  3. 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 shared by webserver.
  1. Do not comment out tests that are taken out of use temporarily but use skip

Tags in code

FIXME, TODO, EXPLAIN, OBSOLETE

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