Hemos estado creciendo como compañía, nuestros productos se están expandiendo y nuestras actividades y esfuerzos relacionados con DevOps también están creciendo: hemos cambiado de Bamboo a una Jenkins más flexible y configurable, utilizando tuberías de implementación y otros complementos; cambió a Ansible y comenzó a usar Docker aquí y allá internamente.
Todas estas cosas requieren un cierto nivel de codificación o configuración: scripts y configuraciones Ansible, scripts geniales de Jenkins, Dockerfiles y configuraciones YAML.
Por ahora, hemos creado una por separado "operaciones" repositorio con los directorios de alto nivel para jenkins
, ansible
, docker
y other
(lo que es un nombre terrible, pero por ahora todas las cosas "otros" DevOps de automatización están allí).
Nuestro enfoque no se siente bien y podría no escalar, pero ¿cuáles son las mejores prácticas y recomendaciones para mantener el código relacionado con DevOps en un repositorio o repositorios de código?
Respuestas:
La organización actual del código y la configuración que describe está estructurada por las soluciones técnicas involucradas. Este es un mal diseño que agregará muchos gastos generales en nuestras actividades de mantenimiento y también agregará muchas trampas en nuestro camino. En cambio, esa organización debería estructurarse en torno a los artefactos que estamos implementando.
La razón de esto es que queremos considerar los artefactos ( por ejemplo, una imagen acoplable o un paquete de software) como los objetos de los siguientes verbos:
considerar un conjunto mínimo de tareas automatizadas que queremos realizar. Si queremos cambiar algo sobre cómo se implementa el verbo de prueba, es fácil visitar la carpeta correspondiente a ese artefacto en el repositorio apropiado y luego descubrir los elementos de automatización específicos de jenkins que deben actualizarse. En cambio, si las recetas de automatización están estructuradas en torno a soluciones técnicas, entonces necesitamos averiguar de la nada que Jenkins está involucrado en los procedimientos de prueba y encontrar allí los elementos de automatización relacionados con el artefacto. En situaciones complejas, la organización en torno a las soluciones técnicas hace que las actualizaciones sean muy difíciles, porque tenemos que conocer a priori todas las soluciones técnicas involucradas en algún servicio para actualizarlas en consecuencia.
Por ejemplo, un repositorio que contiene el código de un sitio web y un microservicio "a" podría tener los siguientes subdirectorios dedicados a las operaciones:
cada uno con tres guiones llamados
build
,test
ydeploy
. Ahora que la organización de los elementos de automatización se ha aclarado de alguna manera, volvamos nuestra atención a la configuración.El
deploy
verbo establece las principales condiciones y requisitos sobre la organización de la configuración cuando se aplica a un artefacto similar a un servicio. Eldeploy
verbo debe tener los siguientes parámetros:Desde la perspectiva operativa, este desglose de la parametrización coincide con los grados naturales de libertad del problema de implementación, aparte de las credenciales que podrían agruparse con la configuración de tiempo de ejecución, pero es mejor separarlas para evitar distribuirlas descuidadamente.
fuente
Puedo responder sobre Docker, una de las mejores prácticas para usar Docker es mantener el archivo Docker y los archivos de composición en el mismo repositorio del proyecto, por lo que donde sea que clones el proyecto puedes construir la imagen del Docker, y es bueno mantenga múltiples versiones de los archivos de composición de Docker, por ejemplo (prod, staging, dev) para que pueda construir la imagen y ejecutar el contenedor con una opción específica para cada entorno, por ejemplo, para la máquina de desarrollo, puede usar una red específica y ejecutar más contenedores de dependencias o lo que sea.
fuente
El código de cada herramienta entra en su propio repositorio. por ej.
Esto lo ayudaría a escalar mejor en términos de orquestación de procesos y mantener varias ramas para cada entorno
Esto le daría un control más granular y descargaría todos sus gastos generales de control de versiones a los sistemas de control de versiones. También cree ramas separadas para cada entorno y etiquete el código para cada versión de producción (como lo hacemos para la base del código de la aplicación). Piense en Infra y procese en términos de código. (Cualquier cambio en el proceso debe ser codificado y enviado a QA, SIT, UAT y luego a PROD) similar a la aplicación.
Por ejemplo, puede tener V2.1 de Ansible ejecutándose en Producción (rama maestra) pero V2.0 de contenedores acoplables ejecutándose en Prod (rama maestra)
Del mismo modo, mantenga sus scripts de DB / scripts de bash en sus propios repositorios y tal vez pueda tener un archivo de comprobación de estado (JSON / YAML) configurado para mostrar las versiones de todas las herramientas / partes en cada URL implementada para fines de seguimiento y automatización. (Para que sus webhooks lean la URL y automaticen las implementaciones)
fuente
Hacer una distinción entre Ops, Dev y DevOps promueve el aislamiento y aplica una mentalidad de "tirarlo por la pared". Para aumentar la cooperación entre los equipos, uno debe poner todo en un repositorio que se requiere para construir y desplegar el proyecto.
Dicho esto, la respuesta a la pregunta:
es que si se requiere config para ejecutar el proyecto, entonces uno debe ponerlo en el mismo directorio.
fuente