Haga que todos sus paquetes privados sean accesibles en un solo lugar
con este índice PYPI alojado en Github
Descripción • ¡Pruébelo! • Comience • Modificar paquetes indexados • Preguntas frecuentes • Una palabra sobre ataques de la cadena de suministro • Contribuir • Referencias
Este repositorio es una página de GitHub utilizada como índice PYPI, conforma con PEP503.
Puede usarlo para agrupar todos sus paquetes en un solo lugar y acceder a él fácilmente a través de pip , ¡casi como cualquier otro paquete disponible públicamente!
Si bien el índice PYPI es público, los paquetes privados indexados aquí se mantienen privados: necesitará autenticación GitHub para poder recuperarlo.
Visite astariul.github.io/github-hosted-pypi/ ¡e intente instalar paquetes indexados allí!
Intente instalar el paquete public-hello :
pip install public-hello --extra-index-url https://astariul.github.io/github-hosted-pypi/ También instalará el paquete mydependency , ¡automáticamente!
Pruébalo con:
from public_hello import hi
print ( hi ())También puede instalar una versión específica:
pip install public-hello==0.1 --extra-index-url https://astariul.github.io/github-hosted-pypi/ Ahora intente instalar el paquete private-hello :
pip install private-hello --extra-index-url https://astariul.github.io/github-hosted-pypi/¡No funcionará, porque es privado y solo yo puede acceder a él!
Settings de su repositorio y habilite la página de GitHubindex.html y pkg_template.html a su gusto<user>.github.io/<repo_name> para ver su índice PYPI Ahora que su índice PYPI está configurado, puede registrar / actualizar / eliminar paquetes indexados.
Las acciones de GitHub están configuradas para hacerlo automáticamente para usted.
Solo tienes que:
Actions de su repositorioregister / update / delete ) y activarlo manualmente Como sabrá, pip puede instalar el paquete alojado en GitHub si se da en el formulario pip install git+<repo_link> . Este índice PYPI es solo un índice de enlaces a otro repositorio de GitHub.
Las páginas de Github son públicas, por lo que este índice PYPI es público. Pero solo contiene enlaces a otros repositorios de GitHub, ¡ningún código está alojado en este índice PYPI!
Si el código de alojamiento del repositorio es privado, deberá autenticarse con GitHub para poder clonarlo, haciéndolo efectivamente privado.
Si se pregunta más específicamente sobre los ataques de la cadena de suministro, ¡revise la sección al respecto!
Al ejecutar pip install <package_name> --extra-index-url https://astariul.github.io/github-hosted-pypi/ , lo siguiente sucede:
pip analizará https://pypi.org/ , el índice público predeterminado, intentando encontrar un paquete con el nombre especificado.https://astariul.github.io/github-hosted-pypi/ .pip ( git+<repo_link>@<tag> ).pip entiende que es un repositorio de GitHub y clonará el repositorio (en la etiqueta específica) localmente.pip instale el paquete.pip instale cualquier dependencia faltante con los mismos pasos.La autenticación ocurre en el paso 4, al clonar el repositorio.
La mejor práctica única es usar lanzamientos de GitHub. Esto permite que su paquete tenga una versión referida por una etiqueta específica.
Para hacer esto:
pip install git+<repo_link>@<tag>git+<repo_link>@<tag> ). Puede especificar un nombre diferente para su paquete indexado. Solo dale un nombre diferente en el formulario al registrarlo.
Por ejemplo, si tiene un paquete privado llamado tensorflow , cuando lo registra en este índice, puede nombrarlo my_cool_tensorflow , por lo que no hay nombre de nombre con el paquete público tensorflow .
Luego puede instalarlo con pip install my_cool_tensorflow --extra-index-url https://astariul.github.io/github-hosted-pypi/ .
Luego de python , puedes hacer:
import tensorflow¡Pero ten cuidado con esto! Si bien es posible manejarlo así, siempre es mejor tener un nombre único para su paquete, para evitar confusiones, ¡pero también para la seguridad!
Construir una imagen de Docker no es interactivo, por lo que no hay un aviso para escribir el nombre de usuario y la contraseña.
En su lugar, debe colocar sus credenciales de GitHub en un archivo .netrc , por lo que pip puede autenticarse al clonarse desde GitHub.
Para hacer esto de forma segura en Docker, debe usar Docker Secrets. Aquí hay un tutorial rápido sobre cómo hacer:
Paso 1 : Guarde sus credenciales en un archivo secreto. Siga este ejemplo:
machine github.com
login <gh_user>
password <gh_pass>
n .
¡Tan cuidado si está utilizando un IDE que reemplace las pestañas por espacios o si está en Windows (donde las finales de línea están rn )!
Nombremos este archivo gh_auth.txt .
Paso 2 : cree su archivo Docker. En el archivo Docker, debe montar el archivo secreto en .netrc y ejecutar el comando donde necesita autenticación. Por ejemplo :
# syntax=docker/dockerfile:experimental
FROM python:3
RUN --mount=type=secret,id=gh_auth,dst=/root/.netrc pip install <package_name> --extra-index-url https://astariul.github.io/github-hosted-pypi/Paso 3 : Construya su imagen Docker, especificando la ubicación del secreto creado en el Paso 1:
sudo DOCKER_BUILDKIT=1 docker build --secret id=gh_auth,src=./gh_auth.txt .
Si tiene alguna pregunta o idea para mejorar estas preguntas frecuentes, ¡abra un problema de PR / en blanco!
Como vio anteriormente, este índice PYPI alojado en GitHub se basa en la función pip --extra-index-url . Debido a cómo funciona esta característica, es vulnerable a los ataques de la cadena de suministro.
Por ejemplo, supongamos que tiene un paquete llamado fbi_package versión 2.8.3 alojado en su índice PYPI privado.
Un atacante podría crear un paquete malicioso con el mismo nombre y una versión más alta (por ejemplo 99.0.0 ).
Cuando ejecuta pip install fbi_package --extra-index-url my_pypi_index.com , debajo del capó pip descargará la última versión del paquete, ¡que es el paquete malicioso!
Si bien este repositorio hace que sea muy conveniente tener su propio índice PYPI, tenga en cuenta que la página es pública, por lo tanto, cualquiera puede ver qué nombre de paquete está utilizando y crear un paquete malicioso con este mismo nombre ...
Es por eso que incluimos cheques automatizados en este índice PYPI privado. Cada vez que accede a la página de su paquete, se llama a la API PYPI, y si se encuentra un paquete con el mismo nombre y una versión más alta, el comando de instalación se reemplaza con una advertencia.
Puede ver una demostración de tal advertencia en https://astariul.github.io/github-hosted-pypi/transformers/.
Si ve esta advertencia, ¡no instale el paquete! En su lugar, cambie el nombre de su paquete o actualice la versión sobre su contraparte pública.
¡Ten cuidado!
¡Los problemas y las relaciones públicas son bienvenidos!
Si te encuentras con algo extraño / que se pueda mejorar, ¡póngase en contacto!
Esto está muy inspirado en este repositorio.
Es solo una versión glorificada, con páginas más limpias y acciones de GitHub para agregar, actualizar y eliminar los paquetes de su índice.
¡También consulte el blog del autor original!
El icono utilizado en la página fue realizado por Freepik de Flaticon