🎃

VSCode DevContainerでSysML v2の開発環境を構築する🛠️

2024/10/22に公開

はじめに

システムズエンジニアリングの分野で注目を集めているSysML v2。この記事では、VSCode DevContainerを使用してSysML v2の開発環境を構築する方法を紹介します。

この記事の内容は、gorenje氏のSysMLv2 Jupyter Docker環境を参考にしています。gorenje氏の素晴らしい環境構築に感謝すると共に、VSCodeのDevContainer環境に適応させるためにいくつかの修正を加えています。

また、この記事で紹介する環境構築のためのコードは、私のGitHubリポジトリで公開しています。実際の設定ファイルやDockerfileをご覧いただけますので、ぜひチェックしてみてください。

前提条件

環境構築手順

1. プロジェクトの作成

まず、新しいディレクトリを作成し、VSCodeで開きます。

mkdir sysmlv2-devcontainer
cd sysmlv2-devcontainer
code .

2. DevContainer設定ファイルの作成

.devcontainerディレクトリを作成し、必要なファイルを追加します。

mkdir .devcontainer
cd .devcontainer

devcontainer.jsonファイルを作成し、以下の内容を追加します:

{
  "name": "SysML Development Environment",
  "dockerComposeFile": "docker-compose.yml",
  "service": "sysmljupyter",
  "workspaceFolder": "/workspace",
  "customizations": {
    "vscode": {
      "settings": {
        "python.defaultInterpreterPath": "/home/sysml/conda/bin/python",
        "python.linting.enabled": true,
        "python.linting.pylintEnabled": false,
        "python.linting.flake8Enabled": false,
        "python.linting.mypyEnabled": false,
        "python.linting.ruffEnabled": true,
        "python.formatting.provider": "none",
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
          "source.fixAll": "explicit",
          "source.organizeImports": "explicit"
        }
      },
      "extensions": [
        "ms-python.python",
        "ms-toolsai.jupyter",
        "charliermarsh.ruff"
      ]
    }
  },
  "postCreateCommand": "pip install ruff"
}

docker-compose.ymlファイルを作成し、以下の内容を追加します:

version: '3'
services:
  postgresdbserver:
    image: postgres:9.6.6
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=mysecretpassword
      - POSTGRES_DB=sysml2
    volumes:
      - postgresdbserver:/var/lib/postgresql/data

  sysmlapiserver:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile.api
    tty: true
    depends_on:
      - postgresdbserver

  sysmljupyter:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    volumes:
      - ..:/workspace:cached
    command: /bin/sh -c "while sleep 1000; do :; done"
    depends_on:
      - sysmlapiserver

volumes:
  postgresdbserver:

Dockerfileを作成し、以下の内容を追加します:

FROM openjdk:17-slim

RUN apt-get update && apt-get install -y \
    gcc \
    g++ \
    wget \
    inkscape \
    texlive-fonts-recommended \
    texlive-base \
    texlive-xetex \
    jq

ARG NB_USER=sysml
ARG NB_UID=1000
ENV USER ${NB_USER}
ENV NB_UID ${NB_UID}
ENV HOME /home/${NB_USER}

RUN adduser --disabled-password \
    --gecos "Default user" \
    --uid ${NB_UID} \
    ${NB_USER}

USER ${NB_USER}
WORKDIR ${HOME}

RUN wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
RUN chmod 755 ${HOME}/Miniconda3-latest-Linux-x86_64.sh
RUN mkdir ${HOME}/conda
RUN ${HOME}/Miniconda3-latest-Linux-x86_64.sh -f -b -p ${HOME}/conda
RUN ${HOME}/conda/condabin/conda init
RUN ${HOME}/conda/condabin/conda update conda
RUN ${HOME}/conda/condabin/conda install -n base conda-build conda-libmamba-solver
RUN ${HOME}/conda/condabin/conda config --set solver libmamba

ENV PATH="${HOME}/conda/bin:${HOME}/conda/condabin:${PATH}"

RUN pip install jupyterlab ruff

Dockerfile.apiを作成し、以下の内容を追加します:

FROM openjdk:11-slim

RUN apt-get update && apt-get install -y \
    wget \
    xmlstarlet

ARG NB_USER=sysml
ARG NB_UID=1000
ENV USER ${NB_USER}
ENV NB_UID ${NB_UID}
ENV HOME /home/${NB_USER}

RUN adduser --disabled-password \
    --gecos "Default user" \
    --uid ${NB_UID} \
    ${NB_USER}

USER ${NB_USER}
WORKDIR ${HOME}

ARG SBT_VERSION=1.2.8
RUN wget -q https://github.com/sbt/sbt/releases/download/v${SBT_VERSION}/sbt-${SBT_VERSION}.tgz
RUN tar xfz sbt-${SBT_VERSION}.tgz

ARG RELEASE=2023-02
RUN wget -q https://github.com/Systems-Modeling/SysML-v2-API-Services/archive/${RELEASE}.tar.gz -O ${RELEASE}.tar.gz
RUN tar xfz ${RELEASE}.tar.gz

WORKDIR ${HOME}/SysML-v2-API-Services-${RELEASE}

RUN ${HOME}/sbt/bin/sbt clean update compile

RUN sed -i 's/key=.whatever./key="longersecretnowarnings"/' conf/application.conf

ARG SYSML_API_SERVER="sysmlapiserver:9000"
RUN echo "\n\nplay.filters.hosts {\n   allowed = [\"${SYSML_API_SERVER}\", \"localhost:9000\"]\n}\n" >> conf/application.conf

ARG DB_SERVER_URL="jdbc:postgresql://postgresdbserver:5432/sysml2"
ARG DB_USER="postgres"
ARG DB_PASSWORD="mysecretpassword"
RUN xmlstarlet ed --inplace -u '_:persistence/_:persistence-unit/_:properties/_:property[@name="javax.persistence.jdbc.url"]/@value' -v ${DB_SERVER_URL} conf/META-INF/persistence.xml \
    && xmlstarlet ed --inplace -u '_:persistence/_:persistence-unit/_:properties/_:property[@name="javax.persistence.jdbc.user"]/@value' -v ${DB_USER} conf/META-INF/persistence.xml \
    && xmlstarlet ed --inplace -u '_:persistence/_:persistence-unit/_:properties/_:property[@name="javax.persistence.jdbc.password"]/@value' -v ${DB_PASSWORD} conf/META-INF/persistence.xml \
    && xmlstarlet ed --inplace -u '_:persistence/_:persistence-unit/_:properties/_:property[@name="hibernate.hbm2ddl.auto"]/@value' -v "update" conf/META-INF/persistence.xml

EXPOSE 9000
CMD ${HOME}/sbt/bin/sbt run

3. DevContainerの起動

VSCodeのコマンドパレット(Ctrl+Shift+P)を開き、"Remote-Containers: Reopen in Container"を選択します。

初回は時間がかかりますが、DockerイメージのビルドとコンテナーC起動が完了するとVSCodeが自動的にコンテナー内の環境に接続されます。

環境の使用方法

Jupyter Notebookの起動

.ipynbを開くとnotebook環境なります. 右上の「カーネルを選択」でPython環境を選択すれば実行可能です。

SysML API Serverへのアクセス

SysML API Serverはhttp://localhost:9000でアクセスできます。

データベース接続情報

PostgreSQLデータベースには以下の情報で接続できます:

  • ホスト: postgresdbserver
  • ポート: 5432
  • ユーザー名: postgres
  • パスワード: mysecretpassword
  • データベース名: sysml2

おわりに

この記事では、VSCode DevContainerを使用してSysML v2の開発環境を構築する方法を紹介しました。この方法を使うことで、チーム全体で一貫した環境を簡単に共有でき、「環境構築」という面倒な作業から解放されます。Vscode上で完結するのは地味にうれしいですね。

ここで紹介した設定は、gorenje氏のSysMLv2 Jupyter Docker環境をベースにしています。SysML v2の開発環境に興味がある方は、オリジナルのリポジトリも確認することをおすすめします。

また、この記事で紹介した環境構築のための具体的なコードは、私のGitHubリポジトリで公開しています。実際の実装を見たい方や、自分の環境ですぐに試してみたい方は、このリポジトリをクローンして使ってみてください。

SysML v2は日々進化しているため、必要に応じてDockerfileやdevcontainer.jsonの内容を最新のものに更新してください。また、gorenje氏のリポジトリも定期的にチェックし、新しい改善点があればそれを取り入れることも検討してみてください。

皆さんのSysML v2を使ったシステムモデリングが捗ることを願っています!

参考リンク

Discussion