Manuales de desarrollo de YeboYebo
Para desplegar una instancia de Magento 2 en el servidor de nuestro cliente utilizaremos Github Actions. Las acciones definidas pueden ser complementadas con otras acciones del marketplace de Github.
Todas las instalaciones contarán con un servidor principal (Servidor de Administración) en el que realizaremos el despliegue. Si el entorno contase con capacidad para autoescalarse, requerira un paso adicional para copiar los archivos en el servidor (docker) principal de autoescalado del fronpage.
Las variables y secrets de Github son constantes que podemos configurar en el repositorio de Github para utilizarlas en sus acciones. Por tanto usaremos estamos constantes para configurar los parámetros del despliegue. Para crear o modificarlos, dentro del repositorio pulsamos sobre Settings (https://github.com/yeboyebo/nombre_repositorio/settings) y en el menú lateral izquierdo pulsamos sobre Secrets and variables. Los secrets son variables encriptadas. Crearemos las siguientes:
Secrets:
Host production
User root
IdentityFile ~/.ssh/id_rsa #o nombre de la clave ssh
HostName ip o dominio
Port 22
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
......................................................................
QSJkt3VVqMO2YJAAAADnJvb3RAeWJTdGFnaW5nAQIDBA==
-----END OPENSSH PRIVATE KEY-----
Para el despliegue sin caida del servicio utilizamos la acción Zero-downtime deployment magento desarrollada por MadIt. Está acción realiza todas sus acciones sobre la carpeta magento en la raiz del proyecto, por tanto tendremos que realizar las siguientes acciones:
Copiamos la configuración básica para el despliegue de magento 2 en un solo servidor. Habrá que configurar cuando queremos que ejecute la acción (On push branch master) y podemos personalizar algunos parametros como los idiomas del tema o la versión de Php.
name: m2-guanabana-deploy
on:
push:
branches:
- 'master_2_4_6'
jobs:
magento2-build:
runs-on: ubuntu-latest
name: 'm2 tests & build'
services:
mysql:
image: docker://mysql:8.0
env:
MYSQL_ROOT_PASSWORD: magento
MYSQL_DATABASE: magento
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
# elasticsearch:
# image: docker://elasticsearch:7.17.0
# ports:
# - 9200:9200
# options: -e="discovery.type=single-node" --health-cmd="curl http://localhost:9200/_cluster/health" --health-interval=10s --health-timeout=5s --health-retries=10
opensearch:
image: opensearchproject/opensearch:1.2.1
ports:
- 9200:9200
options: -e="discovery.type=single-node" -e "plugins.security.disabled=true" -e "plugins.security.ssl.http.enabled=false" --health-cmd="curl http://localhost:9200/_cluster/health" --health-interval=10s --health-timeout=5s --health-retries=10
steps:
- uses: actions/checkout@v3
with:
repository: '$'
- name: 'launch magento2 build'
if: always()
id: build
uses: MAD-I-T/magento-actions@v3.20
env:
COMPOSER_AUTH: $
with:
process: 'build'
langs: 'en_US,es_ES'
php: 8.1
composer_version: 2
elasticsearch: 0
opensearch: 1
- name: 'launch security scanner files'
if: always()
uses: MAD-I-T/magento-actions@v3.20
env:
COMPOSER_AUTH: $
with:
process: 'security-scan-files'
php: 8.1
composer_version: 2
- name: 'launch security scanner modules'
if: always()
uses: MAD-I-T/magento-actions@v3.20
env:
COMPOSER_AUTH: $
with:
process: 'security-scan-modules'
php: 8.1
composer_version: 2
#### section to be activated, for zero downtime deployment on preprod and/or prod remove $false
- name: 'launch magento2 zero downtime deploy with no permission check'
if: steps.build.outcome == 'success'
uses: MAD-I-T/magento-actions@v3.20
env:
COMPOSER_AUTH: $
BUCKET_COMMIT: bucket-commit-$.tar.gz
MYSQL_ROOT_PASSWORD: magento
MYSQL_DATABASE: magento
HOST_DEPLOY_PATH: $
HOST_DEPLOY_PATH_BUCKET: $/bucket
SSH_PRIVATE_KEY: $
SSH_CONFIG: $
WRITE_USE_SUDO: true
with:
deployer: 'no-permission-check'
process: 'deploy-production'
- name: 'unlock deployer if fails'
if: failure() || cancelled()
uses: MAD-I-T/magento-actions@v3.20
env:
COMPOSER_AUTH: $
BUCKET_COMMIT: bucket-commit-$.tar.gz
MYSQL_ROOT_PASSWORD: magento
MYSQL_DATABASE: magento
HOST_DEPLOY_PATH: $
HOST_DEPLOY_PATH_BUCKET: $/bucket
SSH_PRIVATE_KEY: $
SSH_CONFIG: $
WRITE_USE_SUDO: true
with:
process: 'cleanup-production'
Para realizar el despliegue en un sistema con autoescalado tendremos que copiar los ficheros al servidor principal de frontpage para el escalado. Para ello necesitamos añadir los siguientes secrets:
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
......................................................................
QSJkt3VVqMO2YJAAAADnJvb3RAeWJTdGFnaW5nAQIDBA==
-----END OPENSSH PRIVATE KEY-----
Tenemos que modificar el fichero main.yml y añadir nuevas acciones para que copien los ficheros:
- name: Install SSH Key
if: $
uses: shimataro/ssh-key-action@v2
with:
key: $
known_hosts: 'just-a-placeholder-so-we-dont-get-errors'
- name: Adding Known Hosts
if: $
run: ssh-keyscan -H $ >> ~/.ssh/known_hosts
- name: Deploy with rsync
if: $
run: rsync -avz ./ root@$:$
Al realizar un push sobre la rama configurada (“master_2_4_6” en el ejemplo) se ejecutará la acción de deploy. Puedes ver la ejecución de la misma desde la pestaña “Actions” del repositorio.