State file can now be specified without a directory path (e.g., state.yaml),
eliminating crashes when using simple filenames.
Boot counters and other state-dependent units now work more reliably by
loading state once at startup instead of repeatedly during execution,
preventing race conditions and improving performance.
Trigger units now execute more efficiently by avoiding redundant condition
checks, improving overall system responsiveness.
Multiple units can now trigger the same unit (such as email or log units)
multiple times in a single execution chain, while still properly detecting and
preventing circular dependencies. This allows for more flexible notification
and logging patterns.
Graceful shutdown now waits for active units to complete when you press Ctrl+C or send a termination signal. BRun will wait for running units to finish before exiting, preventing interruption of critical operations like builds, deploys, or backups.
Email notifications now include a proper Date header, ensuring emails display
correct timestamps in mail clients and comply with email standards (RFC 5322).
The following GitHub workflow now automatically performs a BRun release when I push a tag to the main branch, including the automatic extraction of changelog contents into the GitHub release notes.
Trigger units (git, cron, file, etc.) now properly check their conditions when
triggered by other units via on_success, on_failure, or always fields.
For example, when a cron unit triggers a git unit, the git unit will only
execute if there are actual git updates, preventing unnecessary builds and
operations.
Git triggers without a poll interval (manual trigger mode) now correctly
check for updates when triggered by other units instead of always skipping
execution. This enables on-demand git update checking without requiring
continuous polling.
Configuration files can now be encrypted with SOPS, allowing you to safely
store passwords, API keys, and other secrets directly in your config files.
BRun automatically decrypts them at runtime with no changes to your workflow.
Cron triggers now skip runs that were missed by more than 60 seconds (e.g.,
due to system downtime), preventing unwanted catch-up behavior when the system
comes back online after extended periods. (#27)