Suelte el tren. Informe Yandex

Los procesos de lanzamiento en diferentes equipos de Yandex (y en cualquier gran empresa de TI) se organizan de manera similar, pero difieren en muchos detalles. Los desarrolladores m贸viles tienen sus propios detalles: sus lanzamientos se ven afectados por el orden de dise帽o en la App Store y Google Play. Desarrollador de Android Dmitry PolyakovDmpolyakov Habl贸 sobre los procesos a su alrededor: c贸mo su equipo env铆a un tren de lanzamiento en un horario, c贸mo lanzar lanzamientos no programados, agregar trailers a un lanzamiento ya dejado y qu茅 hacer para mantenerse en el camino.


- Hola a todos, soy Dmitry Polyakov, desarrollador de Android de la aplicaci贸n m贸vil que tomo.



Ahora en dos equipos: desarrollo de Android e iOS, 13 personas cada uno. Esto nos permite hacer muchas tareas geniales en paralelo y transferirlas r谩pidamente a los usuarios. En el informe contar茅 c贸mo aprendimos a trabajar con git y vivir en un repositorio.

A continuaci贸n, te dir茅 c贸mo funciona nuestro ciclo de lanzamiento. Los gerentes se acercan a nosotros y nos dicen que queremos implementar esta funci贸n lo antes posible. Entonces, probablemente, cualquier gerente lo desee, as铆 que configuramos el proceso de lanzamiento para que vayamos a la App Store y Google Play todas las semanas. Tambi茅n hablar茅 sobre las herramientas que tenemos y que le recomendar铆a que pruebe, son geniales.

Flujo git


Comencemos con Git Flow. Como base, tomamos el cl谩sico Git Flow, sin embargo, ha cambiado mucho en nuestras condiciones, en nuestro equipo. Tambi茅n te ves, y tal vez algo de esto te convenga, pero algo no. Cada equipo tiene su propio enfoque para trabajar con git.

驴C贸mo funciona con nosotros? Epic es la rama ra铆z de su funci贸n, para una gran funcionalidad. Para que quede m谩s claro, veamos de inmediato el ejemplo del producto.



El gerente viene y dice: el desarrollador, h谩ganos la funcionalidad de la lista de deseos con los productos seleccionados en la aplicaci贸n. El desarrollador comienza una nueva rama 茅pica y la llama lista de deseos.



Adem谩s, lo descompone en tareas m谩s peque帽as, que comienzan en el rastreador. Quiz谩s esto est茅 funcionando con la red, renderizando la IU, escribiendo pruebas. Para cada caracter铆stica de este tipo, comienza una tarea en el rastreador. Y tan pronto como comienza a completar la tarea, comienza la rama de caracter铆sticas correspondiente. La desprende de la misma epopeya.

Tan pronto como termina de trabajar en una de esas caracter铆sticas, la vierte en la 茅pica a trav茅s de la solicitud de grupo. La solicitud de grupo es un mecanismo de este tipo cuando otros desarrolladores de su equipo verifican su c贸digo. Si no les gusta algo, entonces su c贸digo puede no alcanzar su 茅pico, lo que significa que no ser谩 liberado hasta que llegue a un acuerdo con ellos.

Hay dos de estos revisores en nuestro equipo. Se asignan al azar. Este es un proceso automatizado, selecciona de aquellos desarrolladores que recientemente trabajaron con los mismos archivos que usted cambi贸 en su solicitud de grupo.



Por lo tanto, resulta que varias epopeyas con su propio conjunto de caracter铆sticas viven en el proyecto en paralelo. Una epopeya puede tener solo una caracter铆stica. Esto puede suceder si queremos subir esta funci贸n a trav茅s de la solicitud de grupo a epic.



Tan pronto como se completa el trabajo en todas las caracter铆sticas dentro de una 茅pica, la tarea primero se deja al equipo de prueba, al equipo de control de calidad, y ellos prueban funcionalmente la rama. Una vez que encuentran errores, los edita como parte de esta epopeya. Una vez que se solucionan todos los errores, llenas esta 茅pica para desarrollarla. Aqu铆, su equipo no lleva a cabo una revisi贸n adicional del c贸digo, ya que todo el c贸digo ya se ha analizado durante la etapa de congelaci贸n de caracter铆sticas en 茅pica.

Nuestro desarrollo es una rama en la que visita el c贸digo ya probado, porque en la etapa 茅pica se prueba y el c贸digo pas贸 por la solicitud del grupo.



Esto nos permite crear de manera segura una nueva rama de lanzamiento al comienzo del ciclo de lanzamiento. Sin temor a que haya muchos errores que a煤n no se han probado. Por lo tanto, estamos creando una nueva rama de lanzamiento desde el desarrollo, se est谩 probando. Tan pronto como se prueba el lanzamiento y estamos listos para salir m谩s all谩 de la puerta, esta rama se fusiona en maestra.

A veces tenemos hotfix, y hay un tipo de rama separado para ello. Esta es una versi贸n muy corta que debe implementarse r谩pidamente. No tenemos tiempo para esperar tres o cuatro d铆as para que comience el pr贸ximo ciclo de lanzamiento. Por lo general, esto es algo peque帽o.

Por ejemplo, si alg煤n tipo de error entr贸 en producci贸n y es muy cr铆tico, debemos solucionarlo con urgencia. Por lo tanto, detenemos la versi贸n actual, ejecutamos la revisi贸n de este error y actualizamos nuestra versi贸n. Pero la revisi贸n no siempre es una historia sobre errores. A veces tenemos una necesidad de producto.



Por ejemplo, tan pronto como se introdujo el modo de autoaislamiento en Mosc煤, tuvimos una necesidad de productos para que los usuarios pudieran ordenar productos sin contacto. Ahora, al realizar un pedido en nuestra aplicaci贸n, el usuario puede seleccionar la funci贸n "Dejar en la puerta". Llega el servicio de mensajer铆a, deja el paquete debajo de la puerta y se lo entrega sin contacto.

Con esta tarea en el hotfix tambi茅n incluimos widgets tan diferentes que lo instan a quedarse en casa y ordenar los productos por mensajer铆a. No vaya a los puntos de recogida ahora. Implementamos estas tareas a trav茅s de una revisi贸n para poder transmitirlas al usuario lo antes posible, porque las consideramos importantes.

Cuando tenemos una revisi贸n, la enviamos desde master. Desde el desarrollo no se puede derivar, porque en ese momento lo nuevo podr铆a desarrollar una 茅pica, que a煤n no se hab铆a lanzado. Pero no queremos llevarnos estas epopeyas a revisi贸n, para que no nos afecten al azar y bloqueen nuestra revisi贸n. Una vez que se completa el hotfix, lo inyectamos en master y tambi茅n lo agregamos para desarrollar, ya que este c贸digo a煤n no exist铆a en desarrollo.



Master es una base de c贸digo correspondiente a la 煤ltima versi贸n de la aplicaci贸n, que ahora est谩 en la tienda del usuario. Est谩 limpio, sin errores, porque las pruebas funcionales y de regresi贸n ya han pasado all铆, esta es una rama de respaldo.

Cuando se completa nuestro lanzamiento, tambi茅n lo volvemos a desarrollar. Porque como parte del lanzamiento, se pueden encontrar errores que no se encontraron en las pruebas funcionales, y diferentes 茅picas pueden entrar en conflicto entre s铆. Por lo tanto, tambi茅n inyectamos la versi贸n en desarrollo para que tambi茅n tengamos estas soluciones en desarrollo.



Se puede hacer mucho trabajo en 茅pica, y para mantenerse al d铆a con el c贸digo en desarrollo, el desarrollador a veces lo agrega a su 茅pica, para que haya menos conflictos de congelaci贸n.



Como agregamos desarrollar a 茅pico, es necesario agregar 茅pico por las mismas razones a su funci贸n.



En los nombres de las ramas 茅picas y caracter铆sticas, tenemos un n煤mero de ticket en el rastreador de tareas. Esto es genial, porque es precisamente por el n煤mero de ticket que podemos encontrar completamente desde cualquier parte de nuestra aplicaci贸n, dentro de qu茅 tickets cambi贸, qui茅n escribi贸 este c贸digo y para qu茅 se escribi贸.



La rama de lanzamiento y revisi贸n tiene en su nombre el n煤mero de versi贸n de lanzamiento actual de la aplicaci贸n. Algunos equipos combinan el n煤mero de revisi贸n con el n煤mero de versi贸n, justificando esto con el hecho de que la revisi贸n es algo peque帽o y quiz谩s no muy importante para el usuario. Por lo tanto, no aumentan la versi贸n de la aplicaci贸n. No utilizamos este enfoque, porque nos llegan varios informes de fallas de los fabricantes, y queremos saber exactamente si este informe estaba en revisi贸n o en la versi贸n, para saber d贸nde buscar el problema.



Dominar y desarrollar son ramas que viven constantemente en nuestro repositorio. Una vez creado, y en vivo. Por lo tanto, se nombran tan sucintamente.

As铆 es como vivimos. Ahora estamos c贸modos, convenientes.

Liberar tren


Pasamos a nuestros procesos de lanzamiento. Pero antes de hablar sobre los lanzamientos y c贸mo los construimos, hablar茅 sobre los roles que tenemos para apoyar el lanzamiento.

Tenemos un desarrollador de guardia que, dentro de una semana laboral, deja de ocuparse de las tareas del producto y corrige los errores de la versi贸n actual. Si no tiene tareas para la versi贸n actual, corregir谩 algunas deudas t茅cnicas que hemos acumulado, tomar谩 tareas del trabajo atrasado y las corregir谩.

Tambi茅n hay un probador de servicio. Tambi茅n deja de probar las tareas del producto dentro de una semana laboral y verifica la versi贸n actual. Si no tiene tareas para la versi贸n actual, prueba lo que se ha corregido como parte de la deuda t茅cnica.



El lanzamiento comienza el viernes. Es en este d铆a que tenemos una fecha l铆mite dif铆cil. A las 18 en punto de la tarde, el probador de servicio hace clic en el bot贸n "Iniciar liberaci贸n". Despu茅s de este momento, todo lo que se vertir谩 en desarrollo ya no caer谩 en la versi贸n actual, porque despu茅s de hacer clic en el bot贸n se ha creado una rama de liberaci贸n, el desarrollo se ha fusionado y no se verter谩 m谩s all铆.

Otro proceso importante tendr谩 lugar el viernes, otro elemento de la versi贸n actual, que analizar茅 m谩s adelante.



Tenemos un descanso los fines de semana, as铆 que el segundo d铆a de lanzamiento es el lunes. El desarrollador de turno comienza el d铆a con un an谩lisis. 脡l est谩 mirando lo que ha cambiado en la versi贸n actual en t茅rminos de c贸digo. Toma git diff entre la rama de lanzamiento actual y el maestro. Y con esta diferencia, observa qu茅 componentes se han visto afectados. Puede afectar el proceso de pago o la cesta, y el trabajo con pedestales no se ve afectado.

Por lo tanto, forma una lista de varios casos que ser谩n probados durante la prueba. Esto nos ayuda a acelerar nuestra regresi贸n, verifique no toda la aplicaci贸n. Cuando se compila la lista, el equipo de prueba verifica la aplicaci贸n y el desarrollador de turno corrige los errores. Si tiene muchos errores, puede delegar parte a otros desarrolladores que han trabajado recientemente con estas piezas de c贸digo.



El martes, continuamos probando nuestro lanzamiento y corrigiendo errores de lanzamiento. Hacia la tarde, nuestra prueba de regresi贸n termina y estamos listos para partir hacia la puerta. Lanzamos nuestro tren de lanzamiento, de hecho, incluso varios trenes de lanzamiento, porque recientemente ingresamos a un nuevo mercado para nosotros. Tambi茅n te recomiendo que intentes publicar no solo en Google Play, sino tambi茅n en algunos otros. La ventaja no solo es que obtienes una nueva audiencia leal.

De alguna manera, publicamos nuestro lanzamiento y despu茅s de unas horas descubrimos que la cantidad de errores entre los usuarios ha crecido significativamente. Observamos estos errores, los analizamos y vimos que solo ocurren en dispositivos Huawei. No entendimos de inmediato lo que estaba sucediendo, pero ten铆amos Huawei, los probamos, encontramos un error, lo arreglamos y fuimos a actualizar.

Tan pronto como llegamos con la actualizaci贸n en Google Play, vimos un gran banner que dec铆a que debido a la situaci贸n actual en el mundo, Google Play tiene una carga muy pesada y no tienen tiempo para verificar las aplicaciones tan r谩pido como de costumbre. Result贸 que todav铆a no ten铆amos tiempo para revisar nuestra aplicaci贸n, no llegamos a los usuarios de Google Play, pero solo se publicaron en la Galer铆a de aplicaciones de Huawei. Y esa fue la raz贸n por la que solo ten铆amos errores en Huawei. Por lo tanto, fue posible detectar y corregir un error cr铆tico incluso antes de publicar en Google Play.

A continuaci贸n, le dir茅 c贸mo se organizan las publicaciones a trav茅s de Google Play, porque tenemos una gran cantidad de usuarios all铆. Y en Huawei AppGallery, recientemente nos fuimos y todav铆a estamos tratando de entender c贸mo se organiza todo all铆.

No publicamos de inmediato a todos los usuarios en Google Play, por lo que alg煤n tipo de error aleatorio no afecta a toda nuestra audiencia. Publicamos solo para todos los evaluadores que se suscriban al hecho de que pueden tener un error, pero ser谩n los primeros en recibir nuestros cambios y lanzamientos. Adem谩s, publicamos solo el cinco por ciento de la audiencia.



El mi茅rcoles, el desarrollador de turno est谩 viendo un nuevo lanzamiento sin fallas. Es importante para nosotros que no haya un nuevo accidente y que no haya muchos viejos. Si todo es normal, a煤n verifica las m茅tricas del producto. Por ejemplo, para que el n煤mero de pedidos no disminuya en comparaci贸n con el mismo per铆odo. Si las m茅tricas de nuestros productos y sin bloqueos son buenas, implementaremos otro 5%, un total de 10%.



El jueves, el desarrollador de turno revisa las rese帽as en la tienda. De hecho, los mira el mi茅rcoles. Es cierto que el mi茅rcoles todav铆a tenemos una peque帽a audiencia, una o dos rese帽as. Pero el jueves hay m谩s cr铆ticas para juzgar el lanzamiento. Puede haber 10-15 piezas.

驴Por qu茅 incluso mira las revisiones si tenemos muchas m茅tricas y gr谩ficos? Es posible que la aplicaci贸n no se bloquee, incluso las m茅tricas pueden estar en orden. Pero es posible que el usuario tenga fuentes o que alg煤n filtro no funcione para 茅l. Intentamos que el uso de la aplicaci贸n para el usuario sea lo m谩s conveniente posible y analizar dichas revisiones, corregir errores o problemas que el usuario encuentre.

Si las revisiones est谩n en orden, sin fallas tambi茅n es normal y las m茅tricas del producto no han disminuido, ya estamos implementando un 20%.



Y aqu铆 comienza el viernes, el d铆a del lanzamiento de nuestro lanzamiento. El tercer punto del que quer铆a hablar es que el viernes completaremos el lanzamiento actual. Lo pasamos del 20% inmediatamente al 100%. Parece ser un gran salto y muy arriesgado. Pero depende del equipo y de tu audiencia.

El 20% de nuestra audiencia nos permite con una alta probabilidad de juzgar la estabilidad del lanzamiento. Y si todo est谩 bien en un 20%, y el viernes no vimos ning煤n problema, entonces iremos directamente a la cent茅sima.

Conozco los equipos que usan el truco de la vida en Google Play; tal vez 茅l tambi茅n te ayude. Puede implementar no al 100%, sino al 99.9%. Esto te dejar谩 con un bot贸n en Google Play para detener urgentemente el lanzamiento. Y si despliegas al 100%, este bot贸n desaparece. Pero, como dije, en un veinte por ciento de nuestra audiencia podemos juzgar con precisi贸n la estabilidad del lanzamiento. Por lo tanto, implementamos con calma al 100%, esto nos salva de pasos adicionales. Y luego necesitas rodar otro 0.01%.

Este es nuestro proceso, as铆 que viajamos todas las semanas e intentamos no perdernos.


驴Qu茅 otras herramientas tenemos para apoyar la buena vida del usuario de su lado? Estos son Actualizaci贸n forzada, Actualizaci贸n suave y Conmutaci贸n de funciones.



Actualizaci贸n forzada: un mecanismo que bloquea el uso de la aplicaci贸n si su versi贸n est谩 muy desactualizada. La versi贸n que se considera obsoleta se configura en el panel de administraci贸n del servidor. Y tan pronto como se haya cambiado el n煤mero all铆, algunas aplicaciones tendr谩n un cuadro que no lo dejar谩 ir. Solo habr谩 un bot贸n Actualizar, el usuario se ver谩 obligado a actualizar.

Intentamos utilizar este mecanismo lo menos posible, pero a veces es muy importante. Por ejemplo, si rompimos la compatibilidad con versiones anteriores, implementamos una nueva caracter铆stica que no es compatible con el c贸digo anterior. Entonces, el usuario de la versi贸n desactualizada de la aplicaci贸n puede terminar en un estado no coherente. Ir谩 a la canasta y, por ejemplo, no tendr谩 un pedido. No entender谩 por qu茅, aunque en la nueva versi贸n se registran todos los errores y quedar谩 claro por qu茅 no es posible realizar un pedido.



Hay actualizaci贸n suave para ayudar a forzar la actualizaci贸n. Esto es algo nativo de Google, que simplemente est谩 incrustado en su aplicaci贸n y no bloquea el uso. Pero ella dice: hay una actualizaci贸n en Google Play, inst谩lala y tendr谩s nuevas cosas interesantes.

Inicialmente, se implementa mediante dicho di谩logo. Este es un dise帽o nativo de Android. Y luego se puede incrustar en su aplicaci贸n. Por ejemplo, lo implementamos en nuestro widget "Actualizar la aplicaci贸n" en nuestro esquema de color.

Soft Update nos permiti贸 reducir en gran medida la cola de las versiones, y se implementa simplemente de acuerdo con la documentaci贸n. Pru茅balo si tienes muchos lanzamientos.



Otra herramienta importante es la funci贸n de alternancia. Le permite ajustar parte de la funcionalidad en el lado del usuario, cambi谩ndola en el panel de administraci贸n. Hay un conjunto de caracter铆sticas que podemos activar y desactivar desde nuestro servidor sin actualizaciones adicionales de la aplicaci贸n.

Hablemos de c贸mo funciona Feature Toggle en el ejemplo de una aplicaci贸n de terceros: un veh铆culo. Inicialmente, los desarrolladores tienen una bicicleta as铆, que ya tiene dos funciones de alternar: un motor y un gran tama帽o. Los clientes usan la bicicleta, luego el equipo de prueba dice: probamos el motor, funciona, conduce, se enfr铆a, vamos a encenderlo para el usuario.



Vamos al panel de administraci贸n, activamos el alternador de funciones y la bicicleta sin actualizar al usuario, sobre la marcha se convierte en un ciclomotor. El usuario se siente c贸modo, esto le permite moverse m谩s r谩pido y m谩s conveniente.

El producto se est谩 desarrollando, la audiencia est谩 creciendo, ya no cabe en un ciclomotor. Los usuarios quieren llevar a su familia con ellos, viajar juntos. Los desarrolladores y gerentes han proporcionado una alternancia de funciones adicional: un gran tama帽o. Lo habilitamos en el panel de administraci贸n, y el veh铆culo del usuario se hace m谩s grande sobre la marcha.



Parece genial: Feature Toggle nos ayuda. Esto es cierto, pero hay problemas que puede encontrar. Por ejemplo, debe monitorear la compatibilidad con versiones anteriores y la compatibilidad de alternancia de funciones. Supongamos que, en alg煤n momento, la aplicaci贸n rompe el motor, se produce un bloqueo o error. O este motor consumir谩 muchos de nuestros recursos y no podremos admitir demasiados usuarios con el motor. Entonces tenemos que apagarlo.

Pero no queremos que la aplicaci贸n del usuario desaparezca. Queremos darle la oportunidad de usar la aplicaci贸n, a pesar de que todav铆a tiene un Toggle de gran tama帽o. Por lo tanto, cuando apagamos el motor, debemos tener un mecanismo de retroceso para controlar el veh铆culo. En este caso, este es un h铆brido.



Quiz谩s vali贸 la pena considerar que el techo se reclina. Quiz谩s el conductor se sienta inc贸modo al sentarse en ese asiento. Pero a煤n podr谩 conducir un veh铆culo, usar la aplicaci贸n y no caminar.

驴De qu茅 otra forma usamos la funci贸n de alternancia? Supongamos que los backends todav铆a se est谩n desarrollando y no est谩n listos para su lanzamiento. Luego podemos desarrollar parte de la funcionalidad, admitir el contrato de API para todas las comunicaciones con el back-end, admitir la interfaz de usuario y desplegar con la funci贸n de alternancia desactivada. Tan pronto como los backends est茅n listos, probaremos que todo funcione bien y, de ser as铆, habilitaremos el alternancia de funciones. Entonces el usuario no necesitar谩 actualizarse para obtener nuevas funciones. Es decir, ya tendremos una audiencia, inmediatamente apareceremos en esta audiencia. Tan genial tambi茅n.



Ahora, como ya dije, tenemos 13 personas en cada uno de los equipos de desarrollo de Android e iOS. Trabajamos en un flujo de Git, en un repositorio, configuramos nuestro proceso de lanzamiento planificado, redujimos el tiempo de comercializaci贸n y uso cada semana. Recientemente lanzamos Huawei AppGallery y miramos otras tiendas. Aprendimos a cambiar las aplicaciones de los usuarios sin actualizaciones debido a la funci贸n de alternancia. Gracias por la atenci贸n.

All Articles