Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Deploy Operations Laravel Package

dragon-code/laravel-deploy-operations

Laravel Deploy Operations by Dragon Code provides a simple, configurable way to run deployment tasks such as migrations, cache clearing, queue restarts, and custom Artisan commands. Define operations once and execute them reliably during releases, keeping deployments consistent and repeatable.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package's core seam is still unchanged: console-time execution of registered "operations" during a deploy, invoked from a pipeline step rather than the request path. Nothing in 7.3.0 changes that primary placement.
  • However, the release materially widens the footprint. Two of the three changes (queue.job, queue.lock duration) only make sense if operations can be dispatched as queued jobs. That means the package is no longer purely a console-path dependency — it has a queue dispatch path that touches the queue subsystem, worker configuration, and job serialization. The prior assessment's claim of "no interaction with the queue subsystem" is now incorrect and must be revised.
  • The --isolated presence-semantics fix signals the package explicitly models Laravel's own WithoutOverlapping/isolated concurrency primitives. That is architecturally significant: it means concurrency control is a first-class concern of the package, not something we bolt on around it.
  • queue.job override is the most architecturally useful addition for us: it lets us subclass the dispatched job and inject our own tracing, logging, and correlation IDs. That partially answers the observability question and reduces the "console-only output" concern.
  • Placement recommendation is unchanged: CI/CD pipeline step, not a route or schedule. But any team enabling the queue path is now also deploying a worker-side component, which is a different operational surface than a deploy script.

Integration feasibility

  • Still low friction for the console path: composer require, publish config, define operations, wire into the pipeline. The spike estimate of under a day for a working console-path proof still holds.
  • The queue path is a separate integration with separate effort. It requires a queue connection, a worker (Horizon or otherwise), a restart-on-deploy step, and a decision about whether deploy operations are allowed to run asynchronously at all. That is not a one-day spike; budget it separately or scope it out explicitly.
  • New config surface area (queue.job, lock duration) means a second config publish/review cycle. Minor, but it is a diff our platform team must review and pin before rollout.
  • Removal cost remains low for the console path. The queue path raises removal cost somewhat — if operations are dispatched as queued jobs, unwinding means converting job classes back into synchronous artisan commands and re-validating ordering.
  • Zero dependents is still true and still the dominant risk signal. 7.3.0 is evidence of continued maintenance, not evidence of adoption.

Technical risk

  • Adoption risk (high, unchanged). No third-party production validation. A minor release with three community-contributed PRs is a positive maintenance signal but does not substitute for dependents.
  • Bus factor (high, marginally improved). Two of three changes come from an outside contributor (@mark-year13), which is the first real evidence of a contributor base beyond the maintainer. Treat it as encouraging, not as a resolved bus factor — contributor PRs are not a support policy.
  • Scope creep risk (elevated, was medium). The package now spans both console execution and queued job dispatch, with its own lock semantics and an overridable job class. That is a broader surface to keep compatible across Laravel majors, and it increases the chance of a breaking change landing in a minor we feel obliged to take.
  • Compatibility risk (medium, unchanged). Ordering with config:cache, route:cache, and storage permissions is still the practical failure surface. The new queue.* config keys add another thing that must be present and correct when config is cached.
  • New: lock-semantics risk (medium). A configurable uniqueness lock duration introduces a classic TTL failure mode — lock shorter than operation runtime means double execution; lock longer than the retry window means a stalled deploy blocked by a phantom lock. This needs an explicit value with a rationale, not a default inherited from the package.
  • New: async deploy ordering risk (medium). If operations can be queued, they can complete after the pipeline reports success. Deploy operations that must precede traffic shift must not be queued. This distinction has to be encoded in our convention or it will be violated.

Key questions

  1. (Partially answered) Concurrency: the package now supports configurable lock duration for queued operations and honors --isolated semantics consistent with Laravel core. Still open: does the console/deploy path get equivalent locking, or is that only for queued jobs? This determines whether concurrent blue/green deploys can double-execute.
  2. (New) What is the default lock duration, and is it derived from anything meaningful, or an arbitrary constant? We need a documented rule for setting it per operation.
  3. (New) Can queue.job be overridden safely across a package minor upgrade without forking — i.e. is the base job class's public surface considered stable API?
  4. (New) Is the queued-execution path optional and inert by default? Confirm that a config with no queue.* keys behaves identically to the pre-7.3.0 console-only behavior.
  5. Does a failing operation still return a non-zero exit code and abort the deploy — and does that hold on the queue path, where "exit code" has no direct analogue?
  6. Are operations guaranteed idempotent on retry? What happens on re-run after a partial failure mid-sequence?
  7. Do before/after events emit structured output pipeable into our observability stack, and does the queue.job override let us attach correlation IDs without duplicating package internals?
  8. What is the supported Laravel/PHP version matrix and historical lag on new Laravel majors? Does the --isolated fix imply a minimum Laravel version bump? (Verify: the presence-semantics fix may silently raise the effective framework floor.)
  9. Is there a stated support policy and a credible fork/continuity plan?

Integration Approach

Stack fit

  • Console path: unchanged. Laravel 9+, VM or container deploys, no coupling to a deploy vendor.
  • Queue path: new stack requirement. Only relevant if we choose to queue operations; requires a worker tier, restart discipline, and Horizon (or equivalent) visibility. Do not enable this on services where the deploy operation must complete before traffic shift.
  • Recommendation: adopt the console path only, for now. Treat queue.* as a disabled feature. This keeps the integration as narrow as it was in the prior assessment and avoids importing worker-lifecycle concerns into the deploy pipeline.

Migration path

  • Incremental adoption is unchanged and still the right call: existing deploy scripts call the new command alongside legacy steps, then individual shell steps convert to operation classes one at a time.
  • Add an explicit decision record: "queue dispatch disabled; operations run synchronously in the pipeline." This prevents a future team from flipping queue.job on for convenience and silently breaking deploy ordering.
  • Keep wrapping the invocation in our own bin/deploy.sh so the package remains an implementation detail. The queue.job override is a second reason to keep that wrapper: it gives us a place to put a custom job class if we ever do enable queuing, without touching CI files.
  • Reverse path is still trivial for the console path. Document it as the pre-approved fallback.

Compatibility

  • Two hard gates remain: PHP constraint vs. our runtime floor, and confirmed support for current and next Laravel major.
  • New gate: verify that the --isolated presence-semantics fix doesn't raise the minimum supported Laravel version. A patch that "matches Laravel core semantics" often implies a framework version that has those semantics.
  • New gate: confirm the new queue.* keys are absent-tolerant — a cached config on an existing service must not error because the keys are missing.
  • Re-verify config:cache / route:cache ordering now that there is more config to resolve.
  • Multi-service monorepos: still confirm per-service registries rather than one global list.

Sequencing

  1. Spike (1 week, unchanged scope): one engineer, one non-critical internal service, console path only, queue disabled. Validate failure semantics, exit codes, idempotency, event output. Do not evaluate queue.* in this spike.
  2. Second, smaller spike (2–3 days, new): in a sandbox service, exercise the queue.job override and lock duration to understand what enabling them would cost and what breaks. Output is a documented "do not enable unless X" note, not an adoption.
  3. Standardize: internal convention — operation naming, required idempotency, ordering rules, logging format, explicit no-queue rule, lock policy. Reference pipeline snippet.
  4. Pilot breadth (1 quarter): 2–3 low-risk services, VM and container targets, to surface variance.
  5. Gate: only after two clean quarters consider customer-facing or revenue-path services.
  6. Hold: regulatory deploy-freeze services remain out of scope until maintenance risk is resolved by fork commitment or a named internal owner.

Operational Impact

Maintenance

  • Absolute upgrade effort is still modest, but the surface that must be upgraded grew: console execution, event surface, queued job class, and lock configuration. More surface means more chances a minor release contains something we must react to.
  • 7.3.0 is a positive maintenance datapoint — active PRs from an outside contributor, three changes in a minor, no breaking changes. It reduces (does not eliminate) the abandonment scenario. Update the maintenance-watch posture from "probable stall" to "monitor quarterly."
  • Keep pinning to an exact version. Keep the standing rule: if a Laravel upgrade is blocked more than two sprints by this dependency, fork internally. That rule is now slightly cheaper to invoke because we have a clearer picture of the codebase's scope.

Support

  • Still community-only, MIT, no SLA. Unchanged.
  • The contributor activity marginally improves the odds of an issue getting a response, but we must not plan on it. Named internal owner and a runbook with the manual fallback remain preconditions for adoption.
  • New runbook item: if a queued operation stalls on a phantom lock, the recovery procedure is to clear the lock and re-run the job — this needs to be written down before anyone enables queue.*.

Scaling

  • Console path: zero runtime scaling concern, unchanged. Cost scales with deploy frequency.
  • Queue path: introduces runtime scaling concerns — worker concurrency vs. lock duration, job throughput, failed-job table growth, and worker restart timing relative to deploy. This is a real change in the package's operational profile, but only for teams that enable it.
  • Organizational scaling concern is unchanged and still under-addressed: N services × M operations with no central inventory. Establish the inventory at standardization time.
  • Concurrent deploys: partially addressed for queued jobs, still open for console deploys. Do not assume the new lock covers the blue/green race.

Failure modes

  • Silent no-op (unchanged, highest severity): operation registered but never invoked due to config caching or registration ordering. Detect with a post-deploy assertion step.
  • Partial deploy (unchanged): operation 3 of 6 fails, 1–2 already mutated state, no rollback. The package cannot provide transactional semantics. Design for idempotent, individually-safe operations.
  • CI exit-code swallowing (unchanged): pipeline wrapper treats non-zero from a sub-step as non-fatal. Enforce set -e semantics and assert explicitly.
  • Concurrent double-execution (partially mitigated): locking now exists for queued operations and --isolated semantics match core. Console-path concurrent deploys remain unverified — this is the failure mode most likely to bite during a multi-region rollout.
  • New — lock TTL misconfiguration: lock expires before the operation finishes → duplicate execution; or lock outlives the retry window → deploy blocked by a stale lock requiring manual intervention. Mitigate with a documented per-operation duration rule and an alert on lock wait time.
  • New — async ordering violation: a queued operation completes after the pipeline reports success and after traffic shift. Mitigate with the explicit no-queue rule for anything in the critical deploy path.
  • New — config drift on upgrade: a package minor adds queue.* keys; a service's cached config predates them. Verify absence-tolerance before rolling 7.3.0 anywhere.
  • Abandonment (unchanged): fails loudly at upgrade time, fixable if the fork plan is pre-approved.

Ramp-up

  • Technical ramp-up for the console path remains low. Mental model is unchanged: registered commands that run in order, with events around them.
  • The queue additions add a genuinely non-obvious concept — synchronous vs. queued operation semantics, and why one must not be used where the other is required. That distinction needs a paragraph in the convention doc and a line in code review checklists, or someone will get it wrong.
  • Procedural ramp-up: convention document, pipeline snippet, failure-handling runbook, plus the new lock-policy and no-queue rules. Budget roughly a day of enablement per adopting team, unchanged.
  • Ongoing cost is the maintenance-watch, the operation inventory, and now a queue-feature-watch ("has anything about queued execution become load-bearing for us?").

Bottom line for a TPM: 7.3.0 is a healthy maintenance signal — active outside contributors, no breaking changes, and a useful queue.job override that improves our observability story. But it also expands the package from a console-only deploy helper into something that touches the queue subsystem, and it introduces lock TTL and async-ordering failure modes we did not previously have to reason about. The recommendation does not change, but the scope does: fund the one-week console-path spike with queue dispatch explicitly disabled, run a separate short spike to understand the queue path without adopting it, and codify "no queued operations in the critical deploy path" as a hard rule before the second service adopts. Fork-or-replace stays a pre-approved option. The 17/100 score and zero dependents are unchanged; this release improves the maintenance outlook, not the adoption case.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle
adachsoft/api-version-bundle
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
shitoudev/permissionmanager