Artículos técnicos

Integración continua con contenedores Docker, GitLab Runner y CI/CD Automation for Simulink Check

Por Dalton L'Heureux, MathWorks


Introducción

La importancia de la confiabilidad e integridad del software continúa aumentando a medida que los sistemas se vuelven más complejos e interconectados. A pesar de la adhesión a prácticas recomendadas de ingeniería establecidas, el desarrollo de sistemas de alta integridad sigue siendo una tarea técnicamente exigente y financieramente intensiva. Dado el esfuerzo sustancial que implica el trabajo de revisión, análisis, pruebas y regresión, los ingenieros siempre buscan una forma de reducir gastos y al mismo tiempo mejorar la calidad general del software. Una de las últimas tendencias ha sido el impulso hacia soluciones de integración continua y despliegue continuo (CI/CD).

Las prácticas de CI/CD han transformado el desarrollo de software, permitiendo la entrega rápida y consistente de software de alta calidad. Pero el rápido avance de esta tecnología, junto con la cantidad de herramientas disponibles, puede hacer que crear una solución CI/CD robusta sea extremadamente difícil. Este artículo presenta un enfoque integral para implementar cadenas de tareas de CI/CD usando GitLab® Runner, Docker® y CI/CD Automation for Simulink Check™.

Importancia de CI/CD para el desarrollo y la certificación de software crítico en materia de seguridad

CI/CD son prácticas esenciales en el desarrollo de software moderno, especialmente para sistemas críticos en materia de seguridad como los que se utilizan en las industrias de atención médica, automoción y aeroespacial. La implementación de una solución CI/CD eficiente puede ayudar a mejorar la calidad y la confiabilidad, proporcionar una detección y solución más rápida de problemas, y garantizar el cumplimiento continuo de los estándares regulatorios. Dado que un solo cambio en los requisitos puede provocar una cascada de trabajo de regresión, contar con un sólido proceso de CI/CD es esencial para gestionar de manera rentable cualquier programa de desarrollo de software crítico en materia de seguridad.

Este artículo presenta los pasos para configurar herramientas fuera del entorno de modelado nativo para integrarlas con el conjunto de herramientas de MATLAB® y Simulink®.

  • Simulink Check Process Advisor
  • GitLab y GitLab Runner
    • Configuración de cadenas de tareas de CI/CD de GitLab
  • Docker
    • Crear imagen de Docker
    • Argumentos de compilación
    • Compilar imagen y lanzar contenedor
    • Ejecutar GitLab Runner para esperar tareas
    • Pruebas y solución de problemas de la imagen de Docker

Simulink Check Process Advisor

La app Process Advisor, disponible como parte de CI/CD Automation for Simulink Check, es una herramienta poderosa para desarrollar una cadena de tareas de diseño basada en modelos dentro del entorno de MATLAB que se puede emplear en un entorno externo a través del archivo de plantilla .yml proporcionado. Para desarrolladores de modelos que deseen configurar una secuencia de procesos dentro del entorno de MATLAB, consulte la siguiente documentación:

  1. Configuración de un modelo de proceso: Personalizar el modelo de proceso
  2. Automatización de la verificación y validación de modelos: Automatizar y ejecutar tareas con Process Advisor
  3. Prácticas recomendadas para Process Advisor: Prácticas recomendadas para crear modelos de procesos

GitLab y GitLab Runner

Si ya está listo para trasladar el modelo de proceso a una cadena de tareas CI/CD en GitLab, puede usar un único enforque para garantizar que las actualizaciones de modelo de proceso de Simulink se reflejen automáticamente en la cadena de tareas de GitLab: En lugar de recrear elvmodelo de proceso en un archivo .yml estático, utilizamos un archivo .yml que genera otro archivo .yml que contiene las tareas actuales en el modelo de proceso. Consulte el archivo de configuración de cadena de tareas de ejemplo (.gitlab-ci.yml) en el Apéndice A Tenga en cuenta que hay dos etapas:

stages: 
 - SimulinkPipelineGeneration 
 - SimulinkPipelineExecution

La primera etapa genera la cadena de tareas para la segunda etapa.

En este momento, es importante considerar cómo licenciar las herramientas de modelado y verificación utilizadas en la cadena. Un enfoque es utilizar tokens por lotes. Para utilizar tokens por lotes, debes solicitar uno a la fase piloto de licencias por lotes e incluirlo en la sección de variables de su archivo .yml.

variables: 
 MLM_LICENSE_TOKEN: "<MATLAB_BATCH_TOKEN>"

No todos los productos admiten tokens por lotes. En ese caso, deberá utilizar un archivo de licencia común (.lic). Para más información sobre tokens por lotes consulte: Tokens de licencia por lotes de MATLAB. Se recomienda no codificar tokens e información de credenciales en .yml o Dockerfile. Para un enfoque más seguro, considere crear una imagen de Docker usando variables de entorno.

Configuración de cadenas de tareas de CI/CD de GitLab

Configurar un proyecto GitLab para administrar trabajos es sencillo. Primero debe asegurarse de que GitLab sepa dónde encontrar el archivo .yml. En Settings > CI/CD > General cadena de tareass > CI/CD configuration file, proporcione la ruta al archivo .yml del proyecto, denominado “.gitlab-ic.yml” (Figura 1).

Configuración de cadena de tareas CI/CD de GitLab, donde los usuarios especifican la ruta al archivo .yml, para configurar correctamente las compilaciones automatizadas.

Figura 1. Configuración de la cadena de tareas CI/CD de GitLab.

A continuación, deberá crear un nuevo ejecutor en GitLab. Esto proporcionará gitlab-runner-token que luego se usa para registrar el contenedor Docker en la instancia de ejecución de GitLab Runner (Figura 2).

Imagen que muestra la página de configuración de GitLab Runner, que guía a los usuarios sobre cómo administrar los ejecutores para ejecutar tareas de CI/CD.

Figura 2. Configuración de GitLab Runner.

En Settings > CI/CD > Runners > New project runner, proporcione una etiqueta y haga clic Create Runner (Figura 3).

Interfaz de GitLab para crear un nuevo ejecutor de proyecto, incluidos campos para la entrada de etiquetas y un botón para iniciar la creación de un ejecutor de cadena de tareas.

Figura 3. Creacion de un nuevo ejecutor en GitLab.

Una vez creado el ejecutor, copie y guarde el token de autenticación del ejecutor (Figura 4).

Token de autenticación del ejecutor de GitLab, que resalta la importancia de guardar el token de forma segura para futuros registros del ejecutor.

Figura 4. Token de autenticación del ejecutor. ¡No lo pierda!

Docker

Crear imagen de Docker

Podría decirse que esta es la parte más difícil del proceso, ya que debe asegurarse de que la imagen de Docker no solo tenga todas las dependencias de herramientas instaladas, sino que también tenga licencia para usar esas herramientas. Cabe señalar que la imagen de Docker puede basarse en cualquiera de las numerosas distribuciones de sistema operativo. Este ejemplo utiliza Ubuntu 22.04.

Comience por instalar todas las herramientas necesarias para ejecutar el modelo de proceso de Simulink y los ejecutores de GitLab. En Dockerfile, extraiga una imagen base de MATLAB:

FROM mathworks/matlab-deps:${MATLAB_DOCKER_RELEASE}

Posteriormente, procederá a instalar algunas de las dependencias básicas necesarias. Tenga en cuenta que las variables de compilación se analizarán más adelante. Vea el Dockerfile de ejemplo en el Apéndice B para el desglose completo de la instalación. El Dockerfile comienza con la instalación de dependencias para MPM, que luego se utilizarán para instalar productos de MATLAB y Simulink necesarios (excepto Simulink Code Inspector™). A continuación, instale las dependencias para matlab-proxy. Una vez instalados, utilice MPM para instalar las herramientas necesarias y configurar el método de licencia. Tenga en cuenta que también necesitará instalar gitlab-runner en la imagen de Docker y regíistrarla usando el gitlab-runner-token guardado anteriormente. El siguiente fragmento muestra cómo instalar y registrar usando las opciones de configuración deseadas:

RUN curl -L 
 "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash && \ 
 sudo apt-get install --no-install-recommends --yes \ 
 gitlab-runner && \ 
 sudo apt-get clean && sudo apt-get autoremove && \ 
 gitlab-runner start && \ 
 sudo gitlab-runner register --non-interactive \ 
 --url "<gitlab-url>" \ 
 --token "${GITLAB_TOKEN}" \ 
 --docker-image ${IMAGE_NAME} \ 
 --executor "shell"

Como se muestra en el Dockerfile, MPM puede instalar todas las herramientas de MATLAB y Simulink necesarias excepto Simulink Code Inspector. Para Simulink Code Inspector, necesitará descargar un archivo .iso desde el sitio web de MathWorks e instalarlo con ese archivo. Consulte mpm install para obtener más información.

Ahora que los productos están instalados, necesita configurar el método de licencia. Actualmente hay tres métodos disponibles para conceder licencias:

  • Usar un token por lotes: Instale matlab-batch para habilitar el uso de tokens de licencia por lotes de MATLAB. Tenga en cuenta que Polyspace Code Prover Server™ y Polyspace Bug Finder Server™ no admiten licencias de tokens por lotes y el uso de Polyspace Code Prover™ y Polyspace Bug Finder™ para escritorio en entornos CI/CD infringe el acuerdo de licencia de software. Para instalar matlab-batch, agregue lo siguiente a su Dockerfile:
    • RUN wget -q https://ssd.mathworks.com/supportfiles/ci/matlab-batch/v1/glnxa64/matlab-batch \ 
          && sudo mv matlab-batch /usr/local/bin \ 
          && sudo chmod +x /usr/local/bin/matlab-batch
      
  • Usar un servidor de licencias: Especifique el host y el puerto de la máquina que sirve las licencias de red si desea vincular la información de la licencia como una variable de entorno. Esta es la opción preferida para conceder licencias. Puede utilizar lo siguiente:
    • --build-arg LICENSE_SERVER=27000@MyServerName
      
    • Alternativamente, puede especificar el servidor de licencias directamente en Dockerfile usando:
    • ENV MLM_LICENSE_FILE=27000@flexlm-server-name
      
  • Utilizar un archivo de licencia (.lic): No se aconseja colocar un archivo de licencia directamente en un contenedor. No obstante, como alternativa, puede montar una unidad en el contenedor que contenga los archivos de licencia necesarios. Cuando utilice una unidad montada para el archivo de licencia, incluya una de las siguientes líneas en el Dockerfile de ejemplo:
    • COPY ${PATH_TO_LICENSE} /opt/matlab/licenses/
      
    • ADD ${PATH_TO_LICENSE} /opt/matlab/licenses/
      

Por último: en caso de dependencias instaladas, algunos informes requieren una pantalla para imagenes de los modelos. Xvfb proporciona una pantalla virtual para las tareas padv.builtin.task.GenerateSDDReport, padv.builtin.task.GenerateSimulinkWebView, y padv.builtin.task.GenerateModelComparison. Se deben instalar como parte de las dependencias de MPM. Asegúrese de que MPM esté instalado por el usuario que ejecutará la cadena de tareas.

Argumentos de compilación

En este ejemplo, Dockerfile está configurado para aceptar varios argumentos de compilación. Los argumentos de compilación pueden ser valiosos para mantener un Dockerfile que se puede usar para compilar múltiples imágenes o para permitir que los usuarios pasen información de compilación que puede cambiar con el tiempo o que no se desea codificar en el mismo Dockerfile.

Este Dockerfile contiene los siguientes argumentos de compilación (--build-arg):

# docker build      --build-arg MATLAB_DOCKER_RELEASE=<matlab-docker-release> 
#      --build-arg MATLAB_VERSION=<matlab-release> 
# --build-arg GITLAB_TOKEN=<gitlab-token> 
# --build-arg MATLAB_BATCH_TOKEN=<matlab-token> 
# --build-arg IMAGE_NAME=<image-image> 
# --build-arg PATH_TO_LICENSE=<path-to-license>

Al comienzo del Dockerfile, puede especificar el valor predeterminado para cada argumento en caso de que no se proporcione un valor al comando de compilación:

ARG MATLAB_DOCKER_RELEASE=r2023b-ubuntu22.04 
ARG MATLAB_VERSION=r2023b 
ARG MATLAB_BATCH_TOKEN="<USER>|TOKEN_ML|<TOKEN>" 
ARG GITLAB_TOKEN=<TOKEN> 
ARG IMAGE_NAME=matlab_image 
ARG PATH_TO_LICENSE=<PATH_TO_LICENSE>

Despues de la instrucción FROM en el Dockerfile, debe declarar las variables que se utilizarán:

FROM mathworks/matlab-deps:${MATLAB_DOCKER_RELEASE}
 
ARG MATLAB_VERSION
ARG MATLAB_BATCH_TOKEN
ARG GITLAB_TOKEN
ARG IMAGE_NAME
ARG PATH_TO_LICENSE

Tenga en cuenta en el fragmento mencionado que el valor de MATLAB_DOCKER_RELEASE se referencia con la sintaxis ${<var>}.

Compilar imagen y lanzar contenedor

Ahora que Dockerfile está listo, puede crear el primer contenedor desde la terminal Docker:

  • Desde la terminal Docker, escriba cd en la ubicación del Dockerfile y verifique:
> cd <path-to-dockerfile> 
> ls
  • Crear la imagen de Docker:
> docker build -t <image-name> -f <dockerfile-name>

Si el archivo Docker usa argumentos de compilación, el comando de compilación tendrá este formato:

> docker build --build-arg PATH_TO_LICENSE=<path-to-license> --build-arg GITLAB_TOKEN=<gitlab-runner-token> --build-arg MATLAB_BATCH_TOKEN="<USER>|TOKEN_ML|<TOKEN>" -t <image-name> -f <dockerfile-name>

Una vez creado el contenedor, puede ejecutarlo desde Docker usando la interfaz de usuario o desde la terminal:

> docker run --name <container_name> -v <optional_volume> <image_name>:latest

Dockerfile ya registró la imagen como gitlab-runner. Para confirmarlo, vea el archivo /etc/gitlab-runner/config.toml dentro de Docker y verifique que el ejecutor correcto esté registrado (Figura 5).

Archivo config.toml dentro de un contenedor Docker, que confirma que el ejecutor de GitLab se ha registrado correctamente con la imagen de Docker.

Figura 5. Verificar que un ejecutor de GitLab se haya registrado correctamente con una imagen de Docker.

Si el registro del ejecutor es incorrecto o necesita cambiarse o reiniciarse, use lo siguiente en la terminal de la imagen de Docker para anular el registro del ejecutor y restaurar el ejecutor correcto:

> sudo gitlab-runner unregister --token "<gitlab_token>" 
> sudo gitlab-runner register --non-interactive --url "<gitlab-url>" --token "<gitlab-runner-token>" --executor "shell"

Ejecutar GitLab Runner para esperar tareas

Ahora que el contenedor está en ejecución y registrado como el ejecutor de GitLab, puede iniciar gitlab-runner y comenzar a esperar tareas (Figura 6). Desde la terminal del contenedor, inicie el ejecutor usando:

> sudo gitlab-runner run
Imagen que muestra el estado de ejecución de la cadena de tareas de GitLab, que ayuda a monitorear el progreso del trabajo y verificar ejecuciones exitosas de la cadena de tareas.

Figura 6. Ejecución y estado de la cadena de tareas de GitLab.

Hay muchas formas de iniciar una cadena de tareas, como compilaciones programadas, manuales o bajo demanda y compilaciones basadas en nuevas confirmaciones en el repositorio de GitLab (Figura 7).

Página de estado detallado de la cadena de tareas de GitLab, que permite realizar un seguimiento de las etapas y resultados de las tareas para obtener una mejor visibilidad de los procesos de CI/CD.

Figura 7. Página de estado detallado de la cadena de tareas de GitLab.

  • Compilaciones programadas: En GitLab, utilice Build > Pipeline schedule para programar cuándo se deben ejecutar las cadenas de tareas.
  • Compilaciones de confirmación: De forma predeterminada, GitLab ejecuta la cadena de tareas cada vez que se envíe contenido al repositorio. Para controlar cómo se activan las compilaciones, debe modificar el archivo .yml o agregar etiquetas específicas a los mensajes de confirmación. Consulte Controlar cómo se ejecutan los trabajos para más información.
  • Construcciones manuales: En GitLab, utilice Settings > CI/CD > Run pipeline para activar compilaciones manuales. Settings > CI/CD > Pipeline trigger tokens contiene información sobre cómo utilizar curl para activar compilaciones desde una terminal.

Una vez que ls cadena de tareas haya terminado de ejecutarse, se pueden ver y descargar los resultados del último trabajo en la cadena de tareas—Collect_Artifacts (Figura 8).

Terminal de salida de cadena de tareas de GitLab, donde los usuarios pueden ver y descargar resultados del trabajo final de cadena de tareas.

Figura 8. Terminal de salida y resultados de la cadena de tareas de GitLab.

Prueba y solución de problemas de la imagen de Docker

Al configurar la imagen de Docker, es importante poder probar cosas a lo largo del camino. A continuación se muestran algunos pasos útiles que puede realizar en la terminal del contenedor Docker para asegurarse de que todo funciona como se espera:

  1. Verifique la instalación de MATLAB desde la terminal del contenedor:
$ matlab-batch "disp('Hello, World.')"
  1. Para generar ciertos informes (SDD), MATLAB necesita una pantalla. Para esto, puedes utilizar Xvfb. Para probar Xvfb:
$ sudo xvfb-run -e /dev/stdout -a matlab-batch "disp('Hello, World.')"
  1. Ejecute manualmente la cadena de tareas de MATLAB :
    1. Clona el repositorio (es posible que se soliciten credenciales; la autenticación de dos factores requiere tokens de acceso, que se pueden encontrar en GitLab desde la barra lateral izquierda seleccionando su avatar): Seleccione Edit profile > Access Tokens > Add new token)
      $ sudo git clone <gitlab-repo-url> <local-repo>
      $ sudo git clone https://<user>:<access_token>@<gitlab-repo-url> <local-repo>
      
    2. Cambie el directorio a un proyecto de MATLAB:
      $ cd <local-repo>/<project-path>
      
    3. Ejecute la primera etapa de la cadena de tareas:
      $ sudo -E matlab-batch -logfile "MATLAB_LOG_FILE" -nodesktop "cp = openProject(pwd); padv.pipeline.generatePipeline( padv.pipeline.GitLabOptions(PipelineArchitecture = padv.pipeline.Architecture.SerialStagesGroupPerTask, Tags = 'docker-matlab', GeneratedYMLFileName = 'simulink_pipeline.yml', GeneratedPipelineDirectory = fullfile('derived','pipeline'), MatlabLaunchCmd = 'xvfb -a matlab-batch', AddBatchStartupOption = false, EnableArtifactCollection = 'always'));"
      
    4. Verifique la generación del archivo simulink_pipeline.yml:
      $ cd derived 
      $ ls
      

Resumen

La integración de CI/CD es fundamental para mantener altos estándares de calidad, confiabilidad y cumplimiento. Las prácticas de CI/CD agilizan el proceso de desarrollo, lo que permite una entrega rápida y consistente de actualizaciones y, al mismo tiempo, garantiza que todos los cambios cumplan con estrictos requisitos de certificación. Este enfoque no solo mejora la productividad, sino que también reduce significativamente el riesgo de errores e incumplimientos, que son críticos en entornos certificados.

Al aplicar las herramientas y prácticas analizadas en este artículo, las empresas podrán configurar un entorno sólido utilizando Docker y GitLab Runner para crear una cadena de tareas de CI/CD eficiente y económica. Este proceso facilita un ciclo de desarrollo optimizado, confiable y compatible y, en última instancia, ayuda a entregar sistemas certificables de alta calidad con mayor confianza y eficiencia.

Perfil profesional

Dalton L'Heureux es consultor senior en MathWorks, y ofrece soporte a ingenieros de sistemas críticos en materia de seguridad y de alta integridad. Se enfoca en ayudar a los equipos a aplicar herramientas para ingeniería de sistemas y verificación y validación, y generación de código en aplicaciones como la certificación DO-178C.

Antes de incorporarse a MathWorks, Dalton fue ingeniero de sistemas en Rockwell Collins, donde se convirtió en un experto en modelado de especificaciones y generación de casos de prueba. Su trabajo contribuyó a realizar pruebas rentables de software de vuelo para aeronaves Boeing 777X y Bombardier C-Series.

Dalton tiene una licenciatura en ingeniería aeroespacial y una maestría en ingeniería de sistemas no tripulados y autónomos de la Universidad Aeronáutica Embry-Riddle. En todos sus roles, el diseño basado en modelos y MATLAB han sido temas constantes en su enfoque para desarrollar y verificar sistemas complejos.

# Copyright 2023 - 2025 The MathWorks, Inc.

variables:
 MATLAB_LOG_FILE: "MATLAB_Log_Output.txt"
 GIT_SUBMODULE_STRATEGY: recursive
 MLM_LICENSE_TOKEN: "<USER>|TOKEN_ML|<BATCHTOKEN>"

stages:
 - SimulinkPipelineGeneration
 - SimulinkPipelineExecution

# Do not change the name of the jobs in this pipeline
SimulinkPipelineGeneration:
 stage: SimulinkPipelineGeneration
 tags:
 - docker-matlab
 script:
 # Open the project and generate the pipeline using appropriate options 
 sudo -E matlab-batch 
 -logfile "MATLAB_LOG_FILE" 
 -nodesktop 
 "cp = openProject(pwd); 
 padv.pipeline.generatePipeline( 
 padv.pipeline.GitLabOptions( 
 PipelineArchitecture = padv.pipeline.Architecture.SerialStagesGroupPerTask, 
 Tags = 'docker-matlab', 
 GeneratedYMLFileName = 'simulink_pipeline.yml', 
 GeneratedPipelineDirectory = fullfile('derived','pipeline'), 
 MatlabLaunchCmd = 'xvfb-run -a matlab-batch', 
 AddBatchStartupOption = false, 
 EnableArtifactCollection = 'always'));" 
 artifacts:
 paths:
 # This file is generated automatically by 
 # padv.pipeline.generatePipeline. Update this field if the 
 # name or location of the generated pipeline file is changed 
 - derived/pipeline

SimulinkPipelineExecution:
 stage: SimulinkPipelineExecution
 trigger:
 include: 
 - artifact: derived/pipeline/simulink_pipeline.yml
 job: SimulinkPipelineGeneration
 strategy: depend

 # Do not change the name of this variable
 variables:
 PADV_ROOT_PIPELINE_ID: $CI_PIPELINE_ID

# Copyright 2023 - 2025 The MathWorks, Inc. 

# docker build --build-arg MATLAB_DOCKER_RELEASE=<matlab-docker-release> 
# --build-arg MATLAB_VERSION=<matlab-release> 
# --build-arg GITLAB_TOKEN=<gitlab-token> 
# --build-arg MATLAB_BATCH_TOKEN=<matlab-token> 
# --build-arg IMAGE_NAME=<image-image> 
# -t <image-image> 
# -f <dockerfile-name> . 

# Example: $ docker build --build-arg PATH_TO_LICENSE=<path-to-license> --build-arg GITLAB_TOKEN=<gitlab-token> --build-arg MATLAB_BATCH_TOKEN="<USER>|TOKEN_ML|<TOKEN>" -t matlab_image -f matlab.Dockerfile . 

# Note: It is best practice to pass the MATLAB Batch Token during execution 
# time rather than at build time as shown here. The token was passed at 
# build time here for simplicity purposes.

# To specify which MATLAB release to install in the container, edit the value of the MATLAB_RELEASE argument. 
# Use lower case to specify the release, for example: ARG MATLAB_RELEASE=r2023b 

ARG MATLAB_DOCKER_RELEASE=r2023b-ubuntu22.04 
ARG MATLAB_VERSION=r2023b 
ARG MATLAB_BATCH_TOKEN="<USER>|TOKEN_ML|<TOKEN>" 
ARG GITLAB_TOKEN=<TOKEN> 
ARG IMAGE_NAME=matlab_image 
ARG PATH_TO_LICENSE=<PATH_TO_LICENSE>

# When you start the build stage, this Dockerfile by default uses the Ubuntu-based matlab-deps image. 
# To check the available matlab-deps images, see: https://hub.docker.com/r/mathworks/matlab-deps 
FROM mathworks/matlab-deps:${MATLAB_DOCKER_RELEASE}

# Declare the global argument to use at the current build stage 
ARG MATLAB_VERSION 
ARG MATLAB_BATCH_TOKEN 
ARG GITLAB_TOKEN 
ARG IMAGE_NAME 
ARG PATH_TO_LICENSE 

RUN sudo apt-get update && \ 
 sudo apt-get install --no-install-recommends --yes \ 
 curl && \ 
 sudo apt-get clean && sudo apt-get autoremove 

RUN curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash && \ 
 sudo apt-get install --no-install-recommends --yes \ 
 gitlab-runner && \ 
 sudo apt-get clean && sudo apt-get autoremove && \ 
 gitlab-runner start && \ 
 sudo gitlab-runner register --non-interactive \ 
 --url "https://external-git.mathworks.com/" \ 
 --token "${GITLAB_TOKEN}" \ 
 --docker-image ${IMAGE_NAME} \ 
 --executor "shell" 

# Install mpm dependencies 
RUN export DEBIAN_FRONTEND=noninteractive && \ 
 sudo apt-get update && \ 
 sudo apt-get install --no-install-recommends --yes \ 
 wget \ 
 ca-certificates \ 
 xvfb \ 
 build-essential \ 
 clang \ 
 libopenblas-dev \ 
 liblapacke-dev \ 
 liblapack-dev \ 
 libomp-dev \ 
 unzip \ 
 iproute2 \ 
 git \ 
 libeigen3-dev \ 
 cmake \ 
 psmisc && \ 
 sudo apt-get clean && sudo apt-get autoremove 

RUN sudo apt-get update && sudo apt-get install libunwind-dev -y && \ 
 sudo apt-get clean && sudo apt-get autoremove 

# Install dependencies for matlab-proxy 
RUN DEBIAN_FRONTEND=noninteractive && \ 
 sudo apt-get update && sudo apt-get install --no-install-recommends -y \ 
 python3 \ 
 python3-pip \ 
 && sudo apt-get clean \ 
 && sudo rm -rf /var/lib/apt/lists/* 

RUN python3 -m pip install matlab-proxy 

# Add "matlab_user" user and grant sudo permission. 
RUN adduser --shell /bin/bash --disabled-password --gecos "" matlab_user && \ 
 echo "matlab_user ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/matlab_user && \ 
 chmod 0440 /etc/sudoers.d/matlab_user 

# Set user and work directory 
USER matlab_user 
WORKDIR /home/matlab_user 

# Run mpm to install MATLAB in the target location and delete the mpm installation afterwards 
# Add toolboxes on --products line replacing spaces with _ aka Simulink_Test 
# Note: Simulink_Code_Inspector is only supported by mpm when installing from an iso file: 
RUN wget -q https://www.mathworks.com/mpm/glnxa64/mpm && \ 
 chmod +x mpm && \ 
 sudo ./mpm install \ 
 --release=${MATLAB_VERSION} \ 
 --destination=/opt/matlab \ 
 --products MATLAB Simulink Stateflow \ 
 Requirements_Toolbox \ 
 Simulink_Check CI/CD_Automation_for_Simulink_Check Simulink_Design_Verifier \ 
 Simulink_Test Simulink_Coverage \ 
 MATLAB_Coder MATLAB_Compiler Simulink_Coder Simulink_Compiler Embedded_Coder \ 
 Polyspace_Bug_Finder_Server Polyspace_Code_Prover_Server \ 
 MATLAB_Report_Generator Simulink_Report_Generator \ 
 DSP_System_Toolbox Simulink_3D_Animation Phased_Array_System_Toolbox \ 
 Computer_Vision_Toolbox Image_Processing_Toolbox \ 
 System_Identification_Toolbox Instrument_Control_Toolbox Aerospace_Toolbox \ 
 Aerospace_Blockset Signal_Processing_Toolbox Symbolic_Math_Toolbox \ 
 Automated_Driving_Toolbox DDS_Blockset Geoid_Data_for_Aerospace_Toolbox \ 
 || (echo "MPM Installation Failure. See below for more information:" && cat /tmp/mathworks_root.log && false) && \ 
 sudo rm -rf mpm /tmp/mathworks_root.log && \ 
 sudo ln -s /opt/matlab/bin/matlab /usr/local/bin/matlab 

# One of the following 3 ways of configuring the license server to use must be 
# uncommented. 

# 1) BATCH TOKEN 
# Install matlab-batch to enable the use of MATLAB batch licensing tokens. 
RUN wget -q https://ssd.mathworks.com/supportfiles/ci/matlab-batch/v1/glnxa64/matlab-batch \ 
 && sudo mv matlab-batch /usr/local/bin \ 
 && sudo chmod +x /usr/local/bin/matlab-batch 

# 2) LICENSE SERVER 
#ARG LICENSE_SERVER 
# Specify the host and port of the machine that serves the network licenses 
# if you want to bind in the license info as an environment variable. This 
# is the preferred option for licensing. It is either possible to build with 
# Something like --build-arg LICENSE_SERVER=27000@MyServerName, alternatively 
# you could specify the license server directly using 
# ENV MLM_LICENSE_FILE=27000@flexlm-server-name 
#ENV MLM_LICENSE_FILE=$LICENSE_SERVER 

# 3) LICENSE FILE 
# Alternatively, you can put a license file into the container. 
# You should fill this file out with the details of the license 
# server you want to use and uncomment the following line. 
#COPY ${PATH_TO_LICENSE} /opt/matlab/licenses/ 
ADD ${PATH_TO_LICENSE} /opt/matlab/licenses/ 

ENV ENV="/home/matlab_user/.profile" 
ENV BASH_ENV="/home/matlab_user/.profile" 
ENV MLM_LICENSE_TOKEN=${MATLAB_BATCH_TOKEN} 

ENTRYPOINT ["xvfb-run"] 
CMD ["/bin/bash"]

Publicado en 2025

Artículos sobre prestaciones afines