Implementación automatizada y actualización de software basado en Python con pip

Tenemos un número relativamente grande de máquinas en un clúster que ejecuta un determinado software basado en Python para el cálculo en un entorno de investigación académica. Para mantener actualizada la base de códigos, estamos utilizando un server de compilation que hace que la base de código actual esté disponible en un directory cada vez que actualizamos una label de implementación dedicada en nuestro server Mercurial. Cada parte de la máquina del clúster ejecuta una secuencia de commands rsync diaria que solo se sincroniza con el directory de implementación en el server de compilation (si hay algo que sincronizar) y reinicia el process si se actualiza la base de códigos.

Ahora este enfoque me parece un poco anticuado y un poco exagerado, y me gustaría optimizarlo de la siguiente manera:

  • Deshágase del server de compilation, ya que todo lo que hace es clonar la última base de código que tiene una label determinada adjunta: en realidad, no comstack ni realiza comprobaciones adicionales (como testings) en la base de códigos. Esto también networkinguciría algo de dolor para nosotros, ya que sería un server less para mantener y preocuparse.
  • Instalado de tener el server de compilation, me gustaría get directamente de nuestro server Mercurial que ya aloja el código. Esto networkinguciría la necesidad de duplicar la base de código cada vez que actualicemos la label de deployment.

Ahora he leído un poco sobre cómo instalar / implementar software basado en Python con pip (por ejemplo, ¿Cómo apuntar pip en una twig de Mercurial? ). Parece ser la elección correcta, ya que admite la installation de packages directamente desde un depósito de código. Sin embargo, me encontré con algunos problemas con los que necesitaría ayuda. Los requisitos que tengo son los siguientes:

  • Usa Mercurial como fuente.
  • Proceso de background automatizado para actualizar e instalar en un directory personalizado en el sistema de files.
  • Solo extraiga y actualice desde el repository si hay una nueva versión disponible.

El siguiente command parece hacer casi lo que necesito:

 pip install -e hg+https://authkey:anypw@mymercurialserver.hostname.com/Code/package@deployment#egg=package --upgrade --src ~/proj 

Extrae el package del server de Mercurial, selecciona la base de código con la label "implementación" y lo instala en el proj dentro del directory de inicio del usuario.

El problema, sin embargo, es que independientemente de si hay una actualización disponible o no, pip siempre desinstala el package y lo reinstala. Esto hace que sea difícil decidir si el process debe reiniciarse o no si nada realmente cambió. Además, pip siempre se queda con el post de que hg clone in ./proj/yarely exists with URL... y me pregunta: What to do? (s)witch, (i)gnore, (w)ipe, (b)ackup What to do? (s)witch, (i)gnore, (w)ipe, (b)ackup . Ahora bien, esto no es ideal, ya que (1) sería un process automatizado sin request del usuario, y (2) solo debería extraer el repository si hubiera una actualización para networkingucir el tráfico en la networking y no sobrecargar nuestro Servidor Mercurial. Creo que en este caso, un pull lugar de clone si hubiera una copy local del repository ya sería más apropiado y posiblemente resolvería el problema.

No pude encontrar una solución elegante y agradable para este problema. ¿Alguien tiene un puntero o sugerencia de cómo se puede lograr esto?