CI/CD

CI/CD has become a natural part of modern software development, but every platform approaches it differently. In this category, I share practical observations about pipelines, automated checks, deployments, and the workflows that help deliver software with greater confidence.

laravel-maintenance-mode-controlled-503-cover.png
CI/CD

Laravel Maintenance Mode During Deployment: Controlled 503 Instead of Random 500 Errors

During an ICanUp production deployment, I do not want users to reach a partially updated Laravel application and receive random 500 errors. During the critical phase, the site enters maintenance mode with a controlled 503 response, a pre-rendered page, Retry-After, and one important rule: if deployment fails, the site does not automatically return to normal traffic.

199
laravel-deployment-health-checks-rollback-cover.png
CI/CD

Laravel Deployment Health Checks and Rollback: How I Verify Production After a Deploy

After a Laravel deployment succeeds, I do not automatically assume production is healthy. In ICanUp I verify HTTP, Laravel boot, the database connection, frontend assets, Supervisor, queue workers, Reverb, and the deployed commit SHA. If a critical check fails, the deployment should fail and rollback should not require manual file editing on the server.

177
jira-gitlab-merge-request-status-automation-cover.png
CI/CD

Jira + GitLab Merge Requests: How I Automated Issue Statuses Without Breaking the Workflow

In ICanUp, I wanted Jira issues to move automatically when a GitLab Merge Request was created and merged, but I did not want automation to own the entire issue lifecycle. I explain why I kept only two automatic transitions, how target branch and current status guards protect the workflow, and why repeated webhook events must remain idempotent.

221
vite-environment-variables-laravel-gitlab-ci-deployments.png
CI/CD

Vite Environment Variables in Laravel Deployments: Why Server .env Was Not Enough

All VITE_REVERB_* values were present in the server .env, yet the production bundle was still built without them. I traced the problem to the GitLab CI build stage, moved the build-time variables into the correct environment scope, and added fail-fast checks before deployment.

220