Los flujos de trabajo de integración continua (CI) se consideran una mejor práctica en estos días. Al igual que en, usted trabaja con su sistema de control de versiones (Git) y, mientras lo hace, CI hace un trabajo por usted, como ejecutar pruebas, enviar notificaciones e implementar código. Esa última parte se llama Despliegue Continuo (CD). Pero enviar el código a un servidor de producción a menudo requiere servicios de pago. Con las acciones de GitHub, la implementación continua es gratuita para todos. Exploremos cómo configurar eso.
DevOps es para todos
Como desarrollador front-end, los flujos de trabajo de implementación continua solían ser emocionantes, pero misteriosos para mí. Recuerdo que muchas veces tuve miedo de tocar las configuraciones de implementación. En su lugar, opté por la ruta fácil: por lo general, alguien más lo configuraba y lo mantenía, o copiaba y pegaba manualmente las cosas en el peor de los casos.
Tan pronto como entendí los conceptos básicos de rsync, el CD finalmente se volvió tangible para mí. Con el siguiente flujo de trabajo de Acción de GitHub, no es necesario ser un especialista en DevOps; pero aún tendrá las herramientas a mano para configurar los flujos de trabajo de implementación de mejores prácticas.
Los conceptos básicos de un flujo de trabajo de implementación continua
Entonces, ¿cuál es el problema, cómo funciona esto? Todo comienza con CI, lo que significa que usted envía el código a un repositorio remoto compartido, como GitHub, y cada vez que lo empuja ejecutará tareas automatizadas en un servidor remoto. Esas tareas podrían incluir procesos de prueba y construcción, como linting, concatenación, minificación y optimización de imágenes, entre otros.
El CD también envía código a un servidor de sitios web de producción. Eso puede suceder copiando el código verificado y construido y colocándolo en el servidor a través de FTP, SSH o enviando contenedores a una infraestructura. Si bien todos los paquetes de alojamiento compartido tienen acceso FTP, enviar muchos archivos a un servidor es bastante poco confiable y lento. Y aunque el envío de contenedores de aplicaciones es una forma segura de lanzar aplicaciones complejas, la infraestructura y la configuración también pueden ser bastante complejas. La implementación de código a través de SSH es rápida, segura y flexible. Además, es compatible con muchos paquetes de alojamiento.
Cómo implementar con rsync
Una forma fácil y eficiente de enviar archivos a un servidor a través de SSH es rsync, una herramienta de utilidad para sincronizar archivos entre una carpeta, una unidad o una computadora de origen y destino. Solo sincronizará aquellos archivos que hayan cambiado o que aún no existan en el destino. Como se convirtió en una herramienta estándar en las distribuciones populares de Linux, es muy probable que ni siquiera necesite instalarla.
La operación más básica es tan fácil como llamar rsync SRC DEST
para sincronizar archivos de un directorio a otro. Sin embargo, hay un par de opciones que desea considerar:
-c
compara los cambios de archivo por suma de comprobación, no por tiempo de modificación-h
genera números en un formato más legible por humanos-a
retiene los atributos y permisos de los archivos y copia de forma recursiva archivos y directorios-v
muestra la salida de estado--delete
elimina archivos del destino que no se encuentran en la fuente (ya)--exclude
evita la sincronización de archivos especificados como el.git
directorio ynode_modules
Y finalmente, desea enviar los archivos a un servidor remoto, lo que hace que el comando completo se vea así:
rsync -chav --delete --exclude /.git/ --exclude /node_modules/ ./ [email protected]:/mydir
Puede ejecutar ese comando desde su computadora local para implementarlo en cualquier servidor en vivo. Pero, ¿qué tan genial sería si se ejecutara en un entorno controlado desde un estado limpio? Bien, para eso estás aquí. Sigamos con eso.
Crear un flujo de trabajo de acciones de GitHub
Con las acciones de GitHub, puede configurar los flujos de trabajo para que se ejecuten en cualquier evento de GitHub. Si bien existe un mercado para las acciones de GitHub, no necesitamos ninguna de ellas, pero crearemos nuestro propio flujo de trabajo.
Para comenzar, vaya a la pestaña “Acciones” de su repositorio y haga clic en “Configurar un flujo de trabajo usted mismo”. Esto abrirá el editor de flujo de trabajo con un .yaml
plantilla que estará comprometida con la .github/workflows
directorio de su repositorio.
Cuando se guarda, el flujo de trabajo comprueba su código de repositorio y ejecuta algunos echo
comandos. name
ayuda a seguir el estado y los resultados más tarde. run
contiene los comandos de shell que desea ejecutar en cada paso.
Definir un desencadenante de implementación
Teóricamente, cada compromiso con la rama maestra debería estar listo para producción. Sin embargo, la realidad le enseña que también debe probar los resultados en el servidor de producción después de la implementación y debe programarlo. En bleech consideramos que es una buena práctica implementar solo los días hábiles, excepto los viernes y solo antes de las 4:00 p. M., Para asegurarnos de que tenemos tiempo para retroceder o solucionar problemas durante el horario comercial si algo sale mal.
Una forma sencilla de obtener el control a nivel manual es configurar una sucursal solo para desencadenar implementaciones. De esa manera, puede fusionar específicamente su rama maestra en ella cuando esté listo. Llame a esa rama de producción, informe a todos los miembros de su equipo que los empujes a esa rama solo están permitidos desde la rama maestra y dígales que lo hagan así:
git push origin master:production
A continuación, le mostramos cómo cambiar el desencadenador de su flujo de trabajo para que solo se ejecute en los empujes a ese production
rama:
name: Deployment
on:
push:
branches: [ production ]
Construye y verifica el tema
Asumiré que está utilizando nuestro tema de inicio de WordPress Flynt, que viene con administración de dependencias a través de Composer y npm, así como un proceso de compilación preconfigurado. Si está utilizando un tema diferente, es probable que el proceso de compilación sea similar, pero es posible que necesite ajustes. Y si está registrando los activos compilados en su repositorio, puede omitir todos los pasos excepto el checkout
mando.
Para nuestro ejemplo, asegurémonos de que el nodo se ejecute en la versión requerida y que las dependencias estén instaladas antes de compilar:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/[email protected]
- uses: actions/[email protected]
with:
node-version: 12.x
- name: Install dependencies
run: |
composer install -o
npm install
- name: Build
run: npm run build
La tarea de compilación de Flynt finalmente requiere, lints, compila y transpila archivos Sass y JavaScript, luego agrega revisión a los activos para evitar problemas de caché del navegador. Si algo en el paso de compilación falla, el flujo de trabajo dejará de ejecutarse y, por lo tanto, le impedirá implementar una versión rota.
Configurar el acceso y el destino del servidor
Para el rsync
para ejecutarse correctamente, GitHub necesita acceso a SSH en su servidor. Esto se puede lograr haciendo lo siguiente:
- Genere una nueva clave SSH (sin una frase de contraseña)
- Agregue la clave pública a su
~/.ssh/authorized_keys
en el servidor de producción - Agrega la clave privada como un secreto con el nombre
DEPLOY_KEY
al repositorio
El paso del flujo de trabajo de sincronización debe guardar la clave en un archivo local, ajustar los permisos del archivo y pasar el archivo al rsync
mando. El destino debe apuntar a su directorio de temas de WordPress en el servidor de producción. Es conveniente definirlo como una variable para saber qué cambiar al reutilizar el flujo de trabajo para proyectos futuros.
- name: Sync
env:
dest: '[email protected]:/mydir/wp-content/themes/mytheme'
run: |
echo "${{secrets.DEPLOY_KEY}}" > deploy_key
chmod 600 ./deploy_key
rsync -chav --delete
-e 'ssh -i ./deploy_key -o StrictHostKeyChecking=no'
--exclude /deploy_key
--exclude /.git/
--exclude /.github/
--exclude /node_modules/
./ ${{env.dest}}
Dependiendo de la estructura de su proyecto, es posible que desee implementar complementos y otros archivos relacionados con el tema también. Para lograr eso, cambie la fuente y el destino al directorio principal deseado, asegúrese de verificar si los archivos excluidos necesitan una actualización y verifique si alguna ruta en el proceso de compilación debe ajustarse.
Juntar las piezas
Hemos cubierto todos los pasos necesarios del proceso de CD. Ahora necesitamos ejecutarlos en una secuencia que debería:
- Dispare cada vez que presione el
production
rama - Instalar dependencias
- Construye y verifica el código
- Envíe el resultado a un servidor a través de rsync
El flujo de trabajo completo de GitHub se verá así:
name: Deployment
on:
push:
branches: [ production ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/[email protected]
- uses: actions/[email protected]
with:
node-version: 12.x
- name: Install dependencies
run: |
composer install -o
npm install
- name: Build
run: npm run build
- name: Sync
env:
dest: '[email protected]:/mydir/wp-content/themes/mytheme'
run: |
echo "${{secrets.DEPLOY_KEY}}" > deploy_key
chmod 600 ./deploy_key
rsync -chav --delete
-e 'ssh -i ./deploy_key -o StrictHostKeyChecking=no'
--exclude /deploy_key
--exclude /.git/
--exclude /.github/
--exclude /node_modules/
./ ${{env.dest}}
Para probar el flujo de trabajo, confirme los cambios, introdúzcalos en su repositorio local y active la implementación presionando su master
rama a la production
rama:
git push origin master:production
Puede seguir el estado de la ejecución yendo a la pestaña “Acciones” en GitHub, luego seleccionando la ejecución reciente y haciendo clic en el trabajo “implementar”. Las marcas de verificación verdes indican que todo salió bien. Si hay algún problema, consulte los registros del paso fallido para solucionarlo.
Ver el informe completo en GitHub
¡Felicidades! Ha implementado con éxito su tema de WordPress en un servidor. El archivo de flujo de trabajo se puede reutilizar fácilmente para proyectos futuros, lo que hace que las configuraciones de implementación continua sean muy sencillas.
Para refinar aún más su proceso de implementación, vale la pena considerar los siguientes temas:
- Almacenamiento en caché de dependencias para acelerar el flujo de trabajo de GitHub
- Activar el modo de mantenimiento de WordPress mientras se sincronizan archivos
- Borrar la caché del sitio web de un complemento (como Cache Enabler) después de la implementación