diff --git a/.forgejo/workflows/publish-docker.yml b/.forgejo/workflows/publish-docker.yml new file mode 100644 index 0000000..6706e7d --- /dev/null +++ b/.forgejo/workflows/publish-docker.yml @@ -0,0 +1,99 @@ +# Teste, puis build et publie l'image Docker sur le registre de conteneurs Forgejo : +# git.dev.kyuno.fr/kyuno/mediadrop +# +# - push sur `main` -> tags `latest` + `` +# - push d'un tag `vX.Y.Z` -> tags `X.Y.Z`, `X.Y`, `latest` +# - déclenchement manuel possible (Actions -> Run workflow) +# +# Prérequis côté instance : +# 1. Actions activé pour le dépôt : Settings -> Actions -> Enable. +# 2. Un runner enregistré avec le label `ubuntu-latest` +# (sinon adapter les `runs-on:` ci-dessous). +# 3. Le runner doit pouvoir lancer `docker` dans les jobs conteneurisés : +# monter le socket de l'hôte dans la config du runner (`config.yaml`) — +# container: +# options: -v /var/run/docker.sock:/var/run/docker.sock +# puis redémarrer le runner. (Ou utiliser un runner « host » avec Docker.) +# 4. Le runner doit joindre git.dev.kyuno.fr et github.com (actions/checkout). +# 5. Registre : le jeton automatique `secrets.GITHUB_TOKEN` peut pousser des +# paquets pour l'organisation `kyuno`. Si ce n'est pas le cas, créer un +# secret de dépôt `REGISTRY_TOKEN` (jeton d'accès avec la permission +# « write:package ») et remplacer `secrets.GITHUB_TOKEN` plus bas. + +name: Publier l'image Docker + +on: + push: + branches: [main] + tags: ['v*'] + workflow_dispatch: + +permissions: + contents: read + packages: write + +env: + REGISTRY: git.dev.kyuno.fr + IMAGE: git.dev.kyuno.fr/${{ github.repository_owner }}/mediadrop + +jobs: + test: + runs-on: ubuntu-latest + container: + image: node:22-bookworm + steps: + - uses: https://github.com/actions/checkout@v4 + - run: npm ci + - run: npm run lint + - run: npm run typecheck + - run: npm test + + publish: + needs: test + runs-on: ubuntu-latest + container: + image: docker:27-cli + steps: + - name: Outils + run: apk add --no-cache git + + - uses: https://github.com/actions/checkout@v4 + + - name: Calculer les tags + id: tags + run: | + set -eu + if [ "${{ github.ref_type }}" = "tag" ]; then + v="${{ github.ref_name }}" + v="${v#v}" + list="${IMAGE}:${v} ${IMAGE}:${v%.*} ${IMAGE}:latest" + else + short="$(echo "${{ github.sha }}" | cut -c1-12)" + list="${IMAGE}:latest ${IMAGE}:${short}" + fi + echo "list=${list}" >> "$GITHUB_OUTPUT" + echo "Tags : ${list}" + + - name: Connexion au registre + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login "$REGISTRY" -u "${{ github.actor }}" --password-stdin + + - name: Build + run: | + set -eu + args="" + for t in ${{ steps.tags.outputs.list }}; do args="$args -t $t"; done + # shellcheck disable=SC2086 + docker build $args \ + --label "org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}" \ + --label "org.opencontainers.image.revision=${{ github.sha }}" \ + --label "org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + . + + - name: Push + run: | + set -eu + for t in ${{ steps.tags.outputs.list }}; do docker push "$t"; done + + - name: Déconnexion + if: always() + run: docker logout "$REGISTRY" diff --git a/README.md b/README.md index 9189371..6ee048a 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,18 @@ conteneur s'arrête (d'où `restart: unless-stopped`). Le `HEALTHCHECK` interrog `GET /health` sur le port `3000` — garder `port: 3000` dans `config.json` et remapper côté hôte si besoin. +### Intégration continue + +[`.forgejo/workflows/publish-docker.yml`](.forgejo/workflows/publish-docker.yml) +teste puis publie l'image sur le registre Forgejo `git.dev.kyuno.fr/kyuno/mediadrop` : + +- push sur `main` → `latest` + `` +- push d'un tag `vX.Y.Z` → `X.Y.Z`, `X.Y`, `latest` + +Prérequis (détaillés en tête du fichier) : Actions activé pour le dépôt, un +runner `ubuntu-latest` avec accès à un démon Docker (socket monté), et un jeton +pouvant écrire les paquets de l'organisation. + ## Endpoints | Route | Auth | Rôle | @@ -208,6 +220,7 @@ config.example.json modèle de configuration (à copier en config.json) config.schema.json schéma JSON (validation / autocomplétion éditeur) Dockerfile image multi-stage (deps / build / runtime non-root) compose.yaml déploiement Docker Compose (config + /data montés) +.forgejo/workflows/ CI : test puis publication de l'image (registre Forgejo) src/ index.ts entrée : config -> app -> écoute + arrêt propre app.ts construction de l'instance Fastify (exportée pour les tests)