Ruby Rake — тайный помощник

Rake — это как швейцарский нож в мире Ruby, который годами пылится в ящике, пока однажды не спасает ваш проект от хаоса. В статье разберём, как превратить Rake из “нужного для миграций” в мощный инструмент для автоматизации, тестирования и даже мониторинга, с примерами из реальных боевых условий.


� Почему Rake — это не только db:migrate

Когда новичок видит rake -T, он обычно обнаруживает там:

rake db:migrate      # Накатить миграции
rake db:seed         # Заполнить базу тестовыми данными

И думает: “Ну ок, скучно”. Но под капотом — целый язык автоматизации с зависимостями, описанием задач и интеграцией в Ruby-экосистему.


🔧 Базовый пример: задача для очистки кэша

Допустим, вам надоело вручную чистить tmp/cache. Пишем в lib/tasks/cache.rake:

desc "Очищает кэш приложения"
task :clear_cache do
  puts "💥 Удаляем файлы кэша..."
  FileUtils.rm_rf(Dir.glob('tmp/cache/*'))
  puts "✅ Готово!"
end

Вызываем:

rake clear_cache

Уже полезнее, чем ручная возня с rm!


🧩 Продвинутые фишки

1. Зависимости между задачами

task :build => [:compile, :test] do
  puts "Сборка завершена!"
end

2. Аргументы

task :greet, [:name] do |t, args|
  puts "Привет, #{args.name}!"
end

Вызов: rake greet[Иван]

3. Использование Rails-окружения

task :heavy_report => :environment do  # Загружает Rails
  User.find_each { |u| puts u.email }
end

💼 Реальные кейсы из практики

1. Ежедневный отчёт в Slack

task :daily_stats => :environment do
  stats = {
    new_users: User.where("created_at > ?", 1.day.ago).count,
    revenue: Payment.where(created_at: Time.zone.now.all_day).sum(:amount)
  }
  
  SlackNotifier.new.post("📊 Отчёт за #{Date.today}: #{stats.to_json}")
end

2. Массовый фикс данных (когда миграция не подходит)

task :fix_legacy_emails => :environment do
  User.where("email LIKE '%пример%'").find_each do |user|
    user.update!(email: user.email.gsub('пример', 'example'))
  end
end

3. Проверка целостности данных

task :check_orphaned_records => :environment do
  Post.left_joins(:user).where(users: { id: nil }).each do |post|
    puts "Пост #{post.id} без пользователя!"
  end
end

💣 Антипаттерны

  1. Гигантские rake-файлы
    Не превращайте lib/tasks в свалку. Дробите логику:
    lib/tasks/
      ├── db.rake
      ├── reports.rake
      └── maintenance.rake
    
  2. Тихие падения
    Всегда обрабатывайте ошибки:
    task :dangerous do
      begin
        # Код
      rescue => e
        puts "💥 Ошибка: #{e.message}"
        exit 1  # Важно для CI/CD!
      end
    end
    
  3. Задачи без описания
    desc — ваша документация:
    # Плохо:
    task :mystery_task
       
    # Хорошо:
    desc "Генерирует CSV-отчёт по платежам"
    task :generate_payments_report
    

🛠 Интеграция с современным стеком

1. Docker + Rake

COPY lib/tasks /app/lib/tasks
CMD ["rake", "daily_stats"]

2. CI/CD (GitLab example)

run_reports:
  script:
    - bundle exec rake generate_reports
  only:
    - schedules

3. Мониторинг через Healthchecks.io

task :cron_job do
  require 'net/http'
  Net::HTTP.get(URI('https://hc-ping.com/your-uuid'))
  # Основная логика
  Net::HTTP.get(URI('https://hc-ping.com/your-uuid/ok'))
end

🎯 Вывод

Rake — это ваш личный ассистент, который умеет:

  • Автоматизировать рутину ✅
  • Чинить данные в проде 🔧
  • Генерировать отчёты 📊
  • Работать по расписанию ⏰

Совет: Заведите rake -T в своём проекте прямо сейчас — возможно, вы обнаружите забытые задачи, которые уже решают ваши проблемы.

“Хороший разработчик пишет код. Отличный — заставляет код работать за себя.”
— Rake-манифест

🗓 Дата публикации: 18.09.2024, но это не точно...

Rake Ruby автоматизация тестирование мониторинг миграции