Trim redundant Bake tasks and improve bootstrap

This commit is contained in:
Sami Samhuri 2026-02-07 17:30:43 -08:00
parent 24c41eea08
commit 878248cef5
No known key found for this signature in database
3 changed files with 23 additions and 90 deletions

View file

@ -54,9 +54,7 @@ Other targets:
rbenv exec bundle exec bake mudge rbenv exec bundle exec bake mudge
rbenv exec bundle exec bake beta rbenv exec bundle exec bake beta
rbenv exec bundle exec bake release rbenv exec bundle exec bake release
rbenv exec bundle exec bake generate . www https://samhuri.net rbenv exec bundle exec bake watch
rbenv exec bundle exec bake watch target=debug
rbenv exec bundle exec bake deploy --test true --delete true
rbenv exec bundle exec bake publish_beta rbenv exec bundle exec bake publish_beta
rbenv exec bundle exec bake publish rbenv exec bundle exec bake publish
``` ```
@ -82,14 +80,6 @@ rbenv exec bundle exec bake test
rbenv exec bundle exec bake lint rbenv exec bundle exec bake lint
``` ```
## Site Generation
```bash
rbenv exec bundle exec bake generate SOURCE TARGET [URL]
# example:
rbenv exec bundle exec bake generate . www https://samhuri.net
```
## Notes ## Notes
- `bake watch` is Linux-only and requires `inotifywait`. - `bake watch` is Linux-only and requires `inotifywait`.

95
bake.rb
View file

@ -2,7 +2,6 @@
require 'etc' require 'etc'
require 'fileutils' require 'fileutils'
require 'shellwords'
DRAFTS_DIR = 'public/drafts'.freeze DRAFTS_DIR = 'public/drafts'.freeze
PUBLISH_HOST = 'mudge'.freeze PUBLISH_HOST = 'mudge'.freeze
@ -40,49 +39,6 @@ def serve
server.start server.start
end end
# Generate a site from an arbitrary source directory into a target directory.
# @parameter source_path [String] Directory containing site sources.
# @parameter target_path [String] Directory to write generated site.
# @parameter url [String] Optional site URL override.
def generate(source_path = '.', target_path = 'www', url = nil)
require_relative 'lib/pressa'
site = Pressa.create_site(source_path:, url_override: url)
generator = Pressa::SiteGenerator.new(site:)
generator.generate(source_path:, target_path:)
puts "Site built successfully in #{target_path}"
end
# Install local prerequisites and gem dependencies.
def setup
ruby_version = File.read('.ruby-version').strip
if RUBY_PLATFORM.include?('linux')
puts '*** installing Linux prerequisites'
unless system('sudo', 'apt', 'install', '-y',
'build-essential',
'git',
'inotify-tools',
'libffi-dev',
'libyaml-dev',
'pkg-config',
'zlib1g-dev')
abort 'Error: failed to install Linux prerequisites.'
end
end
if command_available?('rbenv')
puts "*** using rbenv (ruby #{ruby_version})"
abort 'Error: rbenv install failed.' unless system('rbenv', 'install', '-s', ruby_version)
abort 'Error: bundle install failed.' unless system('rbenv', 'exec', 'bundle', 'install')
else
puts '*** rbenv not found, using system Ruby'
abort 'Error: bundle install failed.' unless system('bundle', 'install')
end
puts '*** done'
end
# Create a new draft in public/drafts/. # Create a new draft in public/drafts/.
# @parameter title_parts [Array] Optional title words; defaults to Untitled. # @parameter title_parts [Array] Optional title words; defaults to Untitled.
def new_draft(*title_parts) def new_draft(*title_parts)
@ -148,7 +104,7 @@ end
# Watch content directories and rebuild on every change. # Watch content directories and rebuild on every change.
# @parameter target [String] One of debug, mudge, beta, or release. # @parameter target [String] One of debug, mudge, beta, or release.
def watch(target: 'mudge') def watch(target: 'debug')
unless command_available?('inotifywait') unless command_available?('inotifywait')
abort 'inotifywait is required (install inotify-tools).' abort 'inotifywait is required (install inotify-tools).'
end end
@ -161,17 +117,6 @@ def watch(target: 'mudge')
end end
end end
# Deploy files via rsync without building first.
# @parameter beta [Boolean] Deploy to beta host path.
# @parameter test [Boolean] Enable rsync --dry-run.
# @parameter delete [Boolean] Enable rsync --delete.
# @parameter paths [Array] Optional local paths; defaults to www/.
def deploy(*paths, beta: false, test: false, delete: false)
publish_dir = truthy?(beta) ? BETA_PUBLISH_DIR : PRODUCTION_PUBLISH_DIR
local_paths = paths.empty? ? ['www/'] : paths
run_rsync(local_paths:, publish_dir:, dry_run: test, delete:)
end
# Publish to beta/staging server # Publish to beta/staging server
def publish_beta def publish_beta
beta beta
@ -222,19 +167,13 @@ private
# Build the site with specified URL # Build the site with specified URL
# @parameter url [String] The site URL to use # @parameter url [String] The site URL to use
def build(url) def build(url)
require_relative 'lib/pressa'
puts "Building site for #{url}..." puts "Building site for #{url}..."
generate('.', 'www', url) site = Pressa.create_site(source_path: '.', url_override: url)
end generator = Pressa::SiteGenerator.new(site:)
generator.generate(source_path: '.', target_path: 'www')
def run_rsync(local_paths:, publish_dir:, dry_run:, delete:) puts 'Site built successfully in www/'
command = ['rsync', '-aKv', '-e', 'ssh -4']
command << '--dry-run' if truthy?(dry_run)
command << '--delete' if truthy?(delete)
command.concat(local_paths)
command << "#{PUBLISH_HOST}:#{publish_dir}"
puts "Running: #{Shellwords.join(command)}"
abort 'Error: rsync failed.' unless system(*command)
end end
def run_build_target(target) def run_build_target(target)
@ -250,6 +189,15 @@ def watch_paths
WATCHABLE_DIRECTORIES.flat_map { |path| ['-r', path] } WATCHABLE_DIRECTORIES.flat_map { |path| ['-r', path] }
end end
def run_rsync(local_paths:, publish_dir:, dry_run:, delete:)
command = ['rsync', '-aKv', '-e', 'ssh -4']
command << '--dry-run' if dry_run
command << '--delete' if delete
command.concat(local_paths)
command << "#{PUBLISH_HOST}:#{publish_dir}"
abort 'Error: rsync failed.' unless system(*command)
end
def resolve_draft_input(input_path) def resolve_draft_input(input_path)
if input_path.include?('/') if input_path.include?('/')
if input_path.start_with?('posts/') if input_path.start_with?('posts/')
@ -329,14 +277,3 @@ end
def command_available?(command) def command_available?(command)
system('which', command, out: File::NULL, err: File::NULL) system('which', command, out: File::NULL, err: File::NULL)
end end
def truthy?(value)
case value
when true
true
when false, nil
false
else
%w[1 true yes on].include?(value.to_s.downcase)
end
end

View file

@ -22,9 +22,15 @@ cd "$ROOT_DIR"
if command -v rbenv >/dev/null 2>/dev/null; then if command -v rbenv >/dev/null 2>/dev/null; then
echo "*** using rbenv (ruby $RUBY_VERSION)" echo "*** using rbenv (ruby $RUBY_VERSION)"
rbenv install -s "$RUBY_VERSION" rbenv install -s "$RUBY_VERSION"
if ! rbenv exec gem list -i bundler >/dev/null 2>/dev/null; then
rbenv exec gem install bundler
fi
rbenv exec bundle install rbenv exec bundle install
else else
echo "*** rbenv not found, using system Ruby" echo "*** rbenv not found, using system Ruby"
if ! gem list -i bundler >/dev/null 2>/dev/null; then
gem install bundler
fi
bundle install bundle install
fi fi