기술 칼럼

Docker 컨테이너, GitLab Runner 및 CI/CD Automation for Simulink Check를 활용한 지속적 통합

작성자: Dalton L'Heureux, MathWorks


개요

시스템이 더욱 복잡해지고 상호 연결됨에 따라 소프트웨어의 신뢰성과 무결성의 중요성은 계속해서 높아지고 있습니다. 확립된 엔지니어링 모범 사례를 준수함에도 불구하고, 고신뢰성 시스템 개발은 여전히 기술적으로 까다롭고 재정적으로 많은 비용이 드는 작업입니다. 리뷰, 분석, 테스트 및 회귀 테스트 작업에 상당한 노력이 소요되는 점을 고려할 때, 엔지니어들은 항상 소프트웨어 품질을 전반적으로 향상시키면서 낭비를 줄일 수 있는 방법을 찾고 있습니다. 최근 트렌드 중 하나는 CI/CD(지속적 통합 및 지속적 배포) 솔루션에 대한 관심이 높아지고 있다는 점입니다.

CI/CD 방식은 소프트웨어 개발에 혁신을 가져와 고품질 소프트웨어를 신속하고 일관되게 제공할 수 있게 했습니다. 하지만 이 기술의 급속한 발전과 사용 가능한 툴의 수가 증가함에 따라 견고한 CI/CD 솔루션을 구축하는 것이 매우 어려워질 수 있습니다. 이 칼럼에서는 GitLab® Runner, Docker® 및 CI/CD Automation for Simulink Check™를 사용해 CI/CD 파이프라인을 구현하는 포괄적인 접근 방식을 제시합니다.

안전 필수 소프트웨어 개발 및 인증에 있어 CI/CD의 중요성

CI/CD는 현대 소프트웨어 개발, 특히 의료, 자동차, 항공우주 산업에서 사용되는 안전 필수 시스템과 같은 분야에서 필수적인 관행입니다. 효율적인 CI/CD 솔루션을 도입하면 품질과 신뢰성을 향상시키고, 문제를 더 빠르게 감지하고 해결하며, 규제 표준을 지속적으로 준수할 수 있습니다. 요구사항의 단 한 번의 변경으로 인해 회귀 테스트 작업이 연쇄적으로 발생할 수 있으므로, 안전 필수 소프트웨어 개발 프로그램을 비용 효율적으로 관리하려면 강력한 CI/CD 공정을 구축하는 것이 필수적입니다.

이 칼럼에서는 MATLAB® 및 Simulink® 툴 스위트와의 통합을 위해 기본 모델링 환경 외부에서 툴링을 설정하는 다음의 단계를 다룰 것입니다.

  • Simulink Check의 Process Advisor
  • GitLab 및 GitLab Runner
    • GitLab CI/CD 파이프라인 구성
  • Docker
    • Docker 이미지 생성
    • 빌드 인수
    • 이미지 빌드 및 컨테이너 실행
    • GitLab Runner 실행을 통한 작업에 대한 수신 대기
    • Docker 이미지 테스트 및 문제 해결

Simulink Check의 Process Advisor

CI/CD Automation for Simulink Check에서 제공되는 Process Advisor 앱은 MATLAB 환경 내에서 모델 기반 설계 파이프라인을 개발하는 강력한 툴이며, 제공된 템플릿 .yml 파일을 통해 외부 환경에서 사용할 수 있습니다. MATLAB 환경 내에서 공정 파이프라인을 구성하려는 모델 개발자는 다음 문서를 참조하십시오.

  1. 공정 모델 설정: 공정 모델 사용자 지정하기
  2. 모델 검증 및 확인 자동화: Process Advisor로 작업 자동화 및 실행
  3. Process Advisor 사용 관련 모범 사례: 공정 모델 작성 관련 모범 사례

GitLab 및 GitLab Runner

이제 여러분은 공정 모델을 GitLab의 CI/CD 파이프라인에 통합할 준비가 되었습니다. Simulink 공정 모델에 대한 업데이트가 GitLab 파이프라인에 자동으로 반영되도록 하기 위해 고유한 접근 방식이 사용됩니다. 공정 모델을 정적인 .yml 파일로 다시 만드는 대신, 공정 모델의 현재 작업을 포함하는 또 다른 .yml 파일을 생성하는 .yml 파일을 사용합니다. 부록 A의 예시 파이프라인 구성 파일(.gitlab-ci.yml)을 참조하십시오. 참고로, 이는 두 단계로 구성됩니다.

stages: 
 - SimulinkPipelineGeneration 
 - SimulinkPipelineExecution

첫 번째 단계는 두 번째 단계를 위한 파이프라인을 생성합니다.

이 시점에서 파이프라인에 사용되는 모델링 및 검증 툴에 대한 라이선스를 어떻게 확보할지 고려하는 것이 중요합니다. 한 가지 방법은 배치 토큰을 사용하는 것입니다. 배치 토큰을 사용하려면 먼저 배치 라이선싱 파일럿에서 토큰을 요청하고 .yml 파일의 variables 섹션에 포함시키세요.

variables: 
 MLM_LICENSE_TOKEN: "<MATLAB_BATCH_TOKEN>"

모든 제품이 배치 토큰을 지원하는 것은 아닙니다. 이러한 경우에는 기존 라이선스 파일(.lic)을 사용해야 할 수도 있습니다. 배치 토큰에 대한 자세한 정보는 여기에서 확인할 수 있습니다. MATLAB 배치 라이선싱 토큰. 토큰(및 기타 자격 증명 유형 정보)을 .yml 파일이나 Dockerfile에 하드코딩하는 것은 피하는 것이 좋습니다. 보다 안전한 접근 방식을 위해서는 환경 변수를 사용하여 Docker 이미지를 빌드하는 것을 고려해 보세요.

GitLab CI/CD 파이프라인 구성

GitLab 프로젝트에서 작업을 관리하도록 설정하는 것은 간단합니다. 먼저 GitLab이 .yml 파일의 위치를 알고 있는지 확인해야 합니다. Settings > CI/CD> General pipelines > CI/CD configuration file 아래에서 프로젝트의 .yml 파일의 경로를 지정하십시오. 파일 이름은 ".gitlab-ic.yml"로 지정하는 것이 이상적입니다. (그림 1)

사용자가 .yml 파일의 경로를 지정하여 자동화된 빌드를 올바르게 구성할 수 있도록 도와주는 GitLab CI/CD 파이프라인 구성 설정 화면을 보여주는 스크린샷입니다.

그림 1. GitLab CI/CD 파이프라인 구성 설정입니다.

다음으로 GitLab에서 새 러너를 생성해야 합니다. 이렇게 하면 나중에 Docker 컨테이너를 GitLab 러너 인스턴스에 등록하는 데 사용할 gitlab-runner-token을 제공하게 됩니다. (그림 2)

GitLab 러너 설정 페이지의 스크린샷으로, CI/CD 작업 실행을 위한 러너 관리 방법을 사용자에게 안내합니다.

그림 2. GitLab 러너 설정.

Settings > CI/CD> Runners > New project runner 아래에서 태그를 입력하고 Create Runner를 클릭하세요. (그림 3).

새 프로젝트 러너를 생성하기 위한 GitLab 인터페이스를 보여주는 스크린샷입니다. 태그 입력 필드와 파이프라인 작업에 대한 러너 생성을 시작하는 버튼이 포함되어 있습니다.

그림 3. GitLab에서 새 러너를 생성하는 방법.

러너가 생성되면 러너 인증 토큰을 복사하여 저장합니다. (그림 4)

GitLab 러너 인증 토큰을 보여주는 스크린샷으로, 향후 러너 등록을 위해 이 토큰을 안전하게 저장하는 것이 중요하다는 점을 강조합니다.

그림 4. 러너 인증 토큰. 분실하지 마세요!

Docker

Docker 이미지 생성

이는 전체 과정에서 가장 어려운 부분이라고 할 수 있는데, Docker 이미지에 필요한 모든 툴 종속성이 설치되어 있어야 할 뿐만 아니라 해당 툴을 사용할 수 있는 라이선스도 확보해야 하기 때문입니다. 또한 Docker 이미지는 다양한 OS 배포판 중 하나일 수 있다는 점도 중요합니다. 이 예제에서는 Ubuntu 22.04 버전을 사용합니다.

먼저 Simulink 공정 모델과 GitLab 러너를 실행하는 데 필요한 모든 툴을 설치하십시오. Dockerfile에서 기본 MATLAB 이미지를 가져오세요.

FROM mathworks/matlab-deps:${MATLAB_DOCKER_RELEASE}

이어서 필요한 기본 종속성들을 설치하는 단계로 넘어갑니다. 빌드 변수에 대해서는 나중에 자세히 설명하겠습니다. 전체 설치 과정은 부록 B의 예시 Dockerfile을 참조하세요. Dockerfile은 MPM에 필요한 종속 항목을 설치하는 것으로 시작하며, 이후 이를 사용하여 필요한 MATLAB 및 Simulink 제품(Simulink Code Inspector™ 제외)을 설치합니다. 다음으로, matlab-proxy에 대한 종속 항목을 설치합니다. 이러한 구성 요소가 설치되면 MPM을 사용하여 필요한 툴을 설치하고 라이선싱 방식을 구성하십시오. 참고로, Docker 이미지에 있는 gitlab-runner도 설치하고 이전에 저장해둔 gitlab-runner-token을 사용해 등록해야 합니다. 아래 코드 조각은 원하는 구성 옵션을 사용하여 설치 및 등록하는 방법을 보여줍니다.

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"

Dockerfile에 나와 있는 것처럼 MPM은 Simulink Code Inspector를 제외한 필요한 모든 MATLAB 및 Simulink 툴을 설치할 수 있습니다. Simulink Code Inspector의 경우, MathWorks 웹사이트에서 .iso 파일을 다운로드하고 그 파일에서 설치하세요. 자세하 내용은 mpm install 문서를 참조하세요.

제품 설치가 완료되었으므로 이제 라이선싱 방식을 구성해야 합니다. 현재 라이선싱에는 세 가지 방법이 있습니다.

  • 배치 토큰 사용: matlab-batch를 설치해 MATLAB 배치 라이선싱 토큰의 사용을 활성화합니다. 참고로 Polyspace Code Prover Server™ 및 Polyspace Bug Finder Server™는 배치 토큰 라이선싱을 지원하지 않으며, CI/CD 환경에서 데스크톱용 Polyspace Code Prover™ 및 Polyspace Bug Finder™를 사용하는 것은 소프트웨어 라이선스 계약을 위반하는 행위입니다. matlab-batch를 설치하려면 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
      
  • 라이선스 서버 사용: 라이선스 정보를 환경 변수로 바인딩하려면 네트워크 라이선스를 제공하는 시스템의 호스트와 포트를 지정하십시오. 이것이 라이선싱에 있어 가장 선호되는 옵션입니다. 다음과 같은 방법으로 빌드할 수 있습니다.
    • --build-arg LICENSE_SERVER=27000@MyServerName
      
    • 또는 Dockerfile에서 다음과 같이 라이선스 서버를 직접 지정할 수도 있습니다.
    • ENV MLM_LICENSE_FILE=27000@flexlm-server-name
      
  • 라이선스(.lic) 파일 사용: 라이선스 파일을 컨테이너에 직접 넣는 것은 강력히 권장하지 않습니다. 하지만 필요한 라이선스 파일이 포함된 드라이브를 컨테이너에 마운트하는 방법도 있습니다. 라이선스 파일을 마운트된 드라이브에 저장하는 경우, 예제 Dockerfile에 다음 라인 중 하나를 포함시키세요.
    • COPY ${PATH_TO_LICENSE} /opt/matlab/licenses/
      
    • ADD ${PATH_TO_LICENSE} /opt/matlab/licenses/
      

설치된 종속 항목에 대해 마지막으로 한 가지만 더 말씀드리겠습니다. 일부 리포트에서는 모델의 스크린샷을 캡처하기 위한 디스플레이가 필요합니다. Xvfb는 padv.builtin.task.GenerateSDDReport, padv.builtin.task.GenerateSimulinkWebViewpadv.builtin.task.GenerateModelComparison 등의 작업을 위한 가상 디스플레이를 제공합니다. 이는 MPM 종속 항목의 일부로 설치되어야 합니다. 파이프라인을 실행할 사용자가 MPM을 설치했는지 확인하십시오.

빌드 인수

이 예시에서는 Dockerfile이 여러 빌드 인수를 허용하도록 구성되어 있습니다. 빌드 인수는 여러 이미지를 빌드하는 데 사용할 수 있는 하나의 Dockerfile을 유지 관리하거나, 시간이 지남에 따라 변경될 수 있거나 Dockerfile 자체에 하드코딩하기 바람직하지 않은 빌드 정보를 사용자가 전달할 수 있도록 하는 데 유용할 수 있습니다.

이 Dockerfile에는 다음과 같은 빌드 인수가 포함되어 있습니다. (--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>

Dockerfile의 시작 부분에서 빌드 명령에 값이 제공되지 않은 경우 각 인수에 대한 기본값을 지정할 수 있습니다.

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>

Dockerfile에서 FROM 명령문 다음에는 사용할 변수를 선언해야 합니다.

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

참고로 위 코드 조각에서는 ${<var>} 구문을 사용해 MATLAB_DOCKER_RELEASE 값에 접근합니다.

이미지 빌드 및 컨테이너 실행

Dockerfile이 준비되었으므로 Docker 터미널에서 첫 번째 컨테이너를 빌드할 수 있습니다.

  • Docker 터미널에서 Dockerfile이 있는 위치로 이동한 후 다음 명령을 입력하여 확인하십시오.
> cd <path-to-dockerfile> 
> ls
  • Docker 이미지를 빌드합니다:
> docker build -t <image-name> -f <dockerfile-name>

Docker 파일에서 빌드 인수를 사용하는 경우 빌드 명령은 다음과 같을 수 있습니다.

> 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>

컨테이너 빌드가 완료되면 Docker UI 또는 터미널을 통해 실행할 수 있습니다.

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

Dockerfile에서 이미 gitlab-runner를 이미지로 등록했습니다. 이를 확인하려면 Docker 내 /etc/gitlab-runner/config.toml 파일을 보고 올바른 러너가 등록되었는지 확인합니다. (그림 5)

Docker 컨테이너 내부의 config.toml 파일을 보여주는 스크린샷으로, GitLab 러너가 Docker 이미지에 성공적으로 등록되었음을 확인시켜 줍니다.

그림 5. GitLab 러너가 Docker 이미지에 성공적으로 등록되었는지 확인합니다.

러너 등록이 잘못되었거나 변경 또는 재시작이 필요한 경우, Docker 이미지 터미널에서 다음 명령어를 사용하여 러너 등록을 해제한 다음 올바른 러너를 복원하십시오.

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

GitLab Runner 실행을 통한 작업에 대한 수신 대기

컨테이너가 실행 중이고 GitLab 러너로 등록되었으므로 이제 gitlab-runner를 시작하고 작업에 대한 수신 대기를 시작할 수 있습니다. (그림 6) 컨테이너 터미널에서 다음 명령어를 사용하여 러너를 시작하세요.

> sudo gitlab-runner run
GitLab 파이프라인 실행 상태를 보여주는 스크린샷으로, 사용자가 작업 진행 상황을 모니터링하고 파이프라인 실행 성공 여부를 확인할 수 있도록 도와줍니다.

그림 6. GitLab 파이프라인 실행 및 상태.

파이프라인을 시작하는 방법에는 예약된 빌드, 수동 또는 온디맨드 빌드, GitLab 저장소에 대한 새 커밋을 기반으로 하는 빌드 등 여러 가지가 있습니다. (그림 7)

GitLab의 상세 파이프라인 상태 페이지 스크린샷입니다. 이 페이지를 통해 사용자는 작업 단계와 결과를 추적하여 CI/CD 공정을 더욱 효과적으로 파악할 수 있습니다.

그림 7. GitLab 파이프라인 상세 상태 페이지.

  • 예정된 빌드: GitLab에서 Build > Pipeline schedule을 사용해 파이프라인 실행 일정을 예약합니다.
  • 커밋 빌드 시: 기본적으로 GitLab은 저장소에 푸시될 때마다 파이프라인을 실행합니다. 빌드 트리거 방식을 제어하려면 .yml 파일을 수정하거나 커밋 메시지에 특정 태그를 추가해야 합니다. 자세한 정보는 Control how jobs run 항목을 참조하세요.
  • 수동 빌드: GitLab에서 Settings > CI/CD > Run pipeline을 사용해 수동 빌드를 트리거합니다. Settings > CI/CD > Pipeline trigger tokens에는 터미널에서 빌드를 트리거하는 curl을 사용하는 방법에 대한 정보가 있습니다.

파이프라인 실행이 완료되면 파이프라인의 마지막 작업인 Collect_Artifacts의 결과를 확인하고 다운로드할 수 있습니다. (그림 8).

GitLab 파이프라인 출력 터미널의 스크린샷입니다. 사용자는 이 터미널에서 파이프라인의 최종 작업 결과를 확인하고 다운로드할 수 있습니다.

그림 8. GitLab 파이프라인 출력 터미널 및 결과.

Docker 이미지 테스트 및 문제 해결

Docker 이미지를 설정하고 구성할 때, 진행 과정에서 여러 가지 사항을 테스트할 수 있는 것이 중요합니다. Docker 컨테이너 터미널에서 다음과 같은 몇 가지 유용한 단계를 수행하여 모든 것이 예상대로 작동하는지 확인할 수 있습니다.

  1. 컨테이너 터미널에서 MATLAB 설치를 확인하십시오.
$ matlab-batch "disp('Hello, World.')"
  1. 특정 보고서(SDD)를 생성하려면 MATLAB은 디스플레이가 필요합니다. 이를 위해 Xvfb를 사용할 수 있습니다. Xvfb를 테스트하려면:
$ sudo xvfb-run -e /dev/stdout -a matlab-batch "disp('Hello, World.')"
  1. MATLAB 파이프라인을 수동으로 실행하세요:
    1. 리포지토리를 복제합니다. (자격 증명을 입력하라는 메시지가 나타날 수 있습니다. 2FA는 액세스 토큰이 필요하며, 이는 GitLab 왼쪽 사이드바에서 아바타를 선택하면 확인할 수 있습니다) 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. MATLAB 프로젝트 디렉토리로 이동하세요:
      $ cd <local-repo>/<project-path>
      
    3. 파이프라인의 첫 번째 단계를 실행합니다.
      $ 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. simulink_pipeline.yml 파일의 생성을 확인합니다.
      $ cd derived 
      $ ls
      

결론

CI/CD 통합은 높은 품질, 신뢰성 및 규정 준수 기준을 유지하는 데 매우 중요합니다. CI/CD 방식은 개발 공정을 간소화하여 신속하고 일관된 업데이트 제공을 가능하게 하는 동시에 모든 변경 사항이 엄격한 인증 요구사항을 충족하도록 보장합니다. 이러한 접근 방식은 생산성을 향상시킬 뿐만 아니라 인증 환경에서 매우 중요한 오류 및 규정 미준수 위험을 크게 줄여줍니다.

이 글에서 다룬 툴과 모범 사례를 적용하면 조직은 Docker와 GitLab Runner를 활용하여 효율적이고 비용 효율적인 CI/CD 파이프라인을 구축할 수 있는 견고한 환경을 마련할 수 있을 것입니다. 이 파이프라인은 간소화되고 신뢰할 수 있으며 규정을 준수하는 개발 라이프사이클을 촉진하고, 궁극적으로 더 높은 신뢰도와 효율성으로 고품질의 인증 가능한 시스템을 제공하는 데 도움이 될 것입니다.

작성자 정보

Dalton L'Heureux는 MathWorks의 선임 컨설턴트로, 안전 필수 및 고신뢰성 시스템을 개발하는 엔지니어들을 지원합니다. 그는 DO-178C 인증과 같은 응용 분야에서 시스템 공학, 검증 및 확인, 코드 생성에 대한 툴을 팀에 적용하도록 지원하는 데 집중하고 있습니다.

MathWorks에 합류하기 전, Dalton은 Rockwell Collins에서 시스템 엔지니어로 근무하며 명세 모델링 및 테스트 케이스 생성의 주제 전문가가 되었습니다. 그는 Boeing 777X 및 Bombardier C-시리즈를 비롯한 항공기의 비행 소프트웨어에 대한 비용 효율적인 테스트에 기여했습니다.

Dalton 은 Embry-Riddle Aeronautical University에서 항공우주공학 학사 학위와 무인 및 자율 시스템 공학 석사 학위를 받았습니다. 그가 여러 직책을 거치면서 복잡한 시스템을 개발하고 검증하는 데 있어 모델 기반 설계 및 MATLAB는 일관된 요소였습니다.

# 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"]

2025년 기고

관련 기능에 대한 칼럼 보기