Acertadamente. C贸mo organizar el control de los paquetes desde repositorios externos y delegar el control a los equipos de productos





Hoy en d铆a, muchas empresas operan sin la capacidad de controlar directamente la composici贸n de los paquetes en repositorios externos, incluso si utilizan duplicaci贸n, proxy y almacenamiento en cach茅. Esto lleva al hecho de que el entorno de ejecuci贸n cambia constantemente, en particular, la composici贸n de las im谩genes de la ventana acoplable cambia con m谩s frecuencia de lo que requiere la producci贸n.



Hay situaciones en las que cambios no deseados contenidos en dependencias externas pueden afectar la composici贸n del producto que se est谩 desarrollando. Esto es especialmente cierto durante la certificaci贸n de productos. Como resultado, retrasos en la certificaci贸n, pruebas nocturnas y fallas en las pruebas de integraci贸n, fallas en la producci贸n local (un entorno de producci贸n ubicado en los recursos propios de la organizaci贸n) cuando se lanza una revisi贸n, etc. En un nuevo art铆culo, describimos un enfoque para evitar tales problemas.



Lo que quer铆amos lograr



Antes de comenzar a describir el enfoque, unas palabras sobre las tareas que quer铆amos resolver:



  • Obtenga un control total sobre la composici贸n de los paquetes externos en el lanzamiento (previsibilidad).
  • Corrija las composiciones de los repositorios externos para la implementaci贸n r谩pida de revisiones con un m铆nimo de pruebas adicionales (velocidad).
  • Proporcione soportes de control de calidad de productos con un entorno fijo, predecible y repetible (repetibilidad).
  • Independencia de la presencia de un canal de comunicaci贸n externo (autonom铆a).
  • Cambio instant谩neo a repositorios oficiales en caso de falla (tolerancia a fallas).
  • Validaci贸n garantizada de claves para repositorios externos en ensambles pipelines (confianza).
  • Y lo m谩s importante, transferir la gesti贸n y el control de la composici贸n de los paquetes externos a las manos de los equipos de productos y los gestores de versiones (autogesti贸n).


An谩lisis del ciclo de vida de la creaci贸n de funciones



Nuestro enfoque resuelve el problema de arreglar la composici贸n de repositorios externos para una fecha espec铆fica, para un lanzamiento o una caracter铆stica. El siguiente diagrama ilustra la gesti贸n de la versi贸n, la creaci贸n de funciones y el ciclo de vida de la revisi贸n.



Tomemos el repositorio condicional Debian Stretch como ejemplo. Este enfoque es aplicable a los repositorios de Docker, SaltStack, etc. Se registraron tres cortes en la l铆nea de tiempo para las fechas T1, T2 y T3.





T1 T2 T3
tramo 20200305 20200420 20200615
Caracter铆stica1 20200304 20200304 20200501
Feature2 20200304 20200304 20200601
Feature3 20200301 20200406 20200406


Hemos tabulado el contenido del repositorio externo de Debian Stretch para construir las distribuciones Feature1, Feature2 y Feature3. En la tabla puede ver que la composici贸n del repositorio externo est谩 controlada por cada rama de forma independiente. Hemos llegado a un acuerdo para nosotros mismos para asignar la rama maestra para Debian Stretch diariamente y etiquetar cada segmento en formato AAAAMMDD, por ejemplo, 2020304 para el segmento del 4 de marzo de 2020. La tabla resume las instant谩neas del repositorio externo utilizado para la distribuci贸n en cada rama en tres momentos diferentes y la composici贸n en el asistente para Debian Stretch. El equipo de cada funci贸n o de cada versi贸n actualiza la composici贸n de los repositorios externos a su discreci贸n y de acuerdo con su ciclo de desarrollo.



Utilizando Feature1 como ejemplo: el equipo de producto comienza a desarrollar una nueva funci贸n y corrige la composici贸n del repositorio externo en los archivos de configuraci贸n a partir de la fecha 20200228 (consulte el diagrama anterior).



Cambiar a 20200228

deb http://repository.co/debian-stretch-20200228 stretch main contrib non-free



Durante el desarrollo, debido a la aparici贸n de nuevos paquetes, es necesario actualizar la base de datos de paquetes a la fecha 20200304. Cambiar el repositorio de trabajo a la fecha deseada.



Cambiar a 20200304

deb http://repository.co/debian-stretch-20200304 stretch main contrib non-free



A continuaci贸n, otro cambio de la base del paquete tiene lugar en la fecha 20200501.



Cambiar a 20200501

deb http://repository.co/debian-stretch-20200501 stretch main contrib non-free



Si ahora dibujamos segmentos de tiempo, veremos que en los momentos T1 y T2 el desarrollo de Feature1 est谩 en la base del paquete, "congelado" el 4 de marzo de 2020. Y en el corte T3, el desarrollo ya est谩 en marcha en una nueva base de paquetes para el 1 de mayo de 2020.



Gesti贸n de dependencias de m煤ltiples versiones de productos



Ahora veamos la gesti贸n de dependencias para varias versiones de productos activos. Hay tres versiones de soporte, 2.5, 2.6 y 2.7.



En la tabla, vemos la correspondencia de lanzamientos y fechas para las que se realiz贸 la instant谩nea del repositorio. Muestra qu茅 instant谩nea de la composici贸n del repositorio externo se utiliz贸 para crear una versi贸n espec铆fica de la distribuci贸n.





Lanzamiento Composici贸n
2.5.128, 2.5.135, 2.5.207 20200301
2.6.201, 2.6.215, 2.6.315 20200301
2.7.210, 2.7.217, 2.7.305 20200404


En lugar de nombrar segmentos por fechas AAAAMMDD, tambi茅n usamos nombres de etiquetas en el formato <ProjectName.ReleaseVersion> (release_name.release_version del producto, por ejemplo name.2.2) o <ProjectName-FeatureNumber> (agregue un n煤mero de funci贸n, por ejemplo 3).



Instant谩nea para 2.5 a partir de 20200301

deb http://repository.co/debian-stretch-projectname-2.5 stretch main contrib non-free # 20200301



Por lo tanto, durante el desarrollo de la versi贸n 2.5, el equipo corrige la composici贸n de los repositorios dependientes a partir de 20200301. En alg煤n momento de abril, el equipo inicia una nueva versi贸n 2.6 y decide utilizar la composici贸n de los paquetes de repositorios externos de la 2.5. Cree una nueva instant谩nea 2.6 a partir de la instant谩nea 2.5. En el futuro, los repositorios para las versiones 2.5 y 2.6 podr铆an divergir f谩cilmente. Hemos creado nuestra etiqueta debian-stretch-projectname-2.6 para 2.6.



Instant谩nea para 2.6 a partir de 20200301

deb http://repository.co/debian-stretch-projectname-2.6 stretch main contrib non-free # 20200301



En el caso de la versi贸n 2.7, el equipo puede comenzar el desarrollo desde la rama maestra, una instant谩nea diaria del repositorio original.



Instant谩nea para 2.7 a partir de 20200404

deb http://repository.co/debian-stretch-projectname-2.7 stretch main contrib non-free # 20200404



Gesti贸n de la dependencia de varios productos



Veamos la gesti贸n de la dependencia de varios productos utilizando el ejemplo de dos productos con diferentes ciclos de lanzamiento y sus propios equipos de productos: Stealth e Infiniti.







Comentemos en la mesa qu茅 pasa y cu谩ndo.

Producto Lanzamiento Composici贸n
sigilo2.2 r2.2.124 20200301
sigilo2.2 r2.2.131, r2.2.162 20200305
infiniti4.0 r4.0.235, r4.0.241 20200303
infiniti4.0 r4.0.250 20200308


1. Que el desarrollo de la versi贸n 2.2 del proyecto Stealth comience el 1 de marzo de 2020, para ello se cre贸 una instant谩nea de la composici贸n de la base de datos del paquete para la fecha actual. El lanzamiento de la versi贸n 2.2.124 se realiza con la base del paquete del repositorio externo de 20200301.



Stealth 2.2

deb http://repository.co/debian-stretch-stealth-2.2 stretch main contrib non-free # 20200301



2. En el quinto d铆a, la base del paquete se actualiza. El repositorio de trabajo debian-stretch-stealth-2.2 cambia instant谩neamente a la fecha deseada, el lanzamiento de las versiones 2.2.131 y 2.2.162 se realiza con los paquetes del repositorio externo de 20200305. Sin manipulaciones adicionales en el entorno, todos los 100500 microservicios del producto recibieron inmediatamente un nuevo entorno en el proceso de ensamblaje 20200305 ...



Sigilo 2.2

deb http://repository.co/debian-stretch-stealth-2.2 stretch main contrib non-free # 20200305



3. Paralelamente al tercer d铆a, se inicia el desarrollo del proyecto Infiniti versi贸n 4.0 y se crea una porci贸n del repositorio para la fecha 20200303. Las versiones 4.0.235 y 4.0.241 se lanzan con los paquetes del repositorio externo para 20200303.



Infiniti 4.0

deb http://repository.co/debian-stretch-infiniti-4.0 stretch main contrib non-free # 20200303



4. Despu茅s del lanzamiento de la versi贸n 4.0.241, el equipo decide actualizar la composici贸n del repositorio a 20200308 y lanzar una nueva versi贸n con una nueva composici贸n de paquetes externos. La versi贸n 4.0.250 est谩 disponible con paquetes para 20200308.



Infiniti 4.0

deb http://repository.co/debian-stretch-infiniti-4.0 stretch main contrib non-free # 20200308



Dos opciones para cambiar entre los estados de los repositorios le permiten elegir un enfoque que sea conveniente para el proceso de desarrollo. En el primer caso, cambiamos al estado deseado especificando una instant谩nea de los repositorios en una fecha espec铆fica. En el segundo caso, para productos multicomponente, usamos un segmento con nombre y lo movemos a la fecha deseada. Este mecanismo proporciona una conmutaci贸n de corte 煤nica en todos los componentes del producto 100500.



Gestionamos los cortes de cada repositorio externo en un contenedor Docker separado, por lo que en cualquier momento podemos cambiar un repositorio espec铆fico para descargar de la red externa en caso de alg煤n accidente.



Descarga una lista de todos los repositorios



# For example
curl repository.co/info/sources.list | grep $(lsb_release -cs) > /etc/apt/sources.list


Creaci贸n autom谩tica de porciones de repositorios externos



Los repositorios se actualizan todas las noches de acuerdo con el programador de GitLab. Cuando se agrega un nuevo repositorio, los cambios se aplican autom谩ticamente al servidor.







En el momento de hacer commit de una nueva porci贸n del repositorio externo se comprueba su certificado, si difiere del que guardamos con nosotros, entonces no se realiza la actualizaci贸n y recibimos un mensaje de error.



Salir



  1. Preparar una nueva versi贸n de un kit de distribuci贸n para la certificaci贸n ya no es un dolor de cabeza. Durante el per铆odo de certificaci贸n, arreglamos la composici贸n de la distribuci贸n y, si necesita arreglar algo r谩pidamente, es muy probable que no haya errores en la revisi贸n publicada debido a cambios en el entorno.
  2. Todas las compilaciones de funciones obtienen el estado administrado de los repositorios externos.
  3. La implementaci贸n de revisiones y la verificaci贸n a trav茅s de QA se aceleran con un resultado predecible, r谩pido y exitoso.
  4. Feature- , .
  5. .


Tenga en cuenta que Debian tiene un recurso oficial snapshot.debian.org con instant谩neas diarias y grandes profundidades de almacenamiento. Esto es suficiente para determinadas tareas.



Gracias a Sergey Smirnov y la comunidad por una excelente herramienta para administrar la composici贸n de los repositorios externos de Aptly. De nosotros: una peque帽a contribuci贸n a las mejores pr谩cticas de uso de esta 煤til herramienta en transportadores de producci贸n.



En los pr贸ximos art铆culos hablaremos sobre el paquete Aptly + Simple-CDD para la preparaci贸n de im谩genes ISO de distribuciones, delegando la gesti贸n de dependencias externas a equipos de producto y los problemas de utilizar Aptly en el proceso de gesti贸n de dependencias externas.



Autores : Nikita Drachev , Alexander Pazdnikov , Timur Gilmullin



All Articles