Proceso de implementación de Magento 2

8

Actualmente nos comprometemos composer.lockcon el repositorio y luego lo ejecutamos composer install --no-deven el servidor de producción. No creo que esta sea la mejor manera de hacerlo porque el compositor tarda unos minutos en generar todos los archivos y es arriesgado.

Me pregunto si es mejor comprometerse con el repositorio de todos los archivos necesarios para ejecutarse en modo de producción.

¿Cómo gestionan los demás el proceso de implementación con magento 2?

Claudiu Creanga
fuente
¿Por qué es arriesgado? Solo debe hacerse una vez por instalación / configuración, y una vez que el compositor ha descargado un paquete, está en caché.
user3668514
tal vez me falta algo, pero si no tiene la carpeta del proveedor en el repositorio, ¿cómo instalaría nuevos módulos sin ejecutarlos composer installen producción? letscodejavascript.com/v3/blog/2014/03/the_npm_debacle
Claudiu Creanga
El punto es correr composer install. ¿Has mirado en un gancho git para automatizar el proceso?
user3668514
@ user3668514 ¿y si, cuando ejecuta la instalación del compositor en producción, algunos paquetes remotos están caídos, como sucedió con npm?
Claudiu Creanga
¿Con qué frecuencia ocurre esto? Magento2 ahora viene con un .gitignore que ignora / vende explícitamente entre otros. Como este es el nuevo 'Magento camino', que sigo para asegurarse de que otros desarrolladores pueden trabajar en el proyecto sin ningún problema
user3668514

Respuestas:

5

Acuerde 100% con claudiu-creanga en no comprometer al proveedor y también evitar ejecutar la instalación del compositor en producción.

La forma en que hemos manejado esto es tener una carpeta en vivo y una carpeta de candidato a la versión. Es en la carpeta de la versión candidata donde ejecutamos los comandos git pull y la instalación del compositor --no-dev. Nuestro proceso puede resumirse así:

  1. En la carpeta de lanzamiento-candidato:

    • Verificar cambios inesperados
    • Actualizar repositorio
    • Instalación del compositor
  2. Sincronizar archivos a la carpeta del sitio en vivo

  3. En la carpeta del sitio en vivo:
    • Implementar archivos estáticos
    • Habilitar modo de mantenimiento
    • Habilitar módulos
    • Ejecute scripts de configuración
    • Compilar DI
    • Limpiar cache
    • Deshabilitar modo de mantenimiento
    • Actualizar permisos

He escrito un artículo de blog más extenso dando los comandos y el razonamiento reales detrás de esto: https://www.c3media.co.uk/blog/c3-news/deploying-magento-2-production-environment/

ACTUALIZACIÓN: ahora copiamos la base de datos en vivo a una base de datos provisional y la usamos para ejecutar scripts de configuración, implementar archivos estáticos y compilar DI todo sin conexión. Esto se puede implementar en vivo, incluidos los archivos pub / static y var. Todavía eliminamos brevemente el sitio si se están ejecutando los scripts de configuración, pero de lo contrario el sitio se deja arriba. Más detalles en https://www.c3media.co.uk/blog/c3-news/magento-2-deployment-without-downtime/

ACTUALIZACIÓN: he cambiado de opinión sobre la confirmación de la carpeta del proveedor: al confirmar la carpeta, puede realizar un seguimiento del historial de cómo cambian estos archivos, ver si ha cambiado algo accidentalmente y, lo más importante, evita tener que ejecutar el compositor en el momento del despliegue. Esto último es vital ahora que confiamos en proveedores externos de repositorios. ¿Qué pasa si uno de ellos no está disponible? De repente no puedes desplegar. Los inconvenientes son un repositorio más grande, el riesgo de cometer piratas informáticos centrales y la distancia instintiva de desarrolladores como yo :)

Robert Egginton
fuente
También comenzamos a comprometer la aplicación / etc / config.php. De forma predeterminada, esto es ignorado por .gitignore de Magento 2, pero al confirmar esta habilitación y deshabilitación se realiza durante el desarrollo y esa decisión se confirma y puede propagarse y probarse a través de CI.
Robert Egginton
¿En serio desconectas tu sitio web? Esa no es una opción para nosotros. Nuestra compañía realmente está haciendo dinero
TheBlackBenzKid
En la actualidad, sí, desconectamos los sitios brevemente, ya que no estamos 100% seguros de que los usuarios no vean un sitio parcialmente operativo. Con nuestra mayor experiencia en M1, sabemos con un alto grado de certeza qué cambios pueden activarse sin quitar el sitio. No es así con M2 todavía.
Robert Egginton
Votado a favor. Sin embargo, como @TheBlackBenzKid, me gustaría ver algo que no desconecte su sitio web, especialmente porque la compilación DI toma un poco de tiempo. Creo que comprender lo que realmente hace la compilación DI es clave: sería genial si ese paso se pudiera hacer en la carpeta de lanzamiento-candidato. Mientras tanto, ¿has progresado desde que publicaste este @Robert?
Erfan
1
Edición interesante @RobertEgginton - Actualmente estoy explorando esto y he seguido tus publicaciones y debates. Comparto las reservas sobre el uso del compositor en el momento del despliegue y la posible falta de disponibilidad de repositorios de terceros, aunque supongo que esto no es una preocupación con los repositorios de empaquetadores. Comprometerse ./vendor parece menos que ideal también, pero al menos le ofrece una versión completa que se puede implementar independientemente de repositorios de terceros. ¿Has probado la extensión Capistrano Magento2? Esto utiliza la instalación del compositor, pero me gusta el flujo de trabajo de github.com/davidalger/capistrano-magento2
BlueC
3

Hasta ahora, también confirmamos la carpeta del proveedor, que por supuesto agrega una gran cantidad de archivos a su repositorio. (Asegúrese de eliminar las carpetas .git en los archivos del compositor del proveedor, ya que de lo contrario el contenido de las carpetas no se comprometerá, por ejemplo, firegento). Pero el enlace simbólico de la carpeta del proveedor no funciona, editar la ruta en el archivo vendor_path.php tampoco funciona y hasta ahora no hemos tenido tiempo de buscar una solución mejor.

No tenemos un servidor de compilación y no ejecutamos Composer en el servidor, ejecutamos y probamos todas las actualizaciones localmente y las confirmamos. Esto a su vez activa nuestro script de implementación.

Nuestro script de implementación reemplaza el archivo env.php, hace algunas cosas personalizadas y luego también se activa setup:upgradey setup:static-content:deployantes de cambiar el enlace en vivo a la nueva carpeta.

La única carpeta que tenemos es el enlace simbólico pub / media.

tecjam
fuente
Gracias por el aporte. además de cambiar el env.php, ¿cuáles son otros cambios que te gustaría hacer?
Claudiu Creanga
Todo eso depende de su propio servidor y configuración del proyecto, supongo. Para las ramas de desarrollo y preparación, también eliminamos el .htaccess y copiamos nuestros propios archivos .htaccess & htpassword en el directorio, nos aseguramos de que bin / magento sea ejecutable solo como medida de precaución antes de ejecutar comandos cli en él, lo cual nos aseguramos corremos como el propietario del archivo magento (el usuario de implementación es root) y enlazamos la carpeta multimedia a la carpeta pub. Por supuesto, también puede agregar cualquier otra cosa que prefiera hacer al implementar en lugar de antes.
tecjam
En general, se desaconseja la confirmación de archivos en / proveedor, ya que anula el objetivo de un administrador de componentes. Ver documentación del compositor.
user3668514
Eso está claro. Entonces, ¿cómo gestionas tu implementación?
tecjam
1
Careful @ user3668514 - Creo que te refieres a la instalación del compositor. Es fácil ejecutar accidentalmente la actualización y modificar los componentes en lugar de instalarlos.
Robert Egginton
2

Finalmente, optamos por un servicio como deploybot( http://deploybot.com/ ). Puedes usar el capistranoque es gratis. Deploybot crea un contenedor acoplable mientras se ejecuta la instalación del compositor y si el comando se ejecuta correctamente, implementa el código; de lo contrario, no implementará nada, por lo que su entorno de producción estará seguro.

Considero que este es el mejor enfoque porque:

1) los compositores no recomiendan tener la carpeta del proveedor en su repositorio de git por buenas razones:

The general recommendation is no. The vendor directory (or wherever your dependencies are installed) should be added to .gitignore/svn:ignore/etc.

Más información: https://getcomposer.org/doc/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.md

2) Ejecutar composer install in productionsin redes de seguridad es arriesgado , los paquetes podrían estar inactivos (consulte npm), podría encontrarse con problemas de memoria o cualquier error que pudiera estar ocurriendo mientras el compositor genera archivos y tendrá que lidiar con un entorno de producción roto.

Claudiu Creanga
fuente
1

También estoy investigando esto, el enfoque que he tomado hasta ahora es:

Bootstrapping del servidor:

  1. Configure el proyecto composer --create-project ... --no-deven una srccarpeta (aunque todavía veo un montón de desarrollo cruzado)
  2. Configurar la aplicación, compilar archivos estáticos, actualizar db, etc.
  3. Establecer todos los permisos correctos

Lo que me proporcionará una tienda de almacenamiento en ejecución desde mi directorio src (pero mi raíz web no apunta allí)

Entonces mi proceso de implementación:

  1. Hacer una nueva carpeta de lanzamiento
  2. rsync los archivos src en mi lanzamiento (excluyendo el cruft)
  3. implementar y descomprimir mis personalizaciones en la parte superior (un puñado de archivos de temas y módulos)
  4. instalar cualquier módulo de magento de terceros a través de magento connect
  5. apuntar mi servidor webroot a mi nueva versión (con un enlace simbólico)
  6. recarga con gracia mi servidor web

Esto me permite mantener el código principal de Magento separado del mío, usar el compositor para mantenerlo actualizado ... ¡y no necesito enviar 39,102! archivos con cada implementación, o ejecute comandos de compositor en el momento de la implementación.

... Ansioso por escuchar otros enfoques o por las mejores prácticas en esto, y también me encanta saber qué archivos son realmente necesarios para la producción y cuáles son dev .. para que pueda mantener mi webroot limpio.

Una vez que termine, tendré un libro de jugadas ansible y algunos comandos de Fabric para organizar la configuración y la implementación, que estoy feliz de compartir.

Espero que ayude

farridav
fuente
Me encantaría ver los libros de jugadas y los guiones.
JM Becker