feat: new ci/cd

This commit is contained in:
leon-morival 2025-11-30 16:44:40 +01:00
parent ccb616ac7f
commit fe7e4ae13f
3 changed files with 122 additions and 13 deletions

View File

@ -1,10 +1,12 @@
stages:
- test
- build
- deploy
variables:
DOCKER_DRIVER: overlay2
# 1⃣ Tests Laravel (SQLite en mémoire)
test:
stage: test
image: laravelsail/php84-composer
@ -24,7 +26,7 @@ test:
script:
- php artisan test
# 🐳 Build + push image dans le registry GitLab
# 2 Build + push image dans le registry GitLab
docker-build-push:
stage: build
image: docker:24
@ -50,3 +52,56 @@ docker-build-push:
only:
- main
# 3⃣ Déploiement : création / update de la stack Portainer via API
deploy-to-portainer:
stage: deploy
image: alpine:latest
needs:
- docker-build-push
only:
- main
before_script:
- apk add --no-cache curl jq gettext
script:
- echo "📦 Génération du docker-compose.rendered.yml avec les variables de prod..."
- envsubst < docker-compose.prod.yml > docker-compose.rendered.yml
- |
echo "🔍 Recherche de la stack '$PORTAINER_STACK_NAME' dans Portainer..."
STACKS_JSON=$(curl -s -H "X-API-Key: $PORTAINER_API_KEY" "$PORTAINER_URL/api/stacks")
STACK_ID=$(echo "$STACKS_JSON" | jq ".[] | select(.Name == \"$PORTAINER_STACK_NAME\") | .Id")
if [ -z "$STACK_ID" ]; then
echo "🆕 Aucune stack '$PORTAINER_STACK_NAME' trouvée, création en cours..."
curl -s -X POST "$PORTAINER_URL/api/stacks?type=2&method=string&endpointId=$PORTAINER_ENDPOINT_ID" \
-H "X-API-Key: $PORTAINER_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<EOF
{
"name": "$PORTAINER_STACK_NAME",
"stackFileContent": "$(cat docker-compose.rendered.yml | sed 's/"/\\"/g' | tr -d '\n')",
"prune": true
}
EOF
echo "✅ Stack créée."
else
echo "♻️ Stack '$PORTAINER_STACK_NAME' trouvée (ID=$STACK_ID), mise à jour..."
curl -s -X PUT "$PORTAINER_URL/api/stacks/$STACK_ID?endpointId=$PORTAINER_ENDPOINT_ID" \
-H "X-API-Key: $PORTAINER_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<EOF
{
"id": $STACK_ID,
"stackFileContent": "$(cat docker-compose.rendered.yml | sed 's/"/\\"/g' | tr -d '\n')",
"prune": true
}
EOF
echo "✅ Stack mise à jour."
fi

View File

@ -1,33 +1,34 @@
# -----------------------------
# Étape 1 : build (composer)
# -----------------------------
FROM laravelsail/php84-composer AS build
WORKDIR /var/www/html
# Copier le code
COPY . .
# On copie d'abord les fichiers composer pour profiter du cache Docker
COPY composer.json composer.lock ./
# Installer les dépendances PHP (prod)
# Installation des dépendances PHP en mode production
RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
# Si tu as du front (Vite), tu pourrais ajouter :
# RUN npm ci && npm run build
# On copie le reste du projet (code Laravel, config, etc.)
COPY . .
# -----------------------------
# Étape 2 : runtime
# Étape 2 : image runtime
# -----------------------------
FROM laravelsail/php84-composer
WORKDIR /var/www/html
# Copier les fichiers depuis létape build
# On récupère tout ce qui a été préparé dans l'étape build
COPY --from=build /var/www/html /var/www/html
# (Optionnel) Tu peux retirer les fichiers inutiles ici (tests, etc.)
# ⚠️ On désactive l'ENTRYPOINT de l'image de base
# On désactive l'ENTRYPOINT par défaut de l'image de base
ENTRYPOINT []
# Port HTTP exposé dans le container
# On expose le port HTTP du serveur Laravel
EXPOSE 80
# Lancer Laravel via php artisan serve
# Commande de démarrage : serveur Laravel
CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=80"]

53
docker-compose.prod.yml Normal file
View File

@ -0,0 +1,53 @@
services:
treasure-api:
image: registry.gitlab.com/treasure-hunt4/treasure-api:latest
restart: unless-stopped
depends_on:
- treasure-api-migrate
ports:
- "8000:80"
environment:
APP_ENV: production
APP_KEY: ${APP_KEY}
APP_DEBUG: "false"
DB_CONNECTION: mysql
DB_HOST: mysql
DB_PORT: 3306
DB_DATABASE: ${DB_DATABASE}
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
treasure-api-migrate:
image: registry.gitlab.com/treasure-hunt4/treasure-api:latest
restart: "no"
depends_on:
- mysql
environment:
APP_ENV: production
APP_KEY: ${APP_KEY}
DB_CONNECTION: mysql
DB_HOST: mysql
DB_PORT: 3306
DB_DATABASE: ${DB_DATABASE}
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
command: ["php", "artisan", "migrate", "--force", "--no-interaction"]
mysql:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql-data:/var/lib/mysql
ports:
- "3307:3306" # optionnel, juste si tu veux accéder à MySQL depuis l'extérieur
volumes:
mysql-data: