This post is about GitLab CI basics for PHP deployments. CI pipelines sound complex but start simple. I explain the GitLab CI basics I use for PHP deployment on client projects.
Start With One Reliable Pipeline
CI pipelines sound complex but start simple. I explain the GitLab CI basics I use for PHP deployment on client projects.
- .gitlab-ci.yml — applied directly to GitLab CI basics for PHP deployments.
- rsync deploy — applied directly to GitLab CI basics for PHP deployments.
- env secrets — applied directly to GitLab CI basics for PHP deployments.
- post-deploy smoke tests — applied directly to GitLab CI basics for PHP deployments.
What the Solution Looked Like
The working version of GitLab CI Basics for PHP Deployment Pipelines centred on .gitlab-ci.yml, rsync deploy, env secrets, and post-deploy smoke tests. I avoided copying patterns from other modules unless they solved a problem this feature actually had.
Automate What You Deploy Repeatedly
Representative code from the implementation — simplified for readability, but structurally what I deploy.
GitLab CI deploy stage
deploy_production:
stage: deploy
script:
- rsync -avz --delete ./ user@server:/var/www/app/
only: [main]Cron heartbeat file for job monitoring
<?php
file_put_contents('/var/www/app/storage/cron-heartbeat.txt', time());
$last = (int) @file_get_contents('/var/www/app/storage/cron-heartbeat.txt');
if (time() - $last > 90000) {
mail('ops@example.com', 'Cron failed', 'Nightly job did not run.');
}What I Would Do Again on This Topic
Once GitLab CI basics for PHP deployments was live, the team spent less time on rework because edge cases were handled at the boundary — not discovered in production.
If I repeated this, I would write the regression checks earlier — especially around the failure paths users hit once, not the happy path.
Before You Start Your Version
- Start with the exact problem statement for GitLab CI basics for PHP deployments — one sentence, no buzzwords.
- Prioritise .gitlab-ci.yml before polishing secondary UI details.
- Validate rsync deploy under realistic data volume, not demo rows.