Articoli tecnici

Integrazione continua con Docker Containers, GitLab Runner e CI/CD Automation for Simulink Check

Dalton L'Heureux, MathWorks


Introduzione

L'importanza dell'affidabilità e dell'integrità del software continua a crescere man mano che i sistemi diventano più complessi e interconnessi. Nonostante l’adesione alle consolidate best practice ingegneristiche, lo sviluppo di sistemi ad alta integrità rimane un’attività tecnicamente impegnativa e finanziariamente onerosa. Considerato il notevole impegno richiesto da attività di revisione, analisi, test e regressione, gli ingegneri sono costantemente alla ricerca di soluzioni per ridurre gli sprechi migliorando al contempo la qualità complessiva del software. Una delle ultime tendenze è stata la spinta verso soluzioni di integrazione continua e distribuzione continua (CI/CD).

Le pratiche CI/CD hanno trasformato lo sviluppo del software, consentendo la distribuzione rapida e coerente di software di alta qualità. Tuttavia, il rapido progresso di questa tecnologia, unito al numero di strumenti disponibili, può rendere estremamente difficile la creazione di una soluzione CI/CD solida. Questo articolo presenta un approccio completo all'implementazione di pipeline CI/CD utilizzando GitLab® Runner, Docker® e CI/CD Automation for Simulink Check™.

Importanza di CI/CD per lo sviluppo e la certificazione di software safety-critical

Le pratiche di CI/CD (integrazione continua e distribuzione continua) sono fondamentali nello sviluppo software moderno, soprattutto per i sistemi safety-critical come quelli utilizzati nei settori sanitario, automotive e aerospaziale. L’implementazione di una soluzione CI/CD efficiente può contribuire a migliorare la qualità e l’affidabilità del software, consentire un’individuazione e una risoluzione più rapide dei problemi e garantire il rispetto continuo degli standard normativi. Poiché anche una singola modifica ai requisiti può innescare una cascata di attività di regressione, disporre di un solido processo CI/CD è essenziale per gestire in modo economicamente sostenibile qualsiasi programma di sviluppo software safety-critical.

Questo articolo presenterà i seguenti passaggi per configurare strumenti esterni all’ambiente di modellazione nativo e integrarli con la suite di strumenti MATLAB® e Simulink®:

  • Simulink Check Process Advisor
  • GitLab e GitLab Runners
    • Configurazione delle pipeline CI/CD di GitLab
  • Docker
    • Creazione dell'immagine Docker
    • Argomenti di build
    • Creazione di immagine e avvio del container
    • Esecuzione di GitLab Runner per gestire i lavori
    • Test e risoluzione dei problemi dell'immagine Docker

Simulink Check Process Advisor

L’app Process Advisor, disponibile come parte di CI/CD Automation for Simulink Check, è uno strumento potente per sviluppare una pipeline di Model-Based Design all’interno dell’ambiente MATLAB, che può poi essere utilizzata in un ambiente esterno tramite il file template .yml fornito. Per gli sviluppatori di modelli che desiderano configurare una pipeline di processo all’interno dell’ambiente MATLAB, consultare la seguente documentazione:

  1. Impostazione di un modello di processo: Personalizza il tuo modello di processo
  2. Automazione della verifica e della validazione del modello: Automatizza ed esegui attività con Process Advisor
  3. Best practice per l'utilizzo di Process Advisor: Linee guida per creare modelli di processo

GitLab e GitLab Runners

A questo punto, si è pronti per inserire il proprio modello di processo in una pipeline CI/CD in GitLab. Per garantire che gli aggiornamenti al modello di processo Simulink vengano automaticamente riflessi nella pipeline GitLab, viene utilizzato un approccio unico: invece di ricreare il modello di processo in un file .yml statico, utilizziamo un file .yml che genera un altro file .yml contenente le attività correnti nel modello di processo. Consultare il file di configurazione della pipeline di esempio (.gitlab-ci.yml) in Appendice A. Da notare la presenza di due fasi:

fasi: 
 - SimulinkPipelineGeneration 
 - SimulinkPipelineExecution

La prima fase genera la pipeline per la seconda fase.

In questa fase è importante valutare come concedere in licenza gli strumenti di modellazione e verifica utilizzati nella pipeline. Un approccio consiste nell'utilizzare token batch. Per utilizzare i token batch, è necessario richiederne uno da Batch Licensing Pilot e includerlo nella sezione delle variabili del proprio file .yml.

variabili: 
 MLM_LICENSE_TOKEN: "<MATLAB_BATCH_TOKEN>"

Non tutti i prodotti supportano i token batch. In questi casi, potrebbe essere necessario utilizzare un file di licenza tradizionale (.lic). Puoi trovare maggiori informazioni sui token batch qui: Token di licenza batch MATLAB. È buona norma evitare di codificare i token (e altre informazioni sul tipo di credenziale) nel file .yml o nel Dockerfile. Per un approccio più sicuro, valuta la possibilità di creare la tua immagine Docker utilizzando variabili di ambiente.

Configurazione delle pipeline CI/CD di GitLab

Configurare il tuo progetto GitLab per gestire i lavori è semplice. Per prima cosa devi assicurarti che GitLab sappia dove trovare il tuo file .yml. In Settings > CI/CD > General pipelines > CI/CD configuration file, fornisci il percorso al file .yml del tuo progetto, idealmente denominato “.gitlab-ic.yml” (Figura 1).

Una schermata che mostra le impostazioni di configurazione della pipeline GitLab CI/CD, in cui gli utenti specificano il percorso del file .yml, utile per configurare correttamente le build automatiche.

Figura 1. Impostazioni di configurazione della pipeline CI/CD di GitLab.

Successivamente, dovrai creare un nuovo runner in GitLab. In questo modo otterrai un gitlab-runner-token che potrai utilizzare in seguito per registrare il tuo container Docker all’istanza GitLab Runner (Figura 2).

Una schermata che mostra la pagina delle impostazioni dei runner GitLab, che guida gli utenti nella gestione dei runner per l’esecuzione dei job CI/CD.

Figura 2. Impostazioni dei runner GitLab.

In Settings > CI/CD > Runners > New project runner, fornisci un tag e clicca Create Runner (Figura 3).

Una schermata che mostra l’interfaccia GitLab per la creazione di un nuovo project runner, con i campi per l’inserimento dei tag e il pulsante per avviare la creazione del runner per i job della pipeline.

Figura 3. Creazione di un nuovo runner in GitLab.

Una volta creato il runner, copia e salva il token di autenticazione del runner (Figura 4).

Uno screenshot che mostra il token di autenticazione del runner GitLab, sottolineando l'importanza di salvare questo token in modo sicuro per la futura registrazione del runner.

Figura 4. Token di autenticazione del runner. Non perderlo!

Docker

Creazione dell'immagine Docker

Questa è probabilmente la parte più difficile del processo, poiché è necessario assicurarsi che l’immagine Docker non solo contenga tutte le dipendenze degli strumenti installate, ma sia anche correttamente autorizzata all’uso di tali strumenti. È anche importante notare che l'immagine Docker può essere una qualsiasi delle distribuzioni del sistema operativo. In questo esempio verrà utilizzato Ubuntu 22.04.

Inizia installando tutti gli strumenti necessari per eseguire il modello di processo Simulink e i runner GitLab. Nel tuo Dockerfile, estrai un'immagine MATLAB di base:

DA mathworks/matlab-deps:${MATLAB_DOCKER_RELEASE}

Successivamente, si procederà direttamente all'installazione di alcune delle dipendenze di base richieste. Le variabili di build saranno discusse più avanti. Vedi l'esempio Dockerfile in Appendice B per la ripartizione completa dell'installazione. Il Dockerfile inizia con l'installazione delle dipendenze per MPM, che verranno poi utilizzate per installare i prodotti MATLAB e Simulink richiesti (ad eccezione di Simulink Code Inspector™). Quindi, installa le dipendenze per matlab-proxy. Una volta installati, utilizza MPM per installare gli strumenti necessari e configurare il metodo di licenza. Nota che dovrai anche installare gitlab-runner sulla tua immagine Docker e registrala utilizzando gitlab-runner-token che hai salvato prima. Il frammento seguente mostra come installare e registrare con le opzioni di configurazione desiderate:

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"

Come mostrato nel Dockerfile, MPM può installare tutti gli strumenti MATLAB e Simulink richiesti, ad eccezione di Simulink Code Inspector. Per Simulink Code Inspector, dovrai scaricare un file .iso da il sito web MathWorks e installarlo da quel file. Consulta la documentazione installazione mpm per ulteriori informazioni.

Ora che i tuoi prodotti sono installati, devi configurare il metodo di licenza. Attualmente sono disponibili tre metodi per la concessione delle licenze:

  • Utilizzare un token batch: installare matlab-batch per abilitare l'uso dei token di licenza batch MATLAB. Si noti che Polyspace Code Prover Server™ e Polyspace Bug Finder Server™ non supportano la licenza tramite batch token e che l’uso di Polyspace Code Prover™ e Polyspace Bug Finder™ per desktop in ambienti CI/CD viola i termini del contratto di licenza del software. Per installare matlab-batch, aggiungi quanto segue al tuo 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
      
  • Utilizzare un server di licenze: specificare l’host e la porta della macchina che fornisce le licenze di rete se desiderate impostare le informazioni sulla licenza come variabile d’ambiente. Questa è l'opzione preferita per la concessione della licenza. È possibile eseguire la compilazione utilizzando quanto segue:
    • --build-arg LICENSE_SERVER=27000@MyServerName
      
    • In alternativa, è possibile specificare il server delle licenze direttamente nel tuo Dockerfile utilizzando:
    • ENV MLM_LICENSE_FILE=27000@flexlm-server-name
      
  • Utilizzare un file di licenza (.lic): Si sconsiglia vivamente di inserire un file di licenza direttamente in un container. In alternativa, è possibile montare sul container un'unità contenente i file di licenza richiesti. Quando si utilizza un'unità montata per il file di licenza, includere una delle seguenti righe nel Dockerfile di esempio:
    • COPY ${PATH_TO_LICENSE} /opt/matlab/licenses/
      
    • ADD ${PATH_TO_LICENSE} /opt/matlab/licenze/
      

Un'ultima nota sulle dipendenze installate: alcuni report richiedono un display per acquisire screenshot dei modelli. Xvfb fornisce un display virtuale per attività come padv.builtin.task.GenerateSDDReport, padv.builtin.task.GenerateSimulinkWebView e padv.builtin.task.GenerateModelComparison. Dovrebbe essere installato come parte delle dipendenze MPM. Assicurarsi che MPM sia installato dall'utente che eseguirà la pipeline.

Argomenti di build

In questo esempio, il Dockerfile è configurato per accettare diversi argomenti di build. Gli argomenti di build possono essere utili per mantenere un unico Dockerfile in grado di generare più immagini o per consentire agli utenti di fornire informazioni di build che possono variare nel tempo o che non è consigliabile inserire direttamente nel Dockerfile.

Questo Dockerfile contiene i seguenti argomenti di build (--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>

All'inizio del Dockerfile, puoi specificare il valore predefinito per ciascun argomento nel caso in cui non venga fornito un valore al comando di build:

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>

Dopo l’istruzione FROM nel vostro Dockerfile, è necessario dichiarare le variabili che verranno utilizzate:

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

Notare nel frammento sopra che il valore MATLAB_DOCKER_RELEASE è accessibile utilizzando la sintassi ${<var>}.

Creazione di immagini e avvio del container

Ora che il tuo Dockerfile è pronto, puoi creare il tuo primo container dal terminale Docker:

  • Dal terminale Docker, digitare cd nella posizione del Dockerfile e verificare:
> cd <path-to-dockerfile> 
>ls
  • Creazione dell'immagine Docker:
> docker build -t <image-name> -f <dockerfile-name>

Se il tuo file Docker utilizza argomenti di build, il tuo comando di build potrebbe essere più simile a:

> 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 volta creato il container, puoi eseguirlo da Docker tramite l'interfaccia utente o dal terminale:

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

Il tuo Dockerfile ha già registrato la tua immagine come gitlab-runner. Per confermarlo, visualizza il file /etc/gitlab-runner/config.toml all'interno di Docker e verifica che sia registrato il runner corretto (Figura 5).

Uno screenshot che mostra il file config.toml all'interno di un container Docker, a conferma che il runner GitLab è stato registrato correttamente con l'immagine Docker.

Figura 5. Verifica che un runner GitLab sia stato registrato correttamente con un'immagine Docker.

Se la registrazione del runner non è corretta o deve essere modificata o riavviata, utilizza quanto segue nel terminale dell'immagine Docker per annullare la registrazione del runner e quindi ripristinare il runner corretto:

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

Esecuzione di GitLab Runner per gestire i lavori

Ora che il container è in esecuzione e registrato come runner GitLab, puoi avviare gitlab-runner e iniziare a gestire i lavori (Figura 6). Dal terminale del container, avvia il runner utilizzando:

>sudo gitlab-runner run
Uno screenshot che mostra lo stato di esecuzione della pipeline di GitLab, aiutando gli utenti a monitorare l'avanzamento dei lavori e a verificare le esecuzioni riuscite della pipeline.

Figura 6. Esecuzione e stati della pipeline GitLab.

Esistono diversi modi per avviare la vostra pipeline, tra cui build pianificate, build manuali o su richiesta, e build attivate da nuovi commit nel vostro repository GitLab (Figura 7).

Uno screenshot che mostra la pagina dettagliata sullo stato della pipeline di GitLab, che consente agli utenti di monitorare le fasi e i risultati dei lavori per una migliore visibilità sui processi CI/CD.

Figura 7. Pagina di stato dettagliata della pipeline GitLab.

  • Build pianificate: In GitLab, usa Build > Pipeline schedule per programmare quando eseguire le pipeline.
  • Build attivate da commit: per impostazione predefinita, GitLab eseguirà la pipeline ogni volta che viene effettuato un push sul repository. Per controllare come vengono attivate le build, dovrai modificare il file .yml o aggiungere tag specifici ai messaggi di commit. Vedere Control how jobs run per maggiori informazioni.
  • Build manuali: in GitLab, usa Settings > CI/CD > Run pipeline per attivare build manuali. Settings > CI/CD > Pipeline trigger tokens contiene informazioni su come utilizzare curl per avviare build da un terminale.

Una volta terminata l'esecuzione della pipeline, i risultati possono essere visualizzati e scaricati dall'ultimo lavoro nella pipeline:Collect_Artifacts (Figura 8).

Uno screenshot che mostra il terminale di output della pipeline di GitLab, dove gli utenti possono visualizzare e scaricare i risultati del lavoro finale nella pipeline.

Figura 8. Terminale di output e risultati della pipeline GitLab.

Test e risoluzione dei problemi dell'immagine Docker

Quando si imposta e si configura l'immagine Docker, è importante poter eseguire test lungo il percorso. Ecco alcuni passaggi utili che puoi eseguire nel terminale del container Docker per assicurarti che tutto funzioni come previsto:

  1. Verificare l'installazione MATLAB dal terminale del container:
$ matlab-batch "disp('Hello, World.')"
  1. Per generare determinati report (SDD), MATLAB necessita di un display. Per questo puoi usare Xvfb. Per testare Xvfb:
$ sudo xvfb-run -e /dev/stdout -a matlab-batch "disp('Hello, World.')"
  1. Esecuzione manuale della pipeline MATLAB:
    1. Clona il repository (potreste essere invitati a inserire le credenziali: l’autenticazione a due fattori richiede access token, che possono essere trovati in GitLab cliccando sull’avatar nella barra laterale sinistra e selezionando: Seleziona 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. Accesso alla directory in un progetto MATLAB:
      $ cd <local-repo>/<project-path>
      
    3. Esecuzione della prima fase della pipeline:
      $ 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. Verifica la generazione del file simulink_pipeline.yml:
      $ cd derived 
      $ ls
      

Conclusione

L'integrazione di CI/CD è fondamentale per mantenere elevati standard di qualità, affidabilità e conformità. Le pratiche CI/CD semplificano il processo di sviluppo, consentendo una distribuzione rapida e coerente degli aggiornamenti e garantendo al contempo che tutte le modifiche soddisfino rigorosi requisiti di certificazione. Questo approccio non solo aumenta la produttività, ma riduce anche significativamente il rischio di errori e non conformità, che sono critici negli ambienti certificati.

Applicando gli strumenti e le pratiche illustrate in questo articolo, le organizzazioni dovrebbero essere in grado di configurare un ambiente solido con Docker e GitLab Runner, creando una pipeline CI/CD efficiente e in grado di ridurre i costi. Questa pipeline dovrebbe facilitare un ciclo di sviluppo semplificato, affidabile e conforme e, in ultima analisi, contribuire a fornire sistemi certificabili di alta qualità con maggiore sicurezza ed efficienza.

Informazioni sull’autore

Dalton L'Heureux è un senior consultant presso MathWorks, dove supporta gli ingegneri che lavorano su sistemi safety-critical e ad alta integrità. Il suo obiettivo è aiutare i team ad applicare strumenti per l'ingegneria dei sistemi, la verifica & validazione e generazione di codice in applicazioni quali la certificazione DO-178C.

Prima di entrare in MathWorks, Dalton è stato systems engineer presso Rockwell Collins, dove è diventato un esperto di riferimento in modellazione delle specifiche e generazione dei casi di test. Il suo lavoro ha contribuito a testare in modo economicamente vantaggioso il software di volo per aeromobili tra cui il Boeing 777X e il Bombardier C-Series.

Dalton ha conseguito un BSE in ingegneria aerospaziale e un MSE in ingegneria dei sistemi senza pilota e autonomi presso la Embry-Riddle Aeronautical University. In tutti i suoi ruoli, la progettazione Model-Based e MATLAB sono stati temi costanti nel suo approccio allo sviluppo e alla verifica di sistemi complessi.

# Copyright 2023 - 2025 The MathWorks, Inc.

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

stages:
 - SimulinkPipelineGeneration
 - SimulinkPipelineExecution

# Non modificare il nome dei lavori in questa pipeline
SimulinkPipelineGeneration:
 stage: SimulinkPipelineGeneration
 tag:
 - docker-matlab
 script:
 # Aprire il progetto e generare la pipeline utilizzando le opzioni appropriate 
 sudo -E matlab-batch 
 -logfile "MATLAB_LOG_FILE" 
 -nodesktop 
 "cp = openProject(pwd); 
 padv.pipeline.generatePipeline( 
 padv.pipeline.GitLabOptions( 
 PipelineArchitecture = padv.pipeline.Architecture.SerialStagesGroupPerTask, 
 Tag = 'docker-matlab', 
 GeneratedYMLFileName = 'simulink_pipeline.yml', 
 GeneratedPipelineDirectory = fullfile('derived','pipeline'), 
 MatlabLaunchCmd = 'xvfb-run -a matlab-batch', 
 AddBatchStartupOption = false, 
 EnableArtifactCollection = 'always'));" 
 artifacts:
 paths:
 # Questo file viene generato automaticamente da 
 # padv.pipeline.generatePipeline. Aggiornare questo campo se il 
 # nome o la posizione del file pipeline generato è stato modificato 
 - derived/pipeline

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

 # Non modificare il nome di questa variabile
 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. 

# Nota: È buona norma usare il token batch MATLAB durante l'esecuzione 
# anziché al momento del build come mostrato qui. Il token è stato usato al 
# tempo di build qui per semplicità.

# Per specificare quale versione MATLAB installare nel container, modificare il valore dell'argomento MATLAB_RELEASE. 
# Utilizzare lettere minuscole per specificare la versione, ad esempio: 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>

# Quando si avvia la fase di build, questo Dockerfile utilizza per impostazione predefinita l'immagine matlab-deps basata su Ubuntu. 
# Per controllare le immagini matlab-deps disponibili, vedere: https://hub.docker.com/r/mathworks/matlab-deps 
FROM mathworks/matlab-deps:${MATLAB_DOCKER_RELEASE}

# Dichiarare l'argomento globale da utilizzare nella fase di build corrente 
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" 

# Installare le dipendenze mpm 
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 

# Installare le dipendenze per 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 

# Aggiungere l'utente "matlab_user" e concedere l'autorizzazione sudo. 
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 

# Impostare l'utente e la directory di lavoro 
USER matlab_user 
WORKDIR /home/matlab_user 

# Eseguire mpm per installare MATLAB nella posizione di destinazione ed eliminare successivamente l'installazione di mpm 
# Aggiungere le caselle degli strumenti sulla riga --products sostituendo gli spazi con _ ovvero Simulink_Test 
# Nota: Simulink_Code_Inspector è supportato da mpm solo quando si installa da un file iso: 
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 \ 
 Server 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. Per maggiori informazioni vedere di seguito:" && 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 

# È necessario utilizzare uno dei seguenti 3 modi per configurare il server delle licenze 
# non commentato. 

# 1) BATCH TOKEN 
# Installare matlab-batch per abilitare l'uso dei token di licenza batch MATLAB. 
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) SERVER DI LICENZA 
#ARG LICENSE_SERVER 
# Specificare l'host e la porta della macchina che gestisce le licenze di rete 
# se si desidera associare le informazioni sulla licenza come variabile di ambiente. Questa 
# è l'opzione preferita per la licenza. È possibile eseguire la creazione con 
# Qualcosa come --build-arg LICENSE_SERVER=27000@MyServerName, in alternativa 
# potresti specificare direttamente il server delle licenze usando 
# ENV MLM_LICENSE_FILE=27000@flexlm-server-name 
#ENV MLM_LICENSE_FILE=$LICENSE_SERVER 

# 3) FILE DI LICENZA 
# In alternativa, è possibile inserire un file di licenza nel container. 
# Dovresti compilare questo file con i dettagli del server 
# di licenza che vuoi utilizzare e rimuovi il commento dalla riga seguente. 
#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"]

Pubblicato nel 2025

Visualizza articoli per funzionalità correlate