WORKSPACE / Blog / zero-downtime-deployments-with-laravel-envoy-and-cicd
BN

Zero-Downtime Deployments with Laravel Envoy and CI/CD

June 6, 2026

3 min read

Laravel Envoy CI/CD Zero-Downtime Deployments

The Problem with Zero-Downtime Deployments

Let's face it, deployments can be a nightmare, especially when they cause downtime. In a production environment, every minute of downtime can translate to lost revenue and a poor user experience. As developers, we strive to ensure our applications are always available, even when we're pushing new code. This is where zero-downtime deployments come in – they allow us to deploy new code without interrupting the user experience.

Achieving Zero-Downtime Deployments with Laravel Envoy and CI/CD

To achieve zero-downtime deployments, we'll focus on a few key strategies: symlink-based deployment, database migration safety during deploys, blue-green deployments, and CI/CD pipeline automation. Laravel Envoy is a great tool for automating deployment tasks, and when combined with a CI/CD pipeline, we can ensure seamless deployments.

The Implementation

For symlink-based deployment, we'll use Laravel Envoy to create a new release directory and update the symlink to point to the new release. Here's an example Envoy task:

use Illuminate\Support\Facades\Envoy;

Envoy::task('deploy', function () {
    $releaseDir = 'releases/' . date('YmdHis');
    // Create new release directory
    Envoy::run('mkdir -p ' . $releaseDir);
    // Update symlink to point to new release
    Envoy::run('ln -nfs ' . $releaseDir . ' current');
});

For database migration safety, we'll use Laravel's built-in migration system and ensure that migrations are run in a way that doesn't cause downtime. We can achieve this by running migrations in a transaction and using a separate database connection for the migration process.

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;

class ExampleMigration extends Migration
{
    public function up()
    {
        DB::transaction(function () {
            // Run migration in a transaction
            Schema::create('example_table', function (Blueprint $table) {
                $table->id();
                $table->string('name');
            });
        });
    }
}

For blue-green deployments, we'll use a separate environment for the new deployment and switch to it once the deployment is complete. This ensures that users are always accessing a stable environment.

use Illuminate\Support\Facades\Envoy;

Envoy::task('blue-green-deploy', function () {
    // Create new environment for deployment
    Envoy::run('mkdir -p /var/www/blue');
    // Deploy to new environment
    Envoy::run('git clone https://example.com/repo.git /var/www/blue');
    // Switch to new environment
    Envoy::run('ln -nfs /var/www/blue /var/www/current');
});

Finally, we'll automate our CI/CD pipeline using a tool like GitHub Actions. This ensures that our deployment process is automated and consistent.

name: Deploy to Production

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Deploy to production
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
        run: |
          ssh -o "StrictHostKeyChecking=no" deploy@production "cd /var/www && git pull origin main && php artisan migrate"

Common Pitfalls

  • Not testing deployment scripts thoroughly, leading to unexpected errors during deployment
  • Not using a separate environment for deployments, causing downtime during deployment
  • Not automating the deployment process, leading to human error and inconsistent deployments

Key Takeaways

  • Use symlink-based deployment to ensure seamless deployments
  • Ensure database migration safety by running migrations in a transaction and using a separate database connection
  • Use blue-green deployments to ensure users are always accessing a stable environment
  • Automate your CI/CD pipeline to ensure consistent and reliable deployments