Seminario web destacado: MISRA C++ 2023: todo lo que necesita saber | Vea ahora

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

Foto de cabeza de Miroslaw Zielinski, director de gestión de productos de Parasoft
9 de junio de 2023
6 min leer

Es posible que haya leído en una publicación anterior sobre cómo aplicar SAST y pruebas unitarias en un entorno en contenedores. Aquí hay una continuación sobre cómo puede implementar adecuadamente el análisis estático y las pruebas unitarias utilizando Parasoft C/C++test Standard en un contenedor Docker.

Importancia de la contenedorización para pruebas y análisis estático

Los contenedores son una tecnología de empaque evolutiva, estandarizada y portátil que se está implementando directamente en los flujos de trabajo de desarrollo Agile modernos como DevOps/DevSecOps. Los contenedores se introdujeron por primera vez para el desarrollo y la implementación de aplicaciones web y microservicios, donde obtuvieron una amplia adopción en la industria de TI. Hoy en día, la industria integrada utiliza contenedores de forma extensiva.

Los contenedores ofrecen una reproducción rápida de entornos idénticos para el desarrollo integrado, las pruebas de software, la puesta en escena y la producción en cualquier fase del SDLC.

La implementación de contenedores proporciona varios beneficios.

  • Acelera el tiempo de desarrollo de software al mercado.
  • Mejora la seguridad, la protección y la confiabilidad del código.
  • Ayuda a gestionar la creciente complejidad de los ecosistemas de desarrollo.
  • Ofrece la capacidad de responder dinámicamente a las pruebas de entrega de software en un mercado rápido y en continua evolución.

Explicación de Docker & Container Images

Es importante comprender la arquitectura del contenedor. Vayamos a través de una descripción rápida. Un contenedor es una aplicación empaquetada con otros componentes o dependencias, como binarios o bibliotecas de tiempo de ejecución de lenguaje específico y archivos de configuración. Los contenedores tienen sus propios procesos, sus propias interfaces de red y montajes.

Los contenedores también están aislados entre sí y se ejecutan sobre un motor de contenedores, como Docker, para facilitar la portabilidad y la flexibilidad. Además, los contenedores comparten un sistema operativo y se ejecutan en cualquiera de los siguientes:

  • Sistemas operativos Linux, Windows y Mac
  • Máquinas virtuales o servidores físicos
  • Máquinas de desarrolladores o en centros de datos locales
  • La nube pública

También es importante comprender el papel del motor de contenedor porque proporciona funcionalidades cruciales, que incluyen:

  • Virtualización a nivel de sistema operativo
  • El tiempo de ejecución del contenedor, que administra el ciclo de vida del contenedor (ejecución, supervisión, transferencia de imágenes, almacenamiento y archivos adjuntos a la red)
  • Espacios de nombres del kernel utilizados para aislar recursos

Una imagen de contenedor es un archivo estático con código ejecutable e incluye todo lo que un contenedor necesita para ejecutarse. Por lo tanto, un contenedor es una instancia en ejecución de una imagen de contenedor. C/C++test se envía con una imagen de contenedor de ejemplo, pero para ser más específicos, es un archivo de Docker.

Cómo crear una imagen de contenedor

Parte 1 de esta publicación discutió los beneficios de usar contenedores para implementar cadenas de herramientas de desarrollo integradas. Mostró cómo configurar Parasoft C / C ++ test Professional para trabajar con la cadena de herramientas de compilación y el entorno de ejecución de pruebas implementado en un contenedor.

Ahora, veamos cómo crear una imagen de contenedor con Parasoft C / C ++ test Standard. Demostraré un ejemplo simple con una ejecución de análisis estático en el contenedor.

Implementar el estándar de prueba Parasoft C / C ++ en un contenedor Docker

Como herramienta basada en la línea de comandos, Parasoft C/C++test Standard es adecuado para implementaciones en contenedores. Puede empaquetarse con el compilador y el sistema de compilación en una imagen de contenedor y usarse para CI/CD e implementarse en los escritorios de los desarrolladores para los escaneos de la línea de comando local. La siguiente imagen muestra la descripción general de alto nivel de esta configuración:

El diagrama muestra a Jenkins usando la prueba C / C ++ en contenedores para ejecutar análisis estático. En esta configuración específica, la prueba de Parasoft C / C ++, la cadena de herramientas de compilación y las herramientas de compilación se implementan en el contenedor que se muestra en la esquina superior derecha del diagrama.

El contenedor debajo de él, en la parte inferior derecha, proporciona el entorno de ejecución, que puede ser necesario para ejecutar pruebas en tiempo de ejecución, como pruebas unitarias o pruebas de nivel de sistema automatizadas.

Si pretendemos implementar solo análisis estático, lo más probable es que nuestra configuración incluya solo un tipo de contenedor con la cadena de herramientas de compilación y la prueba Parasoft C / C ++.

Crear una imagen de contenedor con la prueba de Parasoft C / C ++

Si aún no lo ha hecho, por favor instale la última versión de Parasoft C/C++test para Linux.

Para simplificar el proceso de creación de una imagen de contenedor con la prueba C / C ++, la última versión se envía con un ejemplo de Dockerfile. Puede encontrar este Dockerfile en la siguiente ubicación:

/ integración / docker / Dockerfile

Este simple Dockerfile se enfoca solo en los pasos de prueba C / C ++ requeridos para construir la imagen. En la mayoría de los casos del mundo real, deberá fusionar este archivo con su Dockerfile.

Antes de analizar el contenido en el Dockerfile de ejemplo, veamos cómo funciona. Mi ejemplo asume la siguiente estructura de archivo simple:

style = ”tamaño de fuente: 13px;”>$ HOME / sandbox / parasoft_cpptest_standard-2020.1.0-linux.x86_64.tar.gz

1. Descomprima la distribución de prueba C / C ++.

  • cd $ HOME / caja de arena
  • tar xzf parasoft_cpptest_standard-2020.1.0-linux.x86_64.tar.gz

2. Copie el Dockerfile de ejemplo de la distribución

  • cp cpptest / integration / docker

3. Prepare un archivo de propiedades para la prueba C / C ++ con la información sobre la licencia. Usaremos el archivo cpptestcli.properties predeterminado como base, así que lo copiaremos a nuestro directorio de trabajo:

  • cp cpptest / cpptestcli.properties

Edítelo para insertar la información sobre la ubicación del servidor de licencias. Utilice su editor favorito para configurar la información de licencia. Guarde el archivo cuando haya terminado.

4. Edite el Dockerfile y elimine el comentario de la línea número 13 (en la que se copia el archivo cpptestcli.properties del directorio local a la ubicación en los contenedores). La línea en el Dockerfile debería verse así:

  • COPIA cpptestcli.properties / opt / parasoft / cpptest

5. Ahora, estamos listos para crear la imagen de Docker. Ejecute el comando para construir la primera imagen con la prueba C / C ++. El nombre de la imagen es "cpptest_ci_image".

  • ventana acoplable construir -t cpptest_ci_image

Docker tardará un tiempo en analizar su caché y descargar la imagen base requerida. Una vez hecho esto, la distribución de prueba de C / C ++ se copia e instala en la imagen. Después de uno o dos minutos, la imagen debería estar lista. Confirme ejecutando el comando para listar todas las imágenes:

  • Docker image -list

En la salida, debería ver "cpptest_ci_image" en la parte superior. Genial, tenemos una imagen construida y lista. ¡Ahora es el momento de probarlo!

Prueba la imagen del contenedor

Para una prueba simple, use una de las líneas de comando auxiliares / ejemplares proporcionadas dentro del Dockerfile.

Use su editor favorito para abrir el Dockerfile y desplácese hacia abajo hasta la parte inferior de los archivos. Debería ver un par de líneas de comando de ejemplo como esta:

Usemos la línea de comando de la línea 26 para ejecutar un análisis estático en el contenedor en uno de los ejemplos de prueba de C / C ++ enviados con la distribución.

Dado que decidimos incorporar el archivo cpptestcli.properties con la información de licencia en el contenedor, podemos simplificar la línea de comandos y eliminar la opción -settings. La línea de comando para la prueba debería verse así:

  • docker run –rm -v $ PWD: $ PWD -w / opt / parasoft / cpptest / examples / ATM cpptestcli -compiler gcc_9-64 -module. -traza limpiar todo

¡Voila! El análisis estático se ejecutó en el contenedor. Los resultados se informaron en la consola.

Podríamos configurar aún más la herramienta para producir el informe HTML en el sistema de archivos local, pero esa es otra historia. Nuestro objetivo principal era crear el contenedor con C/C++test dentro y configurarlo para ejecutar análisis estáticos. Logramos el objetivo.

Configurar un servidor CI con análisis estático

Si necesita configurar un servidor CI con análisis estático como parte del proceso, su tarea es mucho más sencilla. Simplemente acceda al contenedor. Lo mismo ocurre si los desarrolladores de su equipo desean ejecutar un análisis estático.

¿Necesita actualizar Parasoft C/C++test a la última versión? ¡Simplemente descargue la distribución, reconstruya la imagen de su contenedor y listo! El equipo y la infraestructura automatizada ni siquiera notarán esta operación. Suave, fácil y reversible, si es necesario.

Acerca del contenido de Dockerfile

Antes de terminar, veamos el contenido del Dockerfile enviado con la prueba Parasoft C / C ++ que se usó para crear nuestra imagen. La siguiente imagen muestra el contenido de / integración / docker / Dockerfile.

Aquí están los detalles:

  • Línea 2 especifica el centro de Docker de la imagen GCC, en el que se basa la imagen del contenedor.
  • Línea 4 configura el directorio de trabajo para los comandos subsiguientes que se ejecutarán en este script.
  • Línea 7, estamos copiando la distribución de prueba de C / C ++ (archivo) en la imagen del contenedor.
  • Línea 10 extrae la distribución en la ubicación del contenedor: / opt / parasoft (observe el comando WORKDIR de la línea 4)
  • Línea 13 copia el archivo cpptestcli.properties personalizado del directorio local en la instalación en el contenedor de la prueba C / C ++. Este paso es opcional y por defecto está comentado. En la mayoría de los casos, querrá tener algunas propiedades integradas en la instalación de la prueba C / C ++. El escenario más típico es la configuración de la licencia, que incluirá la ubicación del servidor de licencias, las credenciales, etc.
  • Línea 16 elimina el archivo de distribución. Esto es solo una limpieza.
  • Línea 18 restablece el workdir a / home (opcional)
  • Línea 19 especifica el ejecutable que se ejecutará cuando se inicie el contenedor.

Esto es todo lo que se necesita para crear un contenedor simple con la prueba Parasoft C / C ++ que esté listo para ejecutar análisis estáticos.

Como mencioné, este es un Dockerfile simple. Se agregó a la distribución del producto para brindarle un ejemplo de lo que puede necesitar para crear una imagen de contenedor para su entorno. Deberá adaptarlo a sus necesidades o fusionarlo con Dockerfiles existentes.

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