Únase a nosotros el 30 de abril: Presentación de la prueba CT de Parasoft C/C++ para pruebas continuas y excelencia en el cumplimiento | Regístrese ahora

Implementación de análisis estático y pruebas unitarias en entornos en contenedores, parte 1

Foto de cabeza de Miroslaw Zielinski, director de gestión de productos de Parasoft
Sábado, Junio 6, 2023
11 min leer

¿Tienes curiosidad por los entornos en contenedores? Aprenda qué son, por qué su equipo debería usarlos y las mejores prácticas. Luego, analice cómo configurar Parasoft C/C++test para entornos de desarrollo en contenedores.

Comprender los entornos en contenedores

Los entornos en contenedores han ganado una popularidad significativa en los últimos años debido a su capacidad para optimizar la implementación y la gestión de aplicaciones. Un contenedor es un paquete liviano e independiente que incluye todo lo necesario para ejecutar una aplicación, incluido el código, el tiempo de ejecución, las herramientas del sistema y las bibliotecas. Encapsula la aplicación y sus dependencias, proporcionando un entorno uniforme y aislado en diferentes plataformas y sistemas operativos.

Comprender los entornos en contenedores es esencial para los desarrolladores de software, ya que revoluciona la forma en que se crean e implementan las aplicaciones. Uno de los beneficios clave de la contenedorización es su portabilidad.

Los contenedores encapsulan todo el entorno de tiempo de ejecución, incluido el código de la aplicación, las bibliotecas y las configuraciones. Esto permite a los desarrolladores crear una imagen de contenedor una vez y ejecutarla en cualquier sistema que admita la creación de contenedores, como Docker o Kubernetes. Elimina el problema de "funciona en mi máquina", ya que el contenedor se ejecuta de manera uniforme en los entornos de desarrollo, prueba y producción. Esta portabilidad simplifica en gran medida el proceso de implementación, lo que facilita mover aplicaciones entre diferentes entornos de hospedaje o escalarlas hacia arriba o hacia abajo según sea necesario.

Otra ventaja de la creación de contenedores es la capacidad de aislar aplicaciones y sus dependencias. Los contenedores utilizan la virtualización a nivel del sistema operativo para crear instancias aisladas que comparten el mismo sistema operativo host. Este aislamiento garantiza que las aplicaciones que se ejecutan en un contenedor no interfieran ni afecten a las aplicaciones de otros contenedores, lo que proporciona un entorno más seguro y estable. Los desarrolladores pueden experimentar con confianza con diferentes bibliotecas, marcos y configuraciones sin preocuparse por los conflictos o comprometer la estabilidad del sistema en general.

¿Qué es un entorno de desarrollo en contenedores?

Un entorno de desarrollo en contenedores es la práctica de usar contenedores para encapsular y administrar el entorno de desarrollo de software. Implica la creación de un entorno autónomo y aislado que incluye todas las herramientas, dependencias y configuraciones necesarias para desarrollar una aplicación.

En un entorno de desarrollo en contenedores, las herramientas de desarrollo, los lenguajes de programación, las bibliotecas y otras dependencias se empaquetan en una imagen de contenedor. Esta imagen sirve como una representación portátil y reproducible del entorno de desarrollo. Los desarrolladores pueden crear, modificar y compartir estas imágenes de contenedores para garantizar la coherencia y facilitar la colaboración entre los miembros del equipo.

Mediante el uso de tecnología de contenedorización, como Docker, los desarrolladores pueden crear contenedores ligeros e independientes que están aislados del sistema host y otros contenedores. Cada contenedor proporciona un entorno coherente y uniforme, independientemente del sistema operativo host subyacente o de la configuración de la máquina.

Los entornos de desarrollo en contenedores ofrecen varios beneficios, como garantizar la coherencia entre diferentes máquinas, entre los miembros del equipo, especialmente en el entorno de desarrollo de sistemas de software embebido, que puede ser muy complejo. Un entorno en contenedores permite a los desarrolladores trabajar con la misma pila de software, bibliotecas y configuraciones, lo que elimina los problemas de compatibilidad y reduce el tiempo dedicado a la configuración del entorno.

En otras palabras, los entornos en contenedores permiten una fácil configuración y reproducibilidad. Los desarrolladores pueden empaquetar sus aplicaciones junto con todas las dependencias requeridas en una imagen de contenedor. Esta imagen se puede compartir, lo que permite que otros configuren rápidamente el mismo entorno de desarrollo. Garantiza que la aplicación se comporte de forma coherente en diferentes entornos, lo que facilita los procesos de colaboración e implementación.

Otro beneficio de los entornos de desarrollo en contenedores es que brindan flexibilidad. Los desarrolladores pueden cambiar entre proyectos o diferentes versiones de software sin conflictos. Cada proyecto puede tener su contenedor dedicado, aislando sus dependencias y configuraciones. Esta flexibilidad permite el desarrollo paralelo y las pruebas de software. Facilita un poderoso flujo de trabajo de CI/CD al automatización del análisis estático y pruebas unitarias para cada desarrollador después de una compilación de código exitosa. Este flujo de trabajo permite código de alta calidad al encontrar defectos antes de que el código se confirme en el repositorio principal.

Además, la contenerización mejora la escalabilidad y la eficiencia de los recursos. Los contenedores son livianos y tienen una sobrecarga mínima, lo que permite a los desarrolladores hacer un uso eficiente de los recursos del sistema. Se pueden ejecutar varios contenedores en una sola máquina host, lo que permite el desarrollo y las pruebas en paralelo. Esta escalabilidad es beneficiosa cuando se trabaja en proyectos grandes o sistemas distribuidos.

¿Por qué utilizar un entorno de desarrollo en contenedores?

El uso de un entorno de desarrollo en contenedores ofrece varias ventajas para los equipos de desarrollo de software. Estas son algunas de las razones por las que los desarrolladores deberían adoptar la creación de contenedores.

  1. Asegura la consistencia. Los contenedores garantizan la coherencia entre diferentes entornos de desarrollo y miembros del equipo. Con la creación de contenedores, todos trabajan con la misma pila de software, bibliotecas y configuraciones. Esto elimina el problema de "funciona en mi máquina" y reduce los problemas de compatibilidad, lo que permite una colaboración más fluida y una incorporación más sencilla de los nuevos miembros del equipo.
  2. Facilita la reproducibilidad. La creación de contenedores permite a los desarrolladores empaquetar sus aplicaciones junto con todas las dependencias necesarias en una imagen de contenedor. Esta imagen se puede compartir con otros, lo que garantiza que todos tengan un entorno de desarrollo idéntico. Simplifica el proceso de configuración y garantiza que la aplicación se comporte de forma coherente en diferentes entornos, desde el desarrollo hasta la producción.
  3. Garantiza la flexibilidad. Los entornos de desarrollo en contenedores brindan flexibilidad al aislar dependencias y configuraciones dentro de los contenedores. Los desarrolladores pueden cambiar fácilmente entre proyectos o diferentes versiones de software sin conflictos. Cada proyecto puede tener su contenedor dedicado, lo que permite el desarrollo paralelo y facilita la experimentación con nuevas bibliotecas o herramientas.
  4. Facilita la escalabilidad y la eficiencia. Los contenedores son livianos y tienen una sobrecarga mínima, lo que permite una utilización eficiente de los recursos del sistema. Se pueden ejecutar varios contenedores en una sola máquina host, lo que permite el desarrollo, las pruebas y la escalabilidad en paralelo. Además, los contenedores se pueden escalar fácilmente en diferentes máquinas o infraestructuras en la nube, lo que facilita el desarrollo de sistemas distribuidos y mejora la productividad.
  5. Mejora la colaboración. La contenedorización simplifica la colaboración dentro de los equipos de desarrollo. Los contenedores proporcionan un entorno portátil y coherente, lo que facilita compartir entornos de desarrollo entre los miembros del equipo. Garantiza que todos trabajen con las mismas herramientas y dependencias, lo que permite revisiones de código, depuración e intercambio de conocimientos más fluidos.
  6. Funciona bien con el control de versiones. La contenedorización se integra bien con los sistemas de control de versiones. Los desarrolladores pueden incluir los archivos de configuración del contenedor, como archivos Docker, en sus repositorios de código. Esto permite el control de versiones y el seguimiento de los cambios en el entorno de desarrollo, lo que facilita la reproducción de versiones específicas de la aplicación junto con su entorno.
  7. Optimiza la seguridad y el aislamiento. Los contenedores ofrecen seguridad mejorada al aislar las aplicaciones y sus dependencias del sistema host subyacente. Cada contenedor opera en su propio entorno aislado, lo que reduce el impacto de posibles violaciones de seguridad. Las imágenes de contenedores también se pueden escanear en busca de vulnerabilidades y las actualizaciones se pueden aplicar fácilmente, lo que garantiza un entorno de desarrollo más seguro.

Mejores prácticas para el entorno de desarrollo en contenedores

Cuando se trata de entornos de desarrollo en contenedores, seguir las mejores prácticas puede mejorar en gran medida la productividad y garantizar flujos de trabajo de desarrollo fluidos. Aquí hay algunas pautas clave a considerar.

Usar un Dockerfile

Los Dockerfiles son esenciales para definir la configuración y las dependencias de su entorno en contenedores. En lugar de configurar manualmente los contenedores, use Dockerfiles para automatizar el proceso. Comience con una imagen base, especifique las dependencias necesarias e incluya los comandos para compilar y ejecutar su aplicación. Este enfoque garantiza la coherencia y la reproducibilidad en diferentes entornos.

Aproveche la orquestación de contenedores

Las plataformas de orquestación de contenedores como Kubernetes brindan herramientas poderosas para administrar aplicaciones en contenedores a escala. Habilitan funciones como el escalado automático, el equilibrio de carga y el descubrimiento de servicios. Adoptar la orquestación de contenedores simplifica la implementación y el monitoreo, lo que facilita la administración y el escalado de sus aplicaciones de manera efectiva.

Optimice el tamaño y el rendimiento del contenedor

Mantenga las imágenes de su contenedor lo más pequeñas posible minimizando la cantidad de capas y eliminando las dependencias innecesarias. Las imágenes más pequeñas son más rápidas de crear, transferir e implementar. Además, asegúrese de que sus contenedores estén configurados correctamente para la gestión de recursos. Puede usar Parasoft C/C++test para simplificar el proceso de creación de una imagen de contenedor. Con Parasoft C/C++test, puede establecer fácilmente límites de recursos y solicitudes de manera adecuada para evitar que los contenedores consuman recursos excesivos y afecten el rendimiento de otros contenedores.

Automatice la configuración del entorno de desarrollo

La configuración manual de los entornos de desarrollo puede llevar mucho tiempo y ser propensa a errores. En su lugar, automatice el proceso utilizando herramientas de administración de configuración como GitHub o herramientas de aprovisionamiento como Vagrant. Con la automatización, puede activar o desactivar rápidamente entornos de desarrollo en contenedores con solo unos pocos comandos, lo que reduce el tiempo de configuración y garantiza la coherencia en todo el equipo.

Implementar prácticas de seguridad

Los contenedores deben tratarse como entidades efímeras y desechables. Actualice periódicamente las imágenes de su contenedor y las imágenes base para incluir los parches de seguridad más recientes. Evite ejecutar contenedores con privilegios innecesarios y aplique controles de acceso estrictos para minimizar el riesgo de acceso no autorizado. Además, considere escanear imágenes de contenedores en busca de vulnerabilidades utilizando herramientas como Clair o Anchore.

Imágenes de contenedores de control de versiones

Trate las imágenes de contenedores como artefactos de código y aproveche los sistemas de control de versiones para administrarlos. Mantener un historial de versiones de las imágenes de su contenedor le permite volver fácilmente a un estado anterior si surgen problemas. Además, el uso de un registro de contenedor permite una fácil distribución y uso compartido de imágenes de contenedor en todo su equipo de desarrollo.

Si bien seguir estas mejores prácticas puede garantizar entornos de desarrollo en contenedores eficientes y confiables, proporcionar calidad y confiabilidad del código en entornos en contenedores sigue siendo una preocupación fundamental para los desarrolladores. Implementación de análisis estático y examen de la unidad en entornos en contenedores ofrece una poderosa solución para hacer frente a estos desafíos. A continuación se muestra una explicación detallada de cómo los desarrolladores pueden aprovechar ParasoftC/C++ para usar contenedores Docker de manera eficiente.

Cómo configurar Parasoft C/C++test para entornos de desarrollo en contenedores

Parasoft C / C ++test es fácil de usar con contenedores Docker. Lo guiaré a través de los pasos para configurar C/C++test para que funcione en entornos de desarrollo en contenedores.

A los equipos de desarrollo integrados les encantan los contenedores Docker

Las implementaciones en contenedores de herramientas de desarrollo se están convirtiendo en el pan y la mantequilla de los equipos de desarrollo integrados. Aunque los contenedores se desarrollaron inicialmente para resolver problemas con la implementación de microservicios y aplicaciones basadas en la web, recientemente ganaron popularidad entre los equipos integrados, especialmente los equipos grandes que usan contenedores para administrar cadenas de herramientas complejas.

Cuando se trata de administrar entornos de desarrollo complejos, especialmente en el espacio crítico para la seguridad, los equipos generalmente enfrentan los siguientes desafíos:

  • Sincronizar actualizaciones para todo el equipo a una nueva versión de una herramienta como un compilador, construir una cadena de herramientas, etc.
  • Reaccionar dinámicamente a un nuevo parche de seguridad para la biblioteca o el kit de desarrollo de software (SDK) y similares.
  • Garantizar la coherencia de la cadena de herramientas para todos los miembros del equipo y la infraestructura automatizada (CI / CD).
  • Capacidad para versionar el entorno de desarrollo y restaurarlo para dar servicio a la versión anterior del producto que se certificó con la cadena de herramientas específica.
  • Incorporación y creación de nuevos desarrolladores.

Todos estos problemas son fáciles de resolver con contenedores. ¡No es de extrañar que a los equipos les gusten los contenedores! Echemos un vistazo a cómo configurar la prueba C/C++ para usar en un entorno en contenedores.

Uso de Parasoft C / C ++ Test Professional con una cadena de herramientas de compilación en contenedores

Es fácil configurar Parasoft C / C ++ test Professional para que funcione con una cadena de herramientas de compilación y el entorno de ejecución implementado en contenedores. Admitimos implementaciones basadas en contenedores de Linux y Docker. Aquí hay una descripción general de alto nivel de cómo se ve ese tipo de configuración:

Como puede ver, la prueba C / C ++ accede al compilador en contenedor (GNU GCC) y a los entornos de ejecución. En esta configuración específica, hay dos contenedores Docker separados:

  • Uno para el compilador y las herramientas de construcción
  • Otro para el entorno de ejecución (por ejemplo, versión reducida de Linux embebido)

Veamos cómo configurar C / C ++ test Professional para que funcione con una cadena de herramientas de compilación y un entorno de ejecución en el contenedor. En el ejemplo, usaremos la última GCC imagen de contenedor disponible a través de Docker Hub.

Veamos cómo configurar C / C ++ test Professional para que funcione con una cadena de herramientas de compilación y un entorno de ejecución en el contenedor. En el ejemplo, usaremos la última GCC imagen de contenedor disponible a través de Docker Hub.

Las siguientes instrucciones asumen que tiene un Motor Docker instalado y configurado correctamente en su entorno. Y lo mismo para C/C++test Professional.

Paso 1: Inicie la prueba de Parasoft C / C ++

  1. Asegúrate de que Docker funcione. Comencemos con una prueba rápida e imprimamos el número de versión del compilador GCC incluido en la imagen "más reciente" del contenedor GCC.
  2. Antes de comenzar la prueba de Parasoft C / C ++, establecer una variable ambiental dedicada CPPTEST_CONTAINER_NAME al nombre del contenedor. Esta es una manera fácil de decirle a la prueba C / C ++ qué contenedor debe usarse para invocar el compilador o el enlazador. Funciona muy bien con los trabajos de Jenkins.
  3. Además, te recomiendo que establecer la variable CPPTEST_INSTALL para apuntar al directorio de instalación de prueba de C / C ++. Es una configuración sencilla. Una vez configuradas las variables, podemos iniciar la prueba C / C ++.
  4. Para su espacio de trabajo, seleccione una ubicación en algún lugar del directorio HOME (más sobre esto más adelante).


Paso 2: cree un proyecto de demostración

Para hacer que la creación de un proyecto de demostración sea muy simple, creemos el proyecto predeterminado "HelloWorld" usando el asistente estándar de "Nuevo proyecto".

  1. Elija el menú Archivo> Nuevo> Proyecto C ++ y luego elija “Proyecto C ++ Hello World”.
  2. Ingrese el nombre de elección para su proyecto. Debería parecerse más o menos a la siguiente captura de pantalla.
  3. Haga Clic en Acabado para crear el proyecto predeterminado para nuestro ejemplo.


Paso 3: modificar la configuración del compilador

Una vez creado el proyecto, modifique un par de elementos en la configuración de compilación de prueba de C / C ++.

  1. Haga clic derecho en el proyecto y seleccione Propiedades y luego Parasoft>C/C++test>Build Settings.
  2. En el panel Configuración de compilación, modifique dos elementos en la sección Configuración del compilador:
    • Familia. Cambie para que coincida con el compilador instalado en el contenedor. En el momento de escribir este blog, la última imagen "gcc" contenía el compilador GNU GCC 9.2, que solicitaba seleccionar la configuración del compilador "GNU GCC 9.x (x86_64)".
    • Ejecutables del compilador predeterminado. Los ejecutables predeterminados del compilador deben reemplazarse con envoltorios especiales para invocar el compilador en el contenedor en lugar del compilador normal que se instala directamente en el sistema operativo host. Estos envoltorios, remote-gcc y remote-g ++, se envían en la distribución de prueba C/C++. En la siguiente captura de pantalla, estoy usando una variable ambiental auxiliar para el directorio de instalación de prueba de C/C++. Puede establecer una variable similar para su entorno o usar rutas completas para ubicar los scripts de ajuste.


Paso 4: Verifique que el contenedor se esté ejecutando

Asegúrese de que el contenedor con su cadena de herramientas de compilación esté funcionando antes de usar la prueba Parasoft C / C ++.

Los contenedores del compilador que configuramos en el paso anterior están diseñados para ejecutar los comandos del compilador en el contenedor en ejecución, lo que es más rápido que iniciar el contenedor para cada invocación.

Implementaciones de CI / CD, iniciar el contenedor antes de que se ejecute la prueba de C / C ++ y detenerlo después puede ser parte del trabajo de Jenkins. En este ejemplo, asumimos que se utiliza una base de GUI. Podemos crear configuraciones de ejecución de eclipse para este propósito. Sugiero crear dos configuraciones de tipo "Aplicación C / C ++" y nombrarlas de la siguiente manera:

  • "Iniciar contenedor de gcc"
  • "Detener contenedor de gcc"
  1. Seleccione el menú Ejecutar> Ejecutar configuraciones ...
  2. Cree dos configuraciones de ejecución denominadas "Iniciar contenedor gcc" y "Detener contenedor gcc".
  3. En la pestaña Principal para ambas configuraciones, ingrese su ruta a Docker como la "Aplicación C / C ++" como se muestra a continuación:

  1. "Iniciar contenedor de gcc", en la pestaña de argumentos ingrese el siguiente comando:

style = ”padding-left: 40px;”>ejecutar –rm -d -it –name gcc -v $ {env_var: HOME}: $ {env_var: HOME}
-v
$ {env_var: CPPTEST_INSTALL}: $ {env_var: CPPTEST_INSTALL} gcc

Como se muestra en la siguiente captura de pantalla:


La parte interesante de este comando son las opciones -v, que se utilizan para mapear volúmenes.

La primera opción -v asigna el directorio HOME local al sistema de archivos contenedor. La intención aquí es permitir el acceso al código fuente para el compilador que opera dentro del contenedor y también para la prueba Parasoft C / C ++, que se ejecuta en el sistema operativo host.

Estoy usando HOME en mi ejemplo por conveniencia porque coloqué mi espacio de trabajo directamente en HOME.

Para configuraciones reales, puede mapear estrictamente solo la parte del sistema de archivos que contiene el árbol de origen y el espacio de trabajo de eclipse con el proyecto.

La segunda opción -v asigna la ubicación del directorio de instalación de prueba de C / C ++ para permitir el acceso a los archivos de encabezado de prueba de C / C ++ dentro del contenedor.

  1. "Detener contenedor de gcc", en la pestaña de argumentos ingrese el siguiente comando como se muestra en la imagen a continuación:

detener gcc

  1. Usemos la configuración de ejecución "Iniciar contenedor gcc" para ejecutar el contenedor.

La consola de Eclipse debería mostrarle el hash del contenedor. Para asegurarse de que todo esté bien, puede cambiar a la línea de comando e invocar el siguiente comando:

Si ve nuestro contenedor "gcc" en la lista, puede comenzar a usar la prueba C / C ++ para probar su código.

  1. Seleccionemos el proyecto en el navegador. En el menú de Parasoft, seleccione Probar usando> Integrado> Prueba unitaria> Generar pruebas unitarias.

Debería ver un nuevo directorio de "pruebas" creado dentro de su proyecto con una única prueba unitaria creada para la función "principal".

  1. Una vez que se generan los casos de prueba, está listo para ejecutarlos. Para la ejecución, seleccione Probar usando> Integrado> Prueba unitaria> Ejecutar pruebas unitarias en el contenedor.

La prueba C / C ++ debería invocar una colección de compilaciones en el contenedor y vincular líneas de comando, terminando con una creación y ejecución binaria de prueba en el contenedor.

¡Eso es! Con estos pasos, preparó la prueba de Parasoft C / C ++ para realizar actividades de prueba utilizando la cadena de herramientas de compilación en el contenedor.

Si necesita cambiar el compilador de un proyecto o modificar algo en el entorno de ejecución en tiempo de ejecución, puede actualizar la imagen del contenedor o cambiarla a una versión diferente. (Recuerde actualizar la variable CPPTEST_CONTAINER_NAME).

¿Quieres aprender más? Leer parte 2 donde explico cómo implementar análisis estáticos y pruebas unitarias usando Parasoft C/C++test Standard en un contenedor Docker.

Vea cómo los contenedores y la prueba de Parasoft C/C++ se adaptan a su proceso de CI/CD y aumentan la productividad.