みなさんこんにちは。予定通り新型AMD Ryzen7000、Nvidia RTX4000、Google Pixel7が発売され、さらに新型iPad Proも発表されました。それは嬉しいのですが、昨今の円安でドルベースの価格を見た後に日本円での価格を見るとかなり衝撃を受けます。ここまでくるとちょっと感覚が追い付かなくて海外からものを買うときに見積もりを見誤りそうです。1ドルが70円台だったときが懐かしいです。

記事の目次

    JenkinsとMayaを連携させる

    前回までの設定により、作成したコードをメインのリポジトリにpushすることで自動的にテストの実行やパッケージの作成ができるようになりました。今回からはMayaとの連携を進めていきます。

    Mayaの起動スクリプトを用意する

    Mayaを起動したときにスクリプトを実行できるようにします。mayapyを使用することもできますが、それは普通にpythonから実行するのとあまり変わりがないのと、GUI付きのテストを実行する場合や、mayapyと通常のMayaで挙動が異なる場合に対応できないので、通常のMayaを使用してテストを実行できる環境を作成していきます。

    まずは、コマンドラインからMayaを起動してスクリプトを実行し、Mayaを終了するまでの準備をします。

    userSetup.py

    Mayaは起動したときにsys.pathに含まれているフォルダを全て探索し、その中にuserSetup.pyがあったら実行をするようになっています。そのため、algorithmフォルダの中にuserSetup.pyを作成してMayaの実行前にPYTHONPATHを設定すれば実行されます。userSetup.pyの中身は下記の通りです。

    import sys
    import maya.cmds as cmds
    import maya.utils
    
    from PySide2 import QtWidgets
    
    job_id = None
    launched = False
    
    
    def run_test():
        global launched
        if launched is True:
            return
    
        print('==== run_test for algorithm ====')
        launched = True
        maya.utils.executeDeferred(lambda:cmds.scriptJob(kill=job_id))
        
        print(sys.version_info)
    
        QtWidgets.QMessageBox.information(None, 'userSetup', 'algorithm')
    
        cmds.quit(force=True, exitCode=0)
    
    
    job_id = cmds.scriptJob(event=('PostSceneRead', run_test))

    cmds.scriptJobでシーンファイルが読み込まれたときにrun_test()を実行するようにしています。また、Mayaの起動と同時にファイルを開くために空のファイルをuserSetup.maとして用意しておきます。

    では、実行してみます。

    >set MAYA_UI_LANGUAGE=en_US
    >set PYTHONPATH=C:\Users\chiyama\repo\algorithm
    >"C:\Program Files\Autodesk\Maya2023\bin\maya.exe" userSetup.ma

    Mayaの起動後userSetup.maが読み込まれ、メッセージボックスが表示されました。OKボタンを押すとMayaが終了します。

    これで、完全にMayaの準備ができてから処理を走らせることができるようになりました。

    ちなみに、このような場合にはexecuteDefferredを使用するのがよくある手段ですが、executeDefferredはMayaの処理が一段落したタイミングで実行するためのコマンドなので、起動途中でも実行されてしまう可能性があります。そうなると、GUIやそのほかのプラグインが初期化されていないにもかかわらず処理が走ってしまうため、あまり都合がよくないです。参考まで、executeDefferred版のuserSetup.pyは以下のようになります。

    import sys
    import maya.cmds as cmds
    import maya.utils
    
    from PySide2 import QtWidgets
    
    
    def run_test():
        print('==== run_test for algorithm ====')
        print(sys.version_info)
    
        QtWidgets.QMessageBox.information(None, 'userSetup', 'algorithm')
    
        cmds.quit(force=True, exitCode=0)
    
    
    maya.utils.executeDeferred(run_test)

    これを実行すると、スプラッシュスクリーンが表示されている段階でrun_testが実行されてしまいます。

    もう少しスマートな解決方法があると嬉しいんですが、私は知らないのです………。もしご存じの方がいらっしゃたら教えてください。切実に!!(笑

    userSetup.pyとuserSetup.maが準備できたのでリポジトリに登録し、pushしておきます。

    Jenkinsに組み込む

    手動でMayaの立ち上げとスクリプトの実行ができるようになったので、Jenkinsに組み込んでいきます。とは言っても実行するコマンドはわかっているので、そのままJenkinsから実行するだけです。

    まずは、既存のジョブを元に新しいジョブを作成します。こういった作業はブラウザから行うのではなく、ファイルを直接触ってしまう方が簡単です。手順はとても簡単です。

    1. C:\Users\(ユーザー名)\.jenkins\jobsの中にあるalgorithmをコピーしてmayatestという名前にする
    2. mayatest\config.xmlの中のalgorithmを全てmayatestに置換する
    3. mayatest\nextBuildNumberの中身を1に変える
    4. mayatest\buildsの中身を空にする
    5. mayatest\venvを削除する
    6. JenkinsのメニューからJenkinsの管理を選び、ページの一番下の方にある「設定の再読み込み」を行う

    これで、新たにmayatestジョブがリストに現れました。

    続いてmayatestの設定をしていきます。先ほどconfig.xmlの中身をalgorithmからmayatestに一括変換したので、設定の中身が全て置き換わっています。リポジトリはこれまで通りalgorithmを使用するので元に戻しておきます。

    pytestを実行している部分で、Mayaを起動するように書き換えます。以下のようになります。

    call C:\Users\chiyama\.jenkins\jobs\mayatest\venv\Scripts\activate.bat
    
    pip install -e .
    
    set MAYA_UI_LANGUAGE=en_US
    set PYTHONPATH=%WORKSPACE%;%PYTHONPATH%
    
    "C:\Program Files\Autodesk\Maya2023\bin\maya.exe" %WORKSPACE%\userSetup.ma

    WORKSPACEはJenkins内で使用することのできる変数です。このほかにも便利なものが定義されているので、使用するとワークスペースごとのちがいを吸収したり、パッケージにビルド番号を含めたりすることができます。
    ここまで設定ができたら、Jenkinsから実行してみます。mayatestを選んでビルド実行を選んでください。Mayaが立ち上がってダイアログが出て、OKボタンを押すとMayaが終了し、Jenkinsのジョブが成功になったら正常に動いています。

    また、コードをpushした際にmayatestが実行されるようにC:\repo\algorithm\hooks\post-updateを更新します。

    #!/bin/sh
    #
    # An example hook script to prepare a packed repository for use over
    # dumb transports.
    #
    # To enable this hook, rename this file to "post-update".
    
    C:/Windows/System32/curl.exe -X POST http://chiyama:11543de84b1ed83bc95e635d514727645d@localhost:8080/job/algorithm/build?token=JENKINS_BUILD_TRIGGER
    C:/Windows/System32/curl.exe -X POST http://chiyama:11543de84b1ed83bc95e635d514727645d@localhost:8080/job/mayatest/build?token=JENKINS_BUILD_TRIGGER

    では、コードをpushしてみましょう。pushした後にJenkins経由でMayaの起動ができたでしょうか!?

    まとめ

    JenkinsからMayaを立ち上げ、起動スクリプトを実行してMayaを終了することができるようになりました。ここまでできれば、テストはMaya上で実行すれば良いです。次回以降は、Maya上でのテストの実行やテスト結果とJenkinsとの連携を進めていきます。

    第48回の公開は、2022年11月を予定しております。

    痴山紘史

    日本CGサービス(JCGS) 代表

    大学卒業後、株式会社IMAGICA入社。放送局向けリアルタイムCGシステムの構築・運用に携わる。その後、株式会社リンクス・デジワークスにて映画・ゲームなどの映像制作に携わる。2010年独立、現職。映像制作プロダクション向けのパイプラインの開発と提供を行なっている。新人パパ。娘かわいい。

    TEXT_痴山紘史 / Hiroshi Chiyama(日本CGサービス
    EDIT_尾形美幸 / Miyuki Ogata(CGWORLD)