Skip to content

🚀 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 de main
  • deploy: Desplegament automàtic al servidor quan es fa merge des de staging

🔐 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):

  1. pages → documentació (execució manual amb push a pages)
  2. test → execució automàtica de proves en staging
  3. deploy → desplegament automàtic a producció en deploy

📦 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