‹ SimDiff Automation サポート

GitLab ワークフローに SimDiff を組み込む

Windows ランナー上の GitLab パイプラインが SimDiff Automation を実行し、ピアレビューファイルを公開します。

はじめに

これらの手順では、Simulink モデルファイルと Git を使う GitLab ワークフローに SimDiff Automation を組み込みます。

Simulink ファイルへの変更がプッシュされると、パイプラインは SimDiff を使って、その変更のピアレビューファイルを作成し、アーティファクトとして GitLab にアップロードします。この例では、ローカルの Windows PC 上の GitLab Runner を使います。

簡単な例で始める

前提条件

  • GitLab.com のアカウント
  • Simulink ファイルを含む GitLab のリポジトリ
  • Simulink、Git、SimDiff Automation がインストールされた Windows PC

GitLab のリポジトリにアクセスする

GitLab アカウントと、Simulink ファイルを含むリポジトリが必要です。サンプルリポジトリを GitLab プロジェクトにインポートします。

  1. GitLab で Create project をクリックして、プロジェクトを作成します。
GitLab のヘッダーに Create subgroup ボタンと Create project ボタンがあります。
  1. Import project をクリックします。
GitLab の Create new project ページに、Create blank project、Create from template、Import project、Run CI/CD for external repository があります。
  1. Repository by URL をクリックします。
GitLab の Import project ページで、インポート元のうち Repository by URL が丸で囲まれています。
  1. Git repository URL 欄に https://github.com/EnSoftCorp/gitlab-integration.git と入力します。
GitLab の Import repository by URL フォームに、Git repository URL https://github.com/EnSoftCorp/gitlab-integration.git と公開範囲 Private が表示されています。
  1. プロジェクトに名前を付けて Create project をクリックします。リポジトリがインポートされます。

リポジトリには main と dev の 2 つのブランチがあります。main ブランチには aero_radmod.slx と、パイプラインが何を実行するかを指定する YAML ファイルがあります。その YAML ファイルは、ファイルのバージョン間の変更を SimDiff で報告するよう、すでに設定されています。

main ブランチの GitLab ファイル一覧に、.gitlab-ci.yml、README.md、aero_radmod.slx が表示されています。

これが main ブランチの内容です。

自分のコンピュータでリポジトリをクローンする

同じ Git リポジトリを、ローカルの Windows PC にクローンします。クローン用の URL は Code ボタンの下にあり、通常は GitLab のリポジトリページの右上にあります。

git clone git@GitLab.com:##YourRepoURLinGit

GitLab 用の Git 認証情報を設定します。GitLab にインポートした GitHub リポジトリではなく、自分の GitLab リポジトリをクローンします。

GitLab Runner をインストールする

GitLab Runner は GitLab CI/CD と連携して、パイプライン内のジョブを実行します。開発者がコードをプッシュするとき、.gitlab-ci.yml ファイルにタスクを定義できます。それらのタスクでは、テストの実行、アプリケーションのビルド、コードのデプロイ、または SimDiff の実行ができます。GitLab Runner は、そのタスクを実行するアプリケーションです。

Windows に Runner をインストールします。 GitLab がインストール方法を Windows に GitLab Runner をインストールする で説明しています。短い手順は次のとおりです。

  • 64 ビットのバイナリをダウンロードし、任意のディレクトリに移動します。
  • バイナリの名前を GitLab-runner.exe に変更します。
  • 管理者権限で Windows PowerShell を開きます。
  • インストールディレクトリに移動し、.\GitLab-runner install でランナーをインストールします。
  • .\GitLab-runner start でランナーを起動します。

GitLab でランナーを作成します。 プロジェクトランナーを作成して登録する に従います。要約すると、次のとおりです。

  • Settings、次に CI/CD、次に Runners の順に開き、Create project runner をクリックします。
  • Run untagged jobs をクリックし、任意の説明を入力して、Create runner をクリックします。
  • プラットフォームとして Windows を選択します。
  • GitLab が、URL とトークンを含むランナー登録コマンドを表示します。そのコマンドをコピーします。
.\gitlab-runner.exe register --url https://gitlab.com --token glrt-sample-token-string

ランナーを登録します。 Windows PowerShell のウィンドウで、GitLab が表示したコマンドを入力します。

  • 上の登録コマンドを入力します。
  • executor の入力を求められたら、Shell と入力します。

config.toml を編集します。 ランナーの実行ファイルと同じディレクトリに config.toml ファイルが作成されます。

  • shell= で始まる行を、shell = "powershell" となるように編集します。

ランナーを実行します。 管理者権限なしで、Windows のコマンドプロンプトまたは PowerShell を開きます。

.\GitLab-runner.exe run と入力します。

Git で変更をプッシュする

ランナーを設定したら、次の項目を確認してから、変更をプッシュしてパイプラインを起動します。

SimDiff Automation のインストールを確認します。 YAML ファイルは、SimDiff Automation が C:\Program Files\EnSoft\SimDiff Automation にインストールされていることを前提にしています。そうでない場合は、YAML ファイル内のその場所を変更します。

SimDiff Automation を設定します。 sd4.exe をコマンドラインオプション -license と -matlabSetup 付きで実行し、ライセンスと MATLAB のインストールを設定します。その後、コマンドラインからレポートを生成できることを確認します。

YAML ファイルを確認します。 このサンプルの .gitlab-ci.yml は、SimDiff を起動してレポートを生成します。aero_radmod.slx への変更がプッシュされると、パイプラインがレポートを生成してアップロードします。後の節では、変更されたすべてのモデルファイルについてレポートが作られるよう、これを拡張します。

stages:  
- peer_review_file_generation  

SimDiff_Peer_Review_File:  
stage: peer_review_file_generation  
before_script:  
  - $command = '\"C:/Program Files/EnSoft/SimDiff Automation/sd4.exe\" -l \"$LOCAL\" -r \"$REMOTE\" -export aero_radmod_peerreview.html'  
  - git config --local difftool.sd4.cmd $command   
script:  
  - echo "Comparing with SimDiff"  
  - git difftool -y -t sd4 HEAD~1 HEAD .\aero_radmod.slx  
artifacts:  
  paths:   
    - aero_radmod_peerreview.html

モデルファイルを変更してプッシュします。 aero_radmod.slx を変更し、コミットして、プッシュします。

これで GitLab 上のパイプラインが開始します。ローカル PC 上のランナーが SimDiff のピアレビューファイルを生成し、アーティファクトとしてアップロードします。

GitLab.com でレポートのアーティファクトを確認する

  1. Build、次に Jobs を開きます。現在のジョブを含むパイプラインが表示されるはずです。ジョブが正常な場合、パイプラインは Passed になります。
ブランチ demo-main の GitLab ジョブ表で、ジョブ SimDiff_Peer_Review_File が Passed になっています。
  1. ジョブをクリックして、詳細を表示します。
GitLab のジョブログが python .\\diff.py reports HEAD~1 HEAD を実行して aero_radmod.slx を報告しており、右側に Keep、Download、Browse があります。
  1. Download をクリックしてピアレビューファイルをダウンロードするか、Browse をクリックして表示します。

コミットで変更されたすべてのモデルファイルを比較する

ここまでの例は、aero_radmod.slx という名前のファイルが変更されることを前提にしていました。コミットで変更されたすべてのモデルファイルを報告するには、Python スクリプトを呼び出すように YAML ファイルを変更します。モデルファイルを変更するプッシュを行うと、変更されたファイルごとにレポートが作成され、それらのレポートがアーティファクトとして GitLab にアップロードされます。サンプルスクリプトは、ファイルの現在のバージョン(HEAD)を、直前のコミットのバージョンと比較します。

前提条件

上記の前提条件に加えて、ローカルのマシンに Python をインストールします。GitLab Runner が Python を実行できるよう、すべてのユーザー向けにインストールします。

更新されたファイルを見るには、サンプルリポジトリの dev ブランチに切り替えます。

dev ブランチの GitLab ファイル一覧に、.gitlab-ci.yml、README.md、aero_radmod.slx、diff.py が表示されています。

これが dev ブランチの内容です。

リポジトリの変更

dev ブランチには、新しい Python スクリプトを呼び出すよう変更された YAML ファイルがあります。

更新後の YAML:

stages:  
- peer_review_file_generation  

SimDiff_Peer_Review_File:  
stage: peer_review_file_generation  
script:  
  - echo "Comparing with SimDiff"  
  - python .\diff.py reports HEAD~1 HEAD  
artifacts:  
  paths:   
    - reports

Python スクリプト。 diff.py のリストは次のとおりです。

import subprocess  
import os  
import sys  

# Function to get the list of modified files in the commit  
def get_modified_files():  
 try:  
     # Get the list of modified files (slx files) in the current commit  
     result = subprocess.run(['git', 'diff', commit1, commit2, '--name-only', '--diff-filter=M'], stdout=subprocess.PIPE,  
                             text=True,      # Ensure output is in string format  
                             check=True)     # Raise an error if the command fails  
     # Filter to include only Simulink model files (.slx or .mdl)  
     modified_files = [line for line in result.stdout.splitlines() if (line.endswith('.slx') or line.endswith('.mdl'))]  
     return modified_files  
 except subprocess.CalledProcessError as e:  
     print(f"Error getting modified files: {e}")  
     return []  

# Function to call SimDiff for each file  
def run_simdiff_for_files(file):  
     try:  
         # Call the difftool (replace 'simdiff' with the actual command if different)  
         report_file = f"{reportsDir}/" + file.removesuffix(".slx") + ".peerreview.html"  
         print(f"    report_file= {report_file}")  

         # Ensure report directory is created if it doesn't exist  
         report_path = os.path.dirname(report_file)  
         os.makedirs(report_path, exist_ok=True)  
          
         path_to_diff_tool = f'"\'C:/Program Files/EnSoft/SimDiff Automation/sd4.exe\' -l $LOCAL -r $REMOTE -export {report_file}"'  
         config_cmd = f'git config --local difftool.sd4.cmd {path_to_diff_tool}'  
         #print(f"    config_cmd= {config_cmd}")  
         subprocess.run(config_cmd, text=True, check=True, shell=True)  
         diff_cmd = f'git difftool -y -t sd4 {commit1} {commit2} {file}'  
         #print(f"    diff_cmd= {diff_cmd}")  
         subprocess.run(diff_cmd, text=True, shell=True)  
          
         #print(f"    SimDiff ran successfully for {file}\n")  
     except subprocess.CalledProcessError as e:  
         print(f"Error running SimDiff on {file}: {e}")  

def main():  
 modified_files = get_modified_files()  
 if modified_files:  
     print("Modified Simulink models:")  
     for file in modified_files:  
         print(f" - {file}")  
         run_simdiff_for_files(file)  
 else:  
     print("No modified Simulink models found.")  

if __name__ == '__main__':  
 reportsDir = sys.argv[1]  
 commit1 = sys.argv[2]  
 commit2 = sys.argv[3]  
 main()

モデルファイルを変更してプッシュする

変更をプッシュすると、変更されたモデルファイルごとにレポートが作成され、アーティファクトとして GitLab にアップロードされます。

お問い合わせ

これらの手順についてのご質問は support@ensoftcorp.com です。

ご質問、または修正のご希望はありますか?

どのようなご用件ですか?