Aller au contenu

Publier votre premier paquet Maven/npm/PyPI

Ce que vous allez apprendre :

  • Comment configurer les identifiants de votre outil de build pour Repod
  • Comment publier un paquet avec le protocole natif que votre outil parle déjà (mvn deploy, npm publish, ou twine upload — aucun plugin spécifique à Repod)
  • Comment le résoudre à nouveau avec le même outil, prouvant qu'il s'agit d'un registre privé réel et fonctionnel

Durée : ~15 minutes Prérequis : Repod démarré en local (voir Démarrage rapide), l'un de : un JDK + Maven, Node.js + npm, ou Python + pip/twine. Choisissez l'onglet qui correspond à votre écosystème ci-dessous — les trois parcours sont indépendants, vous n'avez besoin d'en suivre qu'un seul.


Étape 1 — Obtenir des identifiants

Les trois formats s'authentifient avec votre compte Repod habituel (ou, pour la CI/CD, un token API — Paramètres → Tokens API, rôle uploader ou supérieur). Il n'y a pas d'étape d'enregistrement séparée : le dépôt/index/ espace de noms cible est créé automatiquement la première fois que vous y publiez.


Étape 2 — Configurer votre outil de build

Ajoutez un identifiant de serveur à ~/.m2/settings.xml. L'<id> doit correspondre à celui que vous référencerez depuis pom.xml à l'étape suivante.

~/.m2/settings.xml
<settings>
  <servers>
    <server>
      <id>repod-releases</id>
      <username>admin</username>
      <password>YourPassword1!</password>
    </server>
  </servers>
</settings>

Dépôts en simple HTTP

Maven bloque par défaut les dépôts externes en http:// depuis la version 3.8.1. Si votre instance Repod n'est pas encore derrière TLS, ajoutez une surcharge de mirror pour débloquer ce seul identifiant de dépôt — voir la note « Dépôts en simple HTTP » dans Configuration des clients.

Générez un token API (Paramètres → Tokens API, rôle uploader ou supérieur) — le flux interactif de npm login n'est pas pris en charge, vous collez donc un token pré-généré directement dans .npmrc, comme pour GitHub Packages ou Artifactory.

~/.npmrc ou ./.npmrc (local au projet)
registry=http://YOUR_HOST:8000/api/v1/npm/private/
//YOUR_HOST:8000/api/v1/npm/private/:_authToken=YOUR_API_TOKEN
~/.pypirc
[distutils]
index-servers = repod-private

[repod-private]
repository = http://YOUR_HOST:8000/api/v1/pypi/private/legacy/
username = admin
password = YourPassword1!

Étape 3 — Créer un paquet minimal

mkdir -p ~/hello-repod-maven/src/main/java/com/example
cd ~/hello-repod-maven

cat > src/main/java/com/example/Hello.java << 'EOF'
package com.example;

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello from Repod's Maven repository!");
    }
}
EOF

cat > pom.xml << 'EOF'
<project xmlns="http://maven.apache.org/POM/4.0.0">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>hello-repod-maven</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <distributionManagement>
    <repository>
      <id>repod-releases</id>
      <url>http://YOUR_HOST:8000/api/v1/maven/releases</url>
    </repository>
  </distributionManagement>
</project>
EOF

releases est le nom du dépôt Maven cible — il n'a pas besoin d'exister au préalable.

Les versions SNAPSHOT ne sont pas prises en charge en V1

Le support Maven de Repod rejette les versions SNAPSHOT avec une erreur claire. Utilisez une version de release, comme ci-dessus.

mkdir ~/hello-repod-npm && cd ~/hello-repod-npm
npm init -y

Modifiez le package.json généré pour qu'il ressemble à ceci (ajustez name s'il entre en collision avec quelque chose déjà publié dans cet espace de noms) :

package.json
{
  "name": "hello-repod-npm",
  "version": "1.0.0",
  "description": "A demo package for Repod",
  "main": "index.js"
}
echo 'console.log("Hello from Repod'"'"'s npm registry!");' > index.js
mkdir -p ~/hello-repod-pypi/hello_repod_pypi && cd ~/hello-repod-pypi

cat > hello_repod_pypi/__init__.py << 'EOF'
def hello():
    print("Hello from Repod's PyPI repository!")
EOF

cat > pyproject.toml << 'EOF'
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "hello-repod-pypi"
version = "1.0.0"
description = "A demo package for Repod"
EOF

pip install --upgrade build twine
python -m build

python -m build produit dist/hello_repod_pypi-1.0.0-py3-none-any.whl ainsi qu'une sdist .tar.gz correspondante.


Étape 4 — Publier

mvn deploy

Vous devriez voir un build Maven normal se terminer par :

[INFO] BUILD SUCCESS

Les sommes de contrôle (.sha1/.md5) et maven-metadata.xml sont régénérées côté serveur à partir de ce qui a réellement été stocké — tout ce que votre client a uploadé pour ces fichiers est accepté mais rejeté ensuite, jamais retenu tel quel.

npm publish

Sortie attendue :

npm notice
npm notice 📦  [email protected]
npm notice === Tarball Contents ===
...
+ [email protected]

twine upload --repository repod-private dist/*

Sortie attendue :

Uploading distributions to http://YOUR_HOST:8000/api/v1/pypi/private/legacy/
Uploading hello_repod_pypi-1.0.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ...
Uploading hello_repod_pypi-1.0.0.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ...

Chaque format exécute le même pipeline antivirus (ClamAV) + CVE (Grype) que celui utilisé pour les paquets .deb/.rpm/.apk avant d'être servable. Un paquet de démo propre et sans dépendance comme celui-ci passe en quelques secondes.

Et si une CVE est détectée ?

Une correspondance avec une politique review place l'artefact en stockage mais le garde invisible pour mvn/pip/npm jusqu'à ce qu'un maintainer ou un admin enregistre une décision — exactement la même file de revue que celle utilisée pour les paquets OS. Voir Parcourir une remédiation de CVE.


Étape 5 — Le résoudre à nouveau

Prouvez qu'il s'agit d'un registre réel et fonctionnel en récupérant votre propre paquet avec le même outil qui l'a publié.

cd /tmp && rm -rf resolve-test && mkdir resolve-test && cd resolve-test
mvn dependency:get -Dartifact=com.example:hello-repod-maven:1.0.0 \
  -DremoteRepositories=repod-releases::default::http://YOUR_HOST:8000/api/v1/maven/releases

La sortie attendue se termine par :

[INFO] BUILD SUCCESS

cd /tmp && rm -rf resolve-test && mkdir resolve-test && cd resolve-test
npm view hello-repod-npm --registry http://YOUR_HOST:8000/api/v1/npm/private/

La sortie attendue inclut :

[email protected] | ISC
dist
.tarball: http://YOUR_HOST:8000/api/v1/npm/private/hello-repod-npm/-/hello-repod-npm-1.0.0.tgz

cd /tmp && rm -rf resolve-test && python3 -m venv resolve-test && cd resolve-test
source bin/activate
pip install --index-url http://admin:YourPassword1!@YOUR_HOST:8000/api/v1/pypi/private/simple/ hello-repod-pypi
python -c "from hello_repod_pypi import hello; hello()"

Sortie attendue :

Hello from Repod's PyPI repository!


Résolution de problèmes

Maven : Return code is: 401

L'<id> dans le <distributionManagement> de pom.xml ne correspond pas à l'<id> de l'entrée <server> dans settings.xml, ou le mot de passe/token est incorrect.

Maven : le deploy échoue immédiatement avec une erreur liée à SNAPSHOT

Le support Maven de Repod n'accepte que les versions de release en V1. Changez <version> en quelque chose qui ne se termine pas par -SNAPSHOT.

npm : npm ERR! code E401

Vérifiez .npmrc — la ligne du token doit être scopée exactement à l'URL du registre (y compris le / final), sur une ligne commençant par //YOUR_HOST:8000/api/v1/npm/private/:_authToken=.

twine : 403 Forbidden

Soit les identifiants dans .pypirc sont incorrects, soit l'index private a été restreint par RBAC et le rôle de votre compte n'est pas autorisé. Vérifiez POST /api/v1/pypi/repositories/private/access.

L'upload a réussi, mais je ne peux pas le résoudre à nouveau — 404

Si le paquet a déclenché une CVE de politique review, il est stocké mais masqué de tous les points de terminaison de listing/téléchargement jusqu'à ce qu'une décision soit enregistrée. Vérifiez Sécurité → File de revue dans l'interface web.


Ce que vous venez de faire

  • Configuré settings.xml / .npmrc / .pypirc avec les identifiants Repod
  • Publié un paquet en utilisant le protocole natif propre à votre outil de build — aucun CLI ou plugin spécifique à Repod
  • Observé le même pipeline antivirus + CVE que celui utilisé pour les paquets OS s'exécuter contre lui
  • Résolu le paquet à nouveau avec le même outil, depuis un répertoire propre

Étapes suivantes