🚀 Desplegament Automàtic amb GitLab CI/CD per a un Projecte Laravel
Aquest document descriu com s’ha integrat un projecte Laravel amb GitLab CI/CD per automatitzar les proves i el desplegament a un entorn de producció real.
🌿 Estructura de Branques
El flux de treball s’ha estructurat amb les branques següents:
pages
: Generació de la documentació amb MkDocs. Aquesta és l’única branca que no té execució automàtica; s’ha de fer un push manual perquè s’activi el job.staging
: Execució automàtica de proves quan es fa merge des demain
deploy
: Desplegament automàtic al servidor quan es fa merge des destaging
🔐 Variables d'Entorn a GitLab
A GitLab, dins de Settings > CI/CD > Variables, s'han configurat les següents variables d'entorn per ser utilitzades a la pipeline:
Clau | Valor |
---|---|
MYSQL_DATABASE | laravel_test |
MYSQL_PASSWORD | secret |
MYSQL_ROOT_PASSWORD | root_secret |
MYSQL_USER | laravel_user |
PASSWORD | password |
PROJECT_PATH | /var/www/html/netflix |
SSH_HOST | 10.1.1.110 |
SSH_USER | root |
Aquestes variables permeten:
- Executar correctament les proves en entorn de test
- Connectar via SSH amb el servidor remot per fer el desplegament
- Mantenir dades sensibles com contrasenyes, usuaris i IPs fora del codi del repositori, millorant la seguretat i mantenibilitat del projecte
🧪 Job: staging_tests
Aquest job s’executa automàticament quan es fa un merge a la branca staging
.
image: php:8.2
services:
- mysql:8.0
Defineix la imatge base de PHP i afegeix un servei de MySQL perquè Laravel pugui connectar-se a una base de dades temporal per fer els tests.
before_script:
- apt-get update -yqq && apt-get install -y git libzip-dev unzip
Actualitza i instal·la dependències de sistema necessàries per Laravel i Composer.
- docker-php-ext-install pdo_mysql zip
Instal·la extensions PHP per connectar amb MySQL i gestionar arxius ZIP.
- curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Instal·la Composer per gestionar les dependències PHP del projecte.
- composer install
Instal·la les dependències definides a
composer.json
.
- cp .env.testing .env
- php artisan key:generate
Configura l'entorn de test i genera la clau d’aplicació.
- php artisan migrate:fresh --seed
Aplica les migracions i llavors la base de dades amb seeders.
script:
- php artisan test
Executa les proves automàtiques del projecte.
🚀 Job: production_deploy
S’executa quan es fa merge a la branca deploy
.
image: alpine:latest
before_script:
- apk add --no-cache openssh-client rsync git sshpass
Instal·la eines necessàries per a connexió remota i transferència de fitxers.
script:
- sshpass -p "$PASSWORD" ssh -tt -o StrictHostKeyChecking=no root@$SSH_HOST "
cd $PROJECT_PATH &&
git config --global --add safe.directory /var/www/html/netflix &&
git checkout deploy &&
git pull &&
composer install --no-interaction --no-progress --no-dev &&
php artisan migrate --force &&
php artisan db:seed --force &&
npm install &&
npm run build &&
systemctl restart nginx"
Obre una connexió SSH i dins del servidor fa:
- Navegació a la ruta del projecte
- Checkout i actualització del codi (
git pull
)- Instal·lació de dependències PHP i Node.js
- Execució de migracions i seeders
- Compilació amb Vite
- Reinici del servei Nginx
📄 Job: pages
(Documentació amb MkDocs)
S’executa manualment cada vegada que es fa push a la branca pages
.
image: python:3.9
script:
- pip install mkdocs mkdocs-material
- rm -rf public
- mkdocs build
- mv site public
Instal·la MkDocs, compila la documentació i la deixa disponible a la carpeta
public
.
🔄 Estructura de la pipeline
La pipeline té aquestes etapes (stages):
pages
→ documentació (execució manual amb push apages
)test
→ execució automàtica de proves enstaging
deploy
→ desplegament automàtic a producció endeploy
📦 Exemple complet del fitxer .gitlab-ci.yml
stages:
- pages
- test
- deploy
pages:
stage: pages
image: python:3.9
script:
- pip install mkdocs mkdocs-material
- rm -rf public
- mkdocs build
- mv site public
artifacts:
paths:
- public
only:
- pages
staging_tests:
stage: test
image: php:8.2
services:
- mysql:8.0
variables:
DB_HOST: mysql
DB_DATABASE: $MYSQL_DATABASE
DB_USERNAME: $MYSQL_USER
DB_PASSWORD: $MYSQL_PASSWORD
before_script:
- apt-get update -yqq && apt-get install -y git libzip-dev unzip
- docker-php-ext-install pdo_mysql zip
- curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
- composer install
- cp .env.testing .env
- php artisan key:generate
- php artisan migrate:fresh --seed
script:
- php artisan test
only:
- staging
- merge_requests
production_deploy:
stage: deploy
image: alpine:latest
before_script:
- apk add --no-cache openssh-client rsync git sshpass
- echo $SSH_HOST
script:
- sshpass -p "$PASSWORD" ssh -tt -o StrictHostKeyChecking=no root@$SSH_HOST "
cd $PROJECT_PATH &&
git config --global --add safe.directory /var/www/html/netflix &&
git checkout deploy &&
git pull &&
composer install --no-interaction --no-progress --no-dev &&
php artisan migrate --force &&
php artisan db:seed --force &&
npm install &&
npm run build &&
systemctl restart nginx"
only:
- deploy