feat: test ci/cd

This commit is contained in:
leon-morival 2025-11-30 15:09:20 +01:00
parent f1c17f1d0c
commit 7b6b775e1d
5 changed files with 158 additions and 2 deletions

6
.dockerignore Normal file
View File

@ -0,0 +1,6 @@
.git
vendor
node_modules
storage/logs
storage/framework/cache/data
.env

64
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,64 @@
stages:
- test
- build
variables:
DOCKER_DRIVER: overlay2
# 🔍 Étape tests (optionnelle mais recommandée)
test:
stage: test
image: laravelsail/php84-composer
services:
- name: mysql:8.0
alias: mysql
variables:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: hunting_api
MYSQL_USER: root
MYSQL_PASSWORD: root
DB_CONNECTION: mysql
DB_HOST: mysql
DB_PORT: 3306
DB_DATABASE: hunting_api
DB_USERNAME: root
DB_PASSWORD: root
APP_ENV: testing
APP_KEY: base64:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
before_script:
- apt-get update && apt-get install -y git zip unzip
- cp .env .env.ci || true
- php artisan key:generate --force
- php artisan migrate --force
script:
- php artisan test
# 🐳 Build + push image dans le registry GitLab
docker-build-push:
stage: build
image: docker:24
services:
- docker:24-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
IMAGE_TAG: "$CI_REGISTRY_IMAGE:${CI_COMMIT_SHORT_SHA}"
before_script:
# Login au registry GitLab
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
script:
# Build de l'image à partir du Dockerfile de la racine
- docker build -t "$IMAGE_TAG" .
# Tag 'latest' en plus (optionnel mais pratique)
- docker tag "$IMAGE_TAG" "$CI_REGISTRY_IMAGE:latest"
# Push des tags
- docker push "$IMAGE_TAG"
- docker push "$CI_REGISTRY_IMAGE:latest"
only:
- main

31
Dockerfile Normal file
View File

@ -0,0 +1,31 @@
# Dockerfile
FROM laravelsail/php84-composer AS build
WORKDIR /var/www/html
# Copier le code
COPY . .
# Installer les dépendances PHP (prod)
RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
# Build des assets si tu utilises Vite
# RUN npm ci && npm run build
# -----------------------------
# Image finale (runtime)
# -----------------------------
FROM laravelsail/php84-composer
WORKDIR /var/www/html
COPY --from=build /var/www/html /var/www/html
# Optimisations Laravel
RUN php artisan config:cache \
&& php artisan route:cache
EXPOSE 80
CMD ["php-fpm"]

56
compose.yaml Normal file
View File

@ -0,0 +1,56 @@
services:
laravel.test:
build:
context: "./vendor/laravel/sail/runtimes/8.4"
dockerfile: Dockerfile
args:
WWWGROUP: "${WWWGROUP}"
image: "sail-8.4/app"
extra_hosts:
- "host.docker.internal:host-gateway"
ports:
- "${APP_PORT:-80}:80"
- "${VITE_PORT:-5173}:${VITE_PORT:-5173}"
environment:
WWWUSER: "${WWWUSER}"
LARAVEL_SAIL: 1
XDEBUG_MODE: "${SAIL_XDEBUG_MODE:-off}"
XDEBUG_CONFIG: "${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}"
IGNITION_LOCAL_SITES_PATH: "${PWD}"
volumes:
- ".:/var/www/html"
networks:
- sail
depends_on:
- mysql
mysql:
image: "mysql/mysql-server:8.0"
ports:
- "${FORWARD_DB_PORT:-3306}:3306"
environment:
MYSQL_ROOT_PASSWORD: "${DB_PASSWORD}"
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: "${DB_DATABASE}"
MYSQL_USER: "${DB_USERNAME}"
MYSQL_PASSWORD: "${DB_PASSWORD}"
MYSQL_ALLOW_EMPTY_PASSWORD: 1
MYSQL_EXTRA_OPTIONS: "${MYSQL_EXTRA_OPTIONS:-}"
volumes:
- "sail-mysql:/var/lib/mysql"
- "./vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh"
networks:
- sail
healthcheck:
test:
- CMD
- mysqladmin
- ping
- "-p${DB_PASSWORD}"
retries: 3
timeout: 5s
networks:
sail:
driver: bridge
volumes:
sail-mysql:
driver: local

View File

@ -23,8 +23,7 @@
<env name="BCRYPT_ROUNDS" value="4"/> <env name="BCRYPT_ROUNDS" value="4"/>
<env name="BROADCAST_CONNECTION" value="null"/> <env name="BROADCAST_CONNECTION" value="null"/>
<env name="CACHE_STORE" value="array"/> <env name="CACHE_STORE" value="array"/>
<env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value="testing"/>
<env name="DB_DATABASE" value=":memory:"/>
<env name="MAIL_MAILER" value="array"/> <env name="MAIL_MAILER" value="array"/>
<env name="QUEUE_CONNECTION" value="sync"/> <env name="QUEUE_CONNECTION" value="sync"/>
<env name="SESSION_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/>