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, outwine 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.
<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.
É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.
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) :
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¶
Vous devriez voir un build Maven normal se terminer par :
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.
Sortie attendue :
npm notice
npm notice 📦 [email protected]
npm notice === Tarball Contents ===
...
+ [email protected]
Sortie attendue :
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 :
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
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/.pypircavec 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¶
- Configuration des clients (référence complète) → — Gradle,
espaces de noms npm scopés, repli
--extra-index-urlvers PyPI public, contrôle d'accès pour les trois formats - Parcourir une remédiation de CVE →
- Mettre en place la publication CI/CD →