name: Build and Publish Docker Image on: push: branches: - main tags: - "v*" workflow_dispatch: env: REGISTRY: ${{ secrets.REGISTRY_URL }} NAMESPACE: ${{ secrets.REGISTRY_NAMESPACE }} jobs: # Une image publiee est une image deployable : rien ne part au registre sans # que la suite soit passee. Les tests golden se sautent d'eux-memes ici (le # corpus PDF n'est pas versionne), le reste de la suite tourne. test: name: Tests runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: "3.12" - name: Install uv uses: astral-sh/setup-uv@v5 - name: Install backend dependencies run: uv sync - name: Lint run: uv run ruff check . - name: Backend tests run: uv run pytest - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: "22" - name: Frontend tests working-directory: frontend run: | npm ci npm test build: name: Build App Image needs: [test] runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Log in to Docker Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.REGISTRY_USERNAME }} password: ${{ secrets.REGISTRY_PASSWORD }} - name: Extract metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/plesna-gerance tags: | type=ref,event=branch type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} type=raw,value=latest,enable={{is_default_branch}} labels: | org.opencontainers.image.title=Plesna Gerance org.opencontainers.image.description=Extracteur de comptes rendus de gerance Oralia/ICS (API + interface web) org.opencontainers.image.source=${{ gitea.server_url }}/${{ gitea.repository }} org.opencontainers.image.version=${{ gitea.ref_name }} # BuildKit intégré au démon Docker (docker build), pas de buildx : # le runner ne peut pas booter un builder docker-container (pull de # moby/buildkit qui échoue). `docker build`/`docker push` suffisent # pour une image linux/amd64 sur un seul registre. # Conteneur unique : l'image builde le frontend Vue puis le fait servir # par le backend FastAPI (cf. backend.Dockerfile). - name: Build image shell: bash env: TAGS: ${{ steps.meta.outputs.tags }} LABELS: ${{ steps.meta.outputs.labels }} run: | args=() while IFS= read -r tag; do [ -n "$tag" ] && args+=(-t "$tag") done <<< "$TAGS" while IFS= read -r label; do [ -n "$label" ] && args+=(--label "$label") done <<< "$LABELS" DOCKER_BUILDKIT=1 docker build -f backend.Dockerfile "${args[@]}" . - name: Push image shell: bash env: TAGS: ${{ steps.meta.outputs.tags }} run: | while IFS= read -r tag; do [ -n "$tag" ] && docker push "$tag" done <<< "$TAGS" summary: name: Build Summary runs-on: ubuntu-latest needs: [build] # Pas de `always()` : un resume qui annonce un succes apres un build rate # est pire que pas de resume du tout. steps: - name: Build summary run: | echo "## 🐳 Docker Image Built Successfully" echo "" echo "- Registry: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/plesna-gerance" echo "- Ref: ${{ gitea.ref_name }}" echo "" echo "### 🚀 Deployment" echo "Epingler la version dans .env (PLESNA_VERSION), puis :" echo "docker compose pull && docker compose up -d"