Lo que FerrisGit hace hoy

Todo lo que aparece en esta página existe hoy. Lo que está previsto figura en la hoja de ruta.

Por ahora, la interfaz de la aplicación y su documentación están en francés.

Repositorios y grupos

Aloja código bajo tu cuenta o dentro de una jerarquía de grupos, y decide quién puede hacer qué.

  • Repositorios de un usuario, o anidados en grupos y subgrupos
  • Públicos o privados; la descripción y la visibilidad se pueden cambiar después
  • Roles Lector, Colaborador y Mantenedor, por repositorio o por grupo
  • Git sobre HTTP(S): clone, fetch y push con tu nombre de usuario y un token de acceso personal
  • Estrellas de los repositorios y estadísticas de lenguajes

Solicitudes de fusión

La revisión se hace sobre el diff, y toda la conversación queda en un solo lugar.

  • Comentarios en línea en hilos
  • Sugerencias de código que se aplican desde la interfaz
  • Aprobaciones y solicitudes de cambios
  • Detección de conflictos
  • Una cronología de todo lo ocurrido

Incidencias

Sigue el trabajo junto al código.

  • Etiquetas e hitos
  • Responsables
  • Un tablero kanban con cuatro estados

CI/CD

Un motor integrado, configurado por un archivo del repositorio.

  • Pipelines descritos en .ferrisgit-ci.yml, en la raíz del repositorio
  • Runners de Docker (un pequeño binario ferrisgit-runner que consulta al servidor) o Kubernetes, donde cada job se ejecuta como un Pod
  • Variables por repositorio, cifradas en reposo (solo runners de Docker)
  • Cachés por job (solo Kubernetes)
.ferrisgit-ci.yml
stages: [lint, test]

jobs:
  format:
    stage: lint
    image: rust:1
    script:
      - rustup component add rustfmt
      - cargo fmt --all -- --check

  clippy:
    stage: lint
    image: rust:1
    script:
      - rustup component add clippy
      - cargo clippy --all-targets -- -D warnings

  test:
    stage: test
    image: rust:1
    needs: [format, clippy]
    script:
      - cargo test --all-targets

Páginas públicas y búsqueda

Abre un proyecto a quien no tiene cuenta.

  • Los visitantes exploran los repositorios públicos en solo lectura: catálogo, README, archivos, commits y releases
  • Los archivos de las releases se descargan sin iniciar sesión
  • Los usuarios con sesión disponen de búsqueda, notificaciones en la aplicación y un panel personal

Documentación

Integrada en la aplicación, en la dirección /docs.

  • Abierta a todos, con o sin sesión
  • Una guía de usuario, la referencia de CI/CD, la administración y el autoalojamiento, y la referencia de la API REST
  • En francés, con búsqueda

Cómo está hecho

La misma instancia que en la página de inicio. Los números abren las pestañas y secciones correspondientes.

Arquitectura de una instancia de FerrisGitDibujo isométrico. Un cliente Git y un navegador hablan con un solo binario Rust, ferrisgit-api, formado por los crates api, application, domain e infrastructure. El binario guarda sus datos en PostgreSQL y en repositorios Git en disco, y ejecuta los trabajos de las pipelines con un ferrisgit-runner en un host Docker o como Pods en un clúster Kubernetes. Una línea naranja sigue un push hasta sus trabajos. Siete círculos numerados llevan a los bloques de la página.api application domain infrastructure ferrisgit-runner ferrisgit-api: un solo binario ferrisgit-runner Cliente Git HTTPS, usuario + token aún sin SSH Navegador con sesión, o anónimo en las páginas públicas api API REST, Git sobre HTTP, interfaz web domain entidades y puertos, sin E/S application casos de uso infrastructure adaptadores: PostgreSQL, git, Docker, Kubernetes, SMTP, webhooks PostgreSQL cuentas, incidencias, pipelines; las migraciones se aplican al arrancar Repositorios Git en disco, wikis incluidas Host Docker el runner consulta cada 5 s por defecto, un job a la vez, en un contenedor Clúster Kubernetes un Pod por job, creado por el servidor git push pipeline creado jobs consulta jobs

Fig. 1 Una instancia. La línea naranja sigue un push desde el cliente hasta los trabajos que arranca.

  • petición o almacenamiento
  • un push, hasta sus trabajos
  • el runner consulta
  • un bloque numerado de esta página

Wikis, webhooks, cuentas y despliegue

Cuentas y administración

La autenticación multifactor no es opcional.

  • Obligatoria para todas las cuentas: aplicaciones de autenticación (TOTP), passkeys (WebAuthn) y códigos de respaldo de un solo uso
  • Registro libre tras un interruptor del administrador, o cuentas creadas por invitación por correo electrónico
  • Administración: usuarios e invitaciones, ajustes de la instancia, métricas de uso y una página de estado

Webhooks

Avisa a otras herramientas cuando ocurre algo.

  • Peticiones firmadas (HMAC-SHA256) para los eventos de solicitudes de fusión, colaboradores, pipelines e incidencias
  • Secretos cifrados en reposo
  • Todavía no hay reintentos ni registro de envíos: ambos figuran en la hoja de ruta

Wikis y releases

La documentación y los entregables se quedan con el código.

  • Cada wiki se guarda en un repositorio Git propio
  • Las releases llevan archivos adjuntos

Bajo el capó

Lo que despliegas y lo que necesita.

  • Un único binario de Rust (axum) sirve la API REST, el protocolo Git y la aplicación web Angular
  • PostgreSQL 18 para los datos; el contenido de los repositorios en el disco del servidor
  • Docker Compose o un chart de Helm para Kubernetes; imagen masmarino/ferrisgit
  • Una arquitectura hexagonal, repartida en cinco crates de Cargo

Lo que (todavía) no existe

Todo esto figura en la hoja de ruta. Nada de esto existe hoy.

  • Git sobre SSH y claves de despliegue: Git solo se sirve sobre HTTP(S)
  • Ramas protegidas: un Colaborador puede hacer push a cualquier rama del repositorio
  • Análisis de la calidad del código y análisis de seguridad, también en las solicitudes de fusión
  • Forks y solicitudes de fusión entre repositorios, fusiones con squash y rebase
  • Inicio de sesión único (OIDC, LDAP)
  • Una interfaz en inglés, italiano, español y alemán y un ajuste de tema: hoy está en francés y sigue el tema del sistema
  • Un vínculo con ArtiFerris
Ver la hoja de ruta

Pruébalo y luego monta el tuyo.

La instancia pública muestra el producto. Tu instancia guarda tu código.