
Introducción
Durante un tiempo os estamos explicando cómo integrar nuestra instancia Faraday a nuestro proceso de desarrollo de aplicaciones Python integradas con Heroku fácilmente. En nuestros últimos posts, hicimos esto utilizando Acciones de GitHub y Canalizaciones Jenkins.(enlace)
Hoy vamos a ponerlo en práctica utilizando Travis CI como herramienta de CD/CI, ya que se trata de una herramienta con una buena cuota de mercado.
Consideraciones previas
Como hicimos en el último post, vamos a suponer que ya tienes un repositorio python en algún servidor git que ya está configurado usando Heroku. Puedes leer nuestro primer post si quieres saber cómo configurar esto y obtener más contexto.
Travis CI es una herramienta de CD/CI que tiene dos versiones: La versión de pago nos permite utilizar repositorios git privados y la versión gratuita sólo nos permite utilizar repositorios públicos.
No vamos a profundizar en la configuración de cada versión porque cada una tiene una forma diferente de configurarlo pero no es difícil, basta con leer la documentación oficial. Vamos a centrarnos en el .travis.yml y cómo debe configurarse para integrarlo con nuestro Insights y Blog instancia
Paso 1: Creación del archivo .travis.ylm
El primer paso es crear un archivo llamado .travis.yml en la raíz de nuestro repositorio, al igual que hicimos con el archivo Jenkinsfile en nuestro último post. Este archivo será leído por Travis en cada push y nos permitirá construir, probar, desplegar nuestra aplicación y subir el resultado a nuestro Insights y Blog instancia.

Cuando lo termines podrás ver tu build en Travis. Si todo ha ido bien, verás algo como lo siguiente:
Una vez creado el archivo, tenemos que escribir lo siguiente en él:
idioma: pythonservicios:- dockerpython:- '3.9'env:- PROYECTO=faraday-vmpipelinesantes_de_instalar- docker pull owasp/zap2docker-stable- docker build https://github.com/flopezluksenberg/docker-faraday-report-uploader.git#bandit -t faraday-uploaderguión:-
Vamos a explicar lo que significa cada línea escrita en el bloque de código anterior:
- La primera línea es bastante clara: esto se lo dice a Travis que vamos a construir una aplicación escrita en Python
- La servicios nos permite decirle a Travis que nuestro flujo de ejecución requerirá algún servicio mientras ejecuta nuestra tarea como mongodb, redis, etc. En nuestro caso vamos a utilizar docker porque lo necesitamos para ejecutar zap más tarde.
- En la sección python vamos a establecer la versión de python. En este caso la versión es 3.9
- La env nos permite especificar variables de entorno que necesitamos utilizar durante la ejecución. En nuestro caso vamos a crear la variable de entorno PROYECTO porque la necesitamos para construir el nombre del espacio de trabajo en nuestra variable Insights y Blog instancia después.
- En el antes_de_instalar le decimos a Travis lo que hay que hacer antes de instalar nuestras dependencias. En nuestro caso estamos utilizando esta sección para pre-configurar las imágenes docker que utilizaremos más adelante.
- La script es la sección más importante de este archivo. Aquí vamos a escribir cada paso para ser ejecutado por Travis secuencialmente. Usted notará que es bastante similar a lo que hicimos en nuestros últimos posts utilizando Acciones en Github y Canalizaciones Jenkins
Nota: Todas las secciones anteriores a script son necesarios para la instalación general. En nuestro caso las dependencias de nuestro repositorio se instalarán automáticamente porque dijimos a Travis que el lenguaje a utilizar es python por lo que Travis encontrará el requisitos.txt para instalar las dependencias necesarias antes de ejecutar el archivo script sección
Paso 2: Definir la sección del guión
Como hemos dicho, el script es la más importante porque aquí es donde Travis ejecutará cada línea de nuestro proceso de construcción secuencialmente. Afortunadamente, todos los entornos se han configurado en las secciones anteriores, por lo que sólo podemos centrarnos en la secuencia de ejecución.
Como hicimos en el post anterior, ejecutaremos bandido sobre nuestro código, desplegaremos nuestra aplicación en Heroku, ejecutaremos una exploración remota utilizando Zap sobre nuestra app recién desplegada y terminaremos este proceso subiendo el estado del informe a nuestro Insights y Blog instancia.
lenguaje: python servicios: - docker python - '3.9' env: - PROJECT=faraday-vmpipelines antes_de_instalar - docker pull owasp/zap2docker-stable - docker build https://github.com/flopezluksenberg/docker-faraday-report-uploader.git#bandit -t faraday-uploader script: - bandit -r $TRAVIS_BUILD_DIR -f xml -o $TRAVIS_BUILD_DIR/flaskapp_faraday_bandit.xml --exit-cero - git remote rm heroku || true - git remote add heroku https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git > /dev/null - git push heroku HEAD:master -f - export CURRENT_DATE=$(date +'%Y-%m-%d') - docker run -u root -v $TRAVIS_BUILD_DIR:/zap/wrk/:rw --network=host -t owasp/zap2docker-stable zap-baseline.py -t $ZAP_SCAN_URL -x flaskapp_faraday_zap.xml || true - docker run --name faraday-uploader --rm -v $TRAVIS_BUILD_DIR:$TRAVIS_BUILD_DIR -e HOST=$FARADAY_URL -e USERNAME=$FARADAY_USERNAME -e PASSWORD=$FARADAY_PASSWORD -e WORKSPACE=$PROJECT-$CURRENT_DATE-$TRAVIS_BUILD_NUMBER -e FILES=$TRAVIS_BUILD_DIR/flaskapp_faraday_bandit.xml faraday-uploader - docker run --name faraday-uploader --rm -v $TRAVIS_BUILD_DIR:$TRAVIS_BUILD_DIR -e HOST=$FARADAY_URL -e USERNAME=$FARADAY_USERNAME -e PASSWORD=$FARADAY_PASSWORD -e WORKSPACE=$PROJECT-$CURRENT_DATE-$TRAVIS_BUILD_NUMBER -e FILES=$TRAVIS_BUILD_DIR/flaskapp_faraday_zap.xml faraday-uploader
Leamos paso a paso el bloque de código anterior para entender lo que hemos hecho en el botón script sección:
- En la primera línea estamos ejecutando bandido sobre nuestro repositorio. Esto no es diferente en comparación con los puestos anteriores.
- Los siguientes tres pasos se utilizan para configurar y desplegar nuestra aplicación en Heroku. De nuevo, lo hicimos igual que en nuestros posts anteriores. Aquí es importante notar las variables de entorno personalizadas llamadas $HEROKU_API_KEY y $HEROKU_APP_NAME. Más adelante explicaremos cómo declarar variables personalizadas en Travis.
- A continuación, creamos una variable para almacenar la fecha actual, ya que más adelante necesitaremos crear el archivo espacio de trabajo en nuestro Insights y Blog instancia. El nombre de la variable es $FECHA_ACTUAL.
- A continuación, utilizamos docker. La primera ejecución de docker es escanear e identificar vulnerabilidades en nuestra aplicación desplegada utilizando Zap. Tenga en cuenta que estamos utilizando otra variable de entorno personalizada llamada $ZAP_SCAN_URL.
- Cuando termine el escaneo anterior sólo tenemos que subir los dos informes generados a nuestro Insights y Blog instancia. Esto no es diferente en comparación como lo hicimos en los puestos anteriores porque docker nos permite hacerlo fácilmente. Observe que hemos utilizado dos variables de entorno proporcionadas por Travis y también algunas variables de entorno personalizadas. El sitio Travis las variables de entorno son las siguientes:
- $TRAVIS_BUILD_DIR: Esto es bastante claro, es el directorio de compilación que Travis está utilizando para ejecutar la tarea
- $TRAVIS_BUILD_NUMBER: Esta variable nos indica qué número de ejecución es el actual.
Las variables de entorno personalizadas son las siguientes:
- $FARADAY_URL
: Este es nuestro Insights y Blog url de instancia.
- $FARADAY_USERNAME: Nombre de usuario de Faraday que cargará los informes
- $FARADAY_PASSWORD: Contraseña de Faraday del nombre de usuario anterior que cargará los informes
- $PROYECTO: Hemos definido esta variable de entorno en el archivo env anteriormente. Se utiliza para crear el nombre del espacio de trabajo.
- $FECHA_ACTUAL: Hemos creado esta variable previamente en el script sección. Esto devuelve el día con el siguiente formato aaaa-MM-dd.
Nota: No vamos a profundizar aquí porque hemos cubierto mucho en los posts anteriores. Si usted no puede seguir este post por favor vaya a leer los anteriores para obtener más contexto.
Paso 3: Creación de las variables de entorno personalizadas en Travis
Ya hemos configurado el .travis.yml pero para que la compilación tenga éxito todavía tenemos que configurar las variables de entorno personalizadas que hemos utilizado anteriormente.
Para ello, tenemos que ir a la configuración de nuestro repositorio a través de la opción Travis (no importa la versión que tengas). Una vez dentro de este, es necesario encontrar el Variables de entorno y añadimos una a una todas las variables que hemos utilizado anteriormente.
En Travis UI es bastante simple por lo que no vamos a profundizar aquí. Es importante tener en cuenta que puede establecer valores variables por rama, por lo que podría configurar diferentes Insights y Blog instancias basadas en la rama.
Cuando lo termines podrás ver tu build en Travis. Si todo ha ido bien, verás algo como lo siguiente:

Y eso es todo. Ahora usted puede ir a su instancia de Faraday y comprobar el nuevo espacio de trabajo como lo hicimos en los posts anteriores.


Si entras en la sección Informe de Estado podrás ver los vulns detectados:

Conclusiones
Como puedes ver, esta implementación fue bastante fácil. Además puedes ver que los pasos para configurar el entorno fueron bastante similares a Canalizaciones Jenkins y Acciones de GitHub.

