Configurando un flujo de prueba/implementación para su aplicación Django usando Codeship y AWS CodeDeploy

setting-a-testingdeployment-pipeline-for-your-django-app-using-codeship-and-aws-codedeploy

Si ha estado trabajando con Django (y probablemente con la web en general), ya debe estar acostumbrado a realizar implementaciones de esta manera (suponiendo que realiza pruebas):

  • Ejecute las pruebas para mi aplicación
  • SSH a mi servidor
  • Configurar mi repositorio y clonar la rama que quiero implementar. Si eso ya se hizo, entonces realice los últimos cambios.
  • Instalar dependencias de todo el sistema
  • Instalar dependencias de python
  • Ejecutar collecstatic
  • Reinicie el servidor de aplicaciones (uwsgi, gunicorn, etc.)

Para una actualización menor, realizar todos estos pasos puede llevar entre 10 y 15 minutos.

En mi canal de implementación actual, todo lo que necesito hacer es:

git push origin master

Y eso es todo. Codeship se encarga de ejecutar mis pruebas y enviar la compilación actual a AWS CodeDeploy, donde hace todo por mí en la lista. La configuración de este flujo lleva un tiempo por adelantado, pero verá el aumento de la productividad desde el día 1.

Configurando Codeship

Codeship es un servicio que lo ayuda con la implementación de la integración continua. También puede hacerlo con Jenkins, claro, pero Codeship lo hace tan fácil que no debería tomar más de 15 minutos configurar un nuevo repositorio y obtener una compilación ecológica. Tiene soporte para Bitbucket y Github.

  1. Obviamente, el primer paso es crear una cuenta.
  2. Cree un nuevo proyecto y seleccione el servicio donde tiene su repositorio.
  3. Encuentre su repositorio en la lista y selecciónelo.
  4. En el siguiente paso, deberá agregar los comandos para instalar dependencias, ejecutar migraciones y pruebas, etc.
    Debería ver algo como esto:

Screenshot - 10022015 - 01:32:35 PMDeberá modificar esos comandos para trabajar con la estructura de su proyecto.
En los comandos de configuración debería tener algo como:

    pip install -r requirements.txt
    python manage.py migrate --noinput

And in Configure Test Pipelines:

python manage.py test

O si está usando cobertura:

coverage run manage.py test

5. Si mantiene los datos confidenciales fuera de los repositorios (como debería), probablemente desee establecer algunas variables de entorno, como la URL de su base de datos. En la esquina superior derecha, vaya a configuración del proyecto / variables de entorno.
Codeship configura varias bases de datos para su uso (pg, mysql). Para Django y Postgres terminarás usando algo como:

DATABASE_URL = postgres://$PG_USER:$PG_PASSWORD@localhost:5434/test

6. Y eso es todo. En este punto, cada vez que envíe algo a su repositorio, verá que Codeship lo escucha y trata de ejecutar todo lo que le dice. Si falla, puede ver los registros y ajustar su proyecto hasta que lo arregle.

Hasta ahora estamos recibiendo comentarios sobre nuestras pruebas enviadas al repositorio. Eso por sí solo es una gran ayuda si está probando correctamente porque tendrá comentarios instantáneos si hay regresiones o problemas en sus aplicaciones. Si agregó una nueva dependencia y olvidó agregarla a sus requisitos, también se quejará, lo que le obligará a tener su lista de dependencias actualizada, lo que lo ayudará cuando desee automatizar su implementación.

Configurando CodeDeploy

En esta sección se supone que está familiarizado con los servicios de AWS. Si no es así, cree una cuenta y pruébelo. Es gratis durante el primer año, entonces ¿por qué no?

En comparación con Codeship, AWS CodeDeploy tarda un poco más en configurarse. Señalaré los puntos que me resultaron confusos al principio y proporcionaré una guía general, pero recomiendo leer la documentación porque hay muchas cosas que configurar en su cuenta de AWS para poder usarla.

CodeDeploy requiere un agente instalado en las instancias de EC2 en las que se implementará. Puede encontrar instrucciones sobre el agente en la documentación. Si está intentando esto por primera vez, probablemente no lo tenga instalado y deberá ejecutarlo (suponiendo que esté usando Ubuntu):

sudo apt-get update

sudo apt-get install awscli

sudo apt-get install ruby2.0

cd /home/ubuntu

sudo aws s3 cp s3://bucket-name/latest/install . --region region-name sudo chmod +x ./install
sudo ./install auto

Cambie el bucket-name y el region-name a los valores mencionados en los documentos.

Necesitará 3 cosas más para poder usar CodeDeploy:

  1. Crear una función de servicio : esta función es necesaria para ejecutar CodeDeploy.
  2. Crear un perfil de instancia: Este rol será utilizado por el agente en sus instancias EC2 para acceder a S3, servicio donde Codeship almacena nuestras compilaciones exitosas. Asegúrese de que está iniciando su instancia EC2 con este rol de IAM o tendrá errores.
  3. Crear un usuario para acceder al servicio:  El usuario tendrá algunas credenciales y permisos que necesitamos para acceder al servicio (ACCESS_KEY y SECRET_ACCESS_KEY).

Una vez que tenga estos requisitos, vaya al servicio CodeDeploy y cree una nueva aplicación. Tome nota de su nombre de aplicación y grupo de implementación. Para la sección ADD INSTANCE, seleccione key = name y value = whatever-name-my-instance-has.
Para la CONFIGURACIÓN DE DESPLIEGUE, elija UNA A LA VEZ. Para finalizar, elija la función de servicio que creó anteriormente en el menú desplegable FUNCIÓN DE SERVICIO. De acuerdo, ahora tenemos una aplicación CodeDeploy, pero ¿cómo le informo sobre mi aplicación y lo que sea que esté haciendo para ¿desplegar? Después de todo, hay muchas cosas que pueden salir mal en ese proceso. El agente CodeDeploy espera un archivo llamado appspec.yml.My appspec.yml se ve así:

version: 0.0
os: linux 
files:
  - source: /
    destination: /srv/app
permissions:
  - object: /srv/app
    owner: ubuntu
    group: ubuntu
hooks:
  BeforeInstall:
    - location: clean_instance.sh
      timeout: 6000
      runas: root
  AfterInstall:
    - location: install_os_dependencies.sh    
      timeout: 6000
      runas: root
    - location: install_python_dependencies.sh
      timeout: 6000
      runas: ubuntu
  ApplicationStart:
    - location: start_application.sh
      timeout: 6000
      runas: root

El archivo define varios enlaces, donde puede conectar scripts para ejecutar tareas específicas en su instancia. En mi caso, tengo una aplicación sin estado, lo que significa que puedo eliminar toda la aplicación y reemplazarla por la nueva. Si necesita algo más específico, puede hacerlo con estos hooks.

El último paso es crear una canalización de implementación en Codeship que envíe las compilaciones exitosas a CodeDeploy.

En Codeship, vaya a la configuración / implementación de su proyecto:

Screenshot - 10022015 - 02:35:54 PM

Puede usar cualquier nombre de rama (por ejemplo, master) y guardar la configuración de su canalización. En el selector a continuación, elija CodeDeploy.

Deberá completar cierta información, como el nombre de la aplicación CodeDeploy, el nombre del grupo de implementación, sus credenciales y una ruta a un bucket de S3. Este depósito contendrá sus compilaciones exitosas.

Una vez que haya terminado, intente enviar a su repositorio. Su canalización comenzará a fallar si las implementaciones no son exitosas, y deberá revisar los registros de implementación directamente en CodeDeploy. Sin embargo, si sus implementaciones están funcionando, bienvenido a un nuevo mundo donde implementará en 5 segundos en lugar de 15 minutos (de su tiempo, no del tiempo del servidor, las pruebas y la implementación pueden tomar algún tiempo).

Esta publicación fue muy general y puedo escribir publicaciones adicionales sobre cada paso involucrado. Sin embargo, los principales problemas y las piezas de documentación más importantes se exponen aquí y deberían servir como punto de partida para quien quiera intentar configurar esto. Dele una oportunidad, estoy seguro de que si lo hace funcionar, no volverá a la antigua forma.