Thinknetica-contrib

Продвинутый Rails

Это сборник статей, отвечающих на типичные вопросы студентов в курсе Thinknetica - Продвинутый Rails.

Здесь так же собирается информация, необходимая для обновления используемых в курсе версий Ruby, Rails и других библиотек.

Введение

Процесс разработки

  • Homebrew и Asdf Wip
  • Актуальные версии ruby/rails и гемов
  • Совместимость руби и рельсов
  • Курсы по гит и тулы
  • Как задавать вопросы
  • Добавь меня в реп

Введение в TDD/BDD

  • Попробуйте гитхаб

Тестирование контроллеров

  • Управление ENV
  • CI на Rspec, Сoverege и Standardrb
  • Ветки с конфликтами или проблемами ci не принимаются
  • Кросс ревью и вопросы в общем чате

Интеграционное тестирование

Ajax в Rails

  • slim или erb?

ActiveStorage

  • В разработке

Вложенные формы и полиморфные ассоциации

  • JS в rails 7
  • JS glist

Различные формы Ajax в Rails

  • В разработке

Comet и pub/sub

  • В разработке

Протокол OAuth

  • Конкретные OAuth провайдеры
  • Приколы с Doorkeeper

Авторизация в rails

  • Pundit

REST API

  • В разработке

Фоновые задачи

  • В разработке

Полнотекстовый поиск

  • DHH монолит
  • Как выбирать технологии для стека
  • Сфинкс vs Эластик vs PG full text search

Настройка сервера

  • Passanger криво встает на Ubuntu 22.04.2 LTS
  • Puma vs Passanger vs Unicorn

Deploy. Часть 2

  • Ключи деплоя и ssh-agent / ssh-add -K на маке
  • Управление ENV при деплое
  • systemctl --user

Продвинутая настройка сервера

  • Kamel / MRSK
  • Где взять домен
  • Сertbot / Letsencrypt

Оптимизация и кеширование

  • В разработке

Отказоустойчивость

  • В разработке

Вещает

Юра Кириллов

Homebrew, asdf, rwm, rbenv, apt-get и Apple AppStore

Как менеджерить софт из разных источников и откуда что ставить

Я использую MacOS для разработки на Ruby, в этой статье опишу свой флоу менеджмента софта. С некоторыми комментариями он подходит для Ubuntu Linux.

Разрабатывать на Ruby под Windows имхо невозможно без серьезного скила жонглирования docker контейнерами, это выходит за рамки данной статьи. Ну либо ставить Ubuntu на виртуалку / юзать WSL.

AppStore

Отсюда удобно ставить казуальный софт - софт, который вы используете как обычный пользователь, не как разработчик. Сюда относятся Telegram, Slack, Notion, Trello и другое, что можно найти в AppStore. Поставленный отсюда софт проверен Apple и централизованно обновляется, что очень удобно. Дополнительно я ставлю отсюда Xcode, хотя для Ruby разработки можно поставить только Xcode Command line tools, включающие консольный Git и компиляторы

Terminal
xcode-select --install

В Ubuntu есть собственный магазин приложений. Его удобно использовать схожим образом для GUI софта, консольные же утилиты удобнее ставить через менеджер apt-get, аналогом которого для Mac является Homebrew.

Homebrew

Homebrew: The Missing Package Manager for macOS (or Linux)

https://brew.sh

MacOS AppStore ориентирован на GUI программы, и консольных *nix утилит в нем нет. Тем не менее MacOS хорошо совместима с *nix на уровне исходников, и нам необходим только репозиторий скомпилированных программ и тул для управления их установкой. Как раз это и дает нам Homebrew. Кстати, он написан на Ruby.

Установка делается в одну команду, документация доступна на сайте brew.sh

Terminal
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Homebrew предоставляет менеджмент обновлений программ и управление зависимостями, аналогичное apt в Ubuntu. Можно оценить мощь этого менеджера, установив ffmpeg.

Terminal
brew install ffmpeg

Многие версии программ в Homebrew представлены разными версиями, например Postgresql или Mysql. Это дает некоторую гибкость и возможность выбрать необходимый софт

Terminal
ineedjet@shae ~/P/r/rubycats> brew instal postgresql@<TAB>
postgresql@10  postgresql@11  postgresql@12  postgresql@13  postgresql@14  postgresql@15  postgresql@16
Terminal
ineedjet@shae ~/P/r/rubycats> brew install mysql@<TAB>
mysql@5.7  mysql@8.0

Homebrew отлично подходит для установки программ, не требующих особо точного соответствия версий. Я устанавливаю отсюда Postgresql, Redis, Rabbitmq, Imagemagick, да вообще все консольные *nix утилиты. По сути все, что не является языками программирования, на которых я пишу. В Homebrew есть удобный инструмент сервисов, который запускает службы при входе в систему

Terminal
ineedjet@shae ~/P/r/rubycats> brew services list
Name          Status       User     File
postgresql@14 started      ineedjet ~/Library/LaunchAgents/homebrew.mxcl.postgresql@14.plist
redis         started      ineedjet ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
unbound       none

Отдельная большая часть Homebrew - это Homebrew Cask. Этот плагин расширяет Homebrew возможностью устанавливать программы, которые обычно устанавливаются из .dmg через механизм "To install, drag this icon…". Cask дает возможность установить GUI программы, разработчики которых не захотели возиться с распространением через AppStore и дает возможность централизованно все обновлять.

Cask не требует какой-то специальной установки - Homebrew обычно сам понимает, что вы хотите использовать Cask. В редких случаях, когда названия консольных *nix утилит и GUI программ для Mac совпадают, может потребоваться явно указать ключ --cask.

Terminal
ineedjet@shae ~/P/r/rubycats> brew install vlc rubymine

Я устанавливаю отсюда Vlc, TablePlus, RubyMine, qBittorent, Sublime Text, Fork, UTM, Miro и множество другого софта. Для большинства более-менее популярных программ для Mac существуют Cask рецепты. Исключениям будет только софт, принципиально распространяемый вендором через собственный магазин. Это, например, Adobe или Blizzard.

Rvm, Rbenv и Asdf

Теперь о языках программирования и версиях Ruby. Homebrew не подходит для сценария, где вам нужен Ruby определенной версии, а это основной сценарий развертывания у себя любого проекта. Для установки и управления Ruby разных версий нужна утилита, которая называется Version manager tool.

Rwm

Rvm - один из самых первых менеджеров версий для Ruby. Его основная фишка - так называемые гемсеты, которые связывают в гемсет версию Ruby и набор установленных гемов. Название гемсета проекта можно указать в файле .ruby-gemset , гемсет по-умолчанию называется default.

Rbenv

Rbenv пошел другим путем. На практике оказывается не очень удобно иметь большое количество гемсетов с одной и той же версией руби и дублирующимися гемами. Вместо гемсетов rbenv связывает гемы только с версией руби, а использование конкретных версий гемов гарантируется bundler.

Terminal
ineedjet@shae ~/P/r/rubycats> bundler exec sidekiq

bundler exec ... гарантирует здесь загрузку гемов из Gemfile.lock

Rbenv более модульный и разделен на менеджер версий (сам Rbenv) и тул сборки версий Ruby Ruby-build. Ruby-build можно не ставить, если вы хотите использовать готовые бинарники Ruby из PPA репозитория или другого источника (я рекомендую ставить).

Asdf

Asdf идет еще дальше, это универсальный менеджер рантайма. При помощи плагинов, он может управлять версиями Ruby, Node.js, Php, Perl, Python их больше сотни. Для рубистов наиболее интересны плагины для Ruby и Node.js.

Asdf предлагает собственный файл конфигурации .tool-versions, в котором можно перечислить все необходимые версии. Дополнительно Asdf поддерживает конфигурацию через файлы .ruby-version .node-version, .nvmrc для совместимости с Rbenv / Rwm и Nvm (это аналогичный менеджер версий для ноды). Для разработки значительно удобнее использовать один менеджер версий для всех возможных языков программирования. Как и Rbenv, Asdf не использует гемсеты и полагается на bundler.

Ставим Asdf на Mac

На Mac удобно поставить Asdf из brew. Ставим curl, git и сам asdf

Ставим плагины на Ruby и Node.js

Ставим для примера ruby 3.2.2 и node 18.18.1

Terminal
ineedjet@shae ~/P/r/rubycats> brew install asdf

В Mac по-умолчанию используется zsh, добавляем в начало .zshrc

~/.zshrc
. $(brew --prefix)/opt/asdf/libexec/asdf.sh

Включаем поддержку файлов .ruby-version и .node-version. Для этого надо создать файл .asdfrc в домашней директории пользователя и включить в нем legacy_version_file = yes

~/.asdfrc
legacy_version_file = yes

Выставляем Global конфигурацию, которая прописывается в файл $HOME/.tool-versions и используется по-умолчанию

Terminal
ineedjet@shae ~/P/r/rubycats> asdf global nodejs 16.5.0                                                                    1 homebrew-asdf!
ineedjet@shae ~/P/r/rubycats> asdf global ruby 3.2.2                                                                         homebrew-asdf!
ineedjet@shae ~/P/r/rubycats> cat $HOME/.tool-versions                                                                       homebrew-asdf!
nodejs 16.5.0
ruby 3.2.2

Для сборки Ruby разных версий Asdf использует Ruby-build.

Ставим Asdf на Ubuntu

Для Linux можно использовать метод установки через git clone. Ставим curl, git

Terminal
ineedjet@shae ~/P/r/rubycats>sudo apt-get install curl, git

Клонируем asdf

Terminal
ineedjet@shae ~/P/r/rubycats> git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1

В ubuntu по-умолчанию используется bash, добавляем в .bashrc

~/.bashrc
. "$HOME/.asdf/completions/asdf.bash"

Включаем поддержку файлов .ruby-version и .node-version

~/.asdfrc
legacy_version_file = yes

Ставим Ruby плагин на Asdf

Ставим плагин

Terminal
ineedjet@shae ~/P/r/rubycats>asdf plugin add ruby

Ставим версию Ruby

Terminal
ineedjet@shae ~/P/r/rubycats>asdf plugin add ruby

Ставим Node плагин на Asdf

Ставим плагин

Terminal
ineedjet@shae ~/P/r/rubycats>asdf install ruby 3.2.2

Ставим версию Node

Terminal
ineedjet@shae ~/P/r/rubycats>asdf install nodejs 18.17.1

Больше документации по Asdf на сайте