version_control のソースコード

"""バージョンコントロールのためのスクリプト.

Summary:
    バージョンを上げる場合、FACE01_DEVフォルダからDISTフォルダへ必要なファイルだけをコピーしたり
    Dockerイメージを作ってDockerHubへアップロードしたりSphinxでドキュメントを生成してDISTフォルダへ
    コピーしたり煩雑な作業があり、その手順をすっかり忘れてしまいました。
    そこで上記工程をスクリプト化することにしました。

Args:
    None

Return:
    None

実行方法:
    python version_control.py

License for the Code.

Copyright Owner: Yoshitsugu Kesamaru
Please refer to the separate license file for the license of the code.
"""
import sphinx.ext.apidoc
import sphinx.cmd.build
import io
import os
import shutil
import subprocess
import sys
from glob import glob

# 標準出力と標準エラー出力をキャッチするためのバッファを作成
stdout_buffer = io.StringIO()
stderr_buffer = io.StringIO()

# # 標準出力と標準エラー出力をリダイレクト
# sys.stdout = stdout_buffer
# sys.stderr = stderr_buffer


"""作業ディレクトリを指定
"""
cwd = '/home/terms/bin/FACE01_DEV/'
os.chdir(cwd)
# subprocess.run(["play -v 1 -q 'voices/001これから自動バージ.wav'"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV")


[ドキュメント] def main(dokokara): if dokokara == 1: rewrite_version() sphinx_function() # cython() copy_files() docker_image() elif dokokara == 2: sphinx_function() cython() copy_files() docker_image() elif dokokara == 3: cython() copy_files() docker_image() elif dokokara == 4: copy_files() docker_image() elif dokokara == 5: docker_image()
[ドキュメント] def rewrite_version(): """バージョン情報の読み込み.""" ver: str = '' with open('FACE01_DEV_VERSION') as f: lines = f.read() ver = lines.split('\n')[0] old_ver = lines.split('\n')[1] other = lines.split('\n')[2:] print("これから作るバージョンは", ver, "でよろしいですか? [y/n]") subprocess.run(["play -v 1 -q voices/002これから作るバージ.wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") if not 'y' == input(): print("処理を終了します") exit(0) """①バージョン情報の書き換え """ print("①バージョン情報の書き換え") subprocess.run(["play -v 1 -q voices/003それでは複数ある該.wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") # sphinx_bk/origin/index.rst replacement_file_name: str = "/home/terms/bin/FACE01_DEV/sphinx_bk/origin/index.rst" with open(replacement_file_name) as r: lines: str = r.read() lines = lines.replace(old_ver, ver) with open(replacement_file_name, mode="w") as r: r.write(lines) # sphinx_bk/origin/conf.py replacement_file_name: str = "/home/terms/bin/FACE01_DEV/sphinx_bk/origin/conf.py" with open(replacement_file_name) as r: lines: str = r.read() lines = lines.replace(old_ver, ver) with open(replacement_file_name, mode="w") as r: r.write(lines) # README.md replacement_file_name: str = "/home/terms/bin/FACE01_DEV/README.md" with open(replacement_file_name) as r: lines: str = r.read() lines = lines.replace(old_ver, ver) with open(replacement_file_name, mode="w") as r: r.write(lines) # setup.py replacement_file_name: str = "/home/terms/bin/FACE01_DEV/setup.py" with open(replacement_file_name) as r: lines: str = r.read() lines = lines.replace(old_ver, ver) with open(replacement_file_name, mode="w") as r: r.write(lines) # make_DockerImages.sh replacement_file_name: str = "/home/terms/bin/FACE01_DEV/make_DockerImages.sh" with open(replacement_file_name) as r: lines: str = r.read() lines = lines.replace(old_ver, ver) with open(replacement_file_name, mode="w") as r: r.write(lines) subprocess.run(["play -v 1 -q voices/004書き換えが終わった.wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV")
[ドキュメント] def sphinx_function(): """②SphinxによるDocファイルの自動生成. sphinxエラーまとめ.mdファイルを参照 """ print("②SphinxによるDocファイルの自動生成") # sphinx_bkフォルダからconf.pyとindex.rstを複製 try: # ファイルのコピー shutil.copy2("/home/terms/bin/FACE01_DEV/sphinx_bk/origin/conf.py", "/home/terms/bin/FACE01_DEV/sphinx/") shutil.copy2("/home/terms/bin/FACE01_DEV/sphinx_bk/origin/index.rst", "/home/terms/bin/FACE01_DEV/sphinx/") print("sphinx_bkフォルダからconf.pyとindex.rstを複製しました") except Exception as e: print(e) # エラー処理 exit(1) # sphinx-apidocの実行 try: sphinx.ext.apidoc.main([ "-f", "-o", "/home/terms/bin/FACE01_DEV/sphinx", "/home/terms/bin/FACE01_DEV/example", # exampleディレクトリを追加 "/home/terms/bin/FACE01_DEV/face01lib/" # face01libディレクトリを追加 ]) except Exception as e: # エラーメッセージを出力 print("エラーが発生しました:", e) print("標準出力:", stdout_buffer.getvalue()) print("標準エラー出力:", stderr_buffer.getvalue()) exit(1) except SystemExit: pass # SystemExitの場合は何もしない # sphinx-buildの実行 try: sphinx.cmd.build.main([ "-b", "html", "-E", "/home/terms/bin/FACE01_DEV/sphinx", "/home/terms/bin/FACE01_DEV/docs" ]) except Exception as e: print(e) # エラー処理 exit(1)
[ドキュメント] def cython(): """③Cython化. face01lib/compile.py, face01lib/arm_compile.py それぞれを参照 """ print("③Cython化") subprocess.run(["play -v 1 -q voices/006ライブラリファイル.wav"], shell=True, check=True, cwd='/home/terms/bin/FACE01_DEV/') # 作業ディレクトリを移動 try: os.chdir('/home/terms/bin/FACE01_DEV/face01lib/') print("作業ディレクトリを移動しました: ", os.getcwd()) # 現在の作業ディレクトリを出力 except Exception as e: print(f"ディレクトリの移動に失敗しました: {e}") # 全ての.pyファイルを取得 py_files = glob("*.py") # 除外するファイル名リスト excluded_files = ['compile.py', '__init__.py', 'arm_compile.py'] # 除外ファイルを除くリストを作成 py_files = [file for file in py_files if file not in excluded_files] # デバッグ用出力 print(py_files) # pyファイルからpyxファイルを複製 for py_file in py_files: shutil.copy(py_file, 'pyx/') try: # 作業ディレクトリをpyxディレクトリに移行 os.chdir('/home/terms/bin/FACE01_DEV/face01lib/pyx') print("作業ディレクトリを移動しました: ", os.getcwd()) # 現在の作業ディレクトリを出力 except Exception as e: print(f"ディレクトリの移動に失敗しました: {e}") print(cwd) # デバッグ用の出力 print("現在の作業ディレクトリ: ", os.getcwd()) print("CWDの内容: ", os.listdir(os.getcwd())) # 現在のディレクトリの内容を出力 # pyxフォルダの全ての.py拡張子を.pyxに変更 for py_file in py_files: basename: str = py_file.split('.')[0] shutil.move(basename + '.py', basename + ".pyx") # Python仮想環境を起動 # sourceコマンドは.でないとsubprocessで使用できない? activate_cmd: list = [". /home/terms/bin/FACE01_DEV/bin/activate"] try: ret = subprocess.run(activate_cmd, shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") except subprocess.CalledProcessError as e: print(e) subprocess.run(["play -v 1 -q voices/error.wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") exit(1) # compile.pyをpyxフォルダへ複製 shutil.copy("/home/terms/bin/FACE01_DEV/face01lib/compile.py", "/home/terms/bin/FACE01_DEV/face01lib/pyx/") # arm_compile.pyをpyxフォルダへ複製 # shutil.copy("/home/terms/bin/FACE01_DEV/face01lib/arm_compile.py", "/home/terms/bin/FACE01_DEV/face01lib/pyx/") # ############################### # pyxフォルダ内でコンパイル処理 ------------------- # ############################### os.chdir('/home/terms/bin/FACE01_DEV/face01lib/pyx') print("作業ディレクトリを移動しました: ", os.getcwd()) # 現在の作業ディレクトリを出力 # x86用バイナリ作成 try: os.system("python compile.py build_ext --inplace") except Exception as e: # エラーが発生した場合 print(f"エラーが発生しました: {e}") # エラー音を再生 os.system("play -v 1 -q /home/terms/bin/FACE01_DEV/voices/error.wav") exit(1) # ## arm用バイナリ作成 # ### 参考:python3 setup.py build_ext --compiler=arm-linux-gnueabihf-gcc # arm_compile_cmd: list = ["python /home/terms/bin/FACE01_DEV/face01lib/pyx/arm_compile.py build_ext --compiler=arm-linux-gnueabihf-gcc --inplace"] # try: # ret = subprocess.run(arm_compile_cmd, shell=True, check=True) # except subprocess.CalledProcessError as e: # print(e) # exit(1) # --------------------------------------------------------------------- try: # subprocess.run(["play -v 1 -q voices/error.wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") print("コンパイル完了。") except subprocess.CalledProcessError as e: print(e) subprocess.run(["play -v 1 -q voices/error.wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") exit(1) os.chdir('/home/terms/bin/FACE01_DEV/face01lib/') # compile.pyと_init_.pyを除く py_files: list = glob("*[!'compile'|!'__init__']*.py") # FACE01_DEV/face01lib/のpyファイルはpy_filesフォルダへ移動 for py_file in py_files: try: shutil.move( py_file, "/home/terms/bin/FACE01_DEV/face01lib/py_files/") except: continue
[ドキュメント] def copy_files(): """④必要なファイルをFACE01_DEVからDISTフォルダに上書き複製.""" print("④必要なファイルをFACE01_DEVからDISTフォルダに上書き複製") os.chdir('/home/terms/bin/FACE01_DEV/') subprocess.run(["play -v 1 -q voices/007必要なファイルをF.wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") # .soファイルをDISTディレクトリに移動する so_files: list = glob("/home/terms/bin/FACE01_DEV/face01lib/*.so") for so_file in so_files: # file_name: str = so_file.split('/')[-1] # shutil.copy(so_file, "/home/terms/bin/FACE01_DEV/face01lib/" + file_name) shutil.copy(so_file, "/home/terms/bin/DIST/face01lib/") # 各フォルダ内を素の状態に戻す # pyxフォルダ shutil.rmtree("/home/terms/bin/FACE01_DEV/face01lib/pyx") os.mkdir("/home/terms/bin/FACE01_DEV/face01lib/pyx") # docsフォルダ shutil.copytree('/home/terms/bin/FACE01_DEV/docs/', '/home/terms/bin/DIST/docs/', dirs_exist_ok=True) # exampleフォルダのpyファイル py_files: list = glob("/home/terms/bin/FACE01_DEV/example/*.py") for py_file in py_files: shutil.copy(py_file, '/home/terms/bin/DIST/example/') # imgフォルダ shutil.copytree('/home/terms/bin/FACE01_DEV/img/', '/home/terms/bin/DIST/img/', dirs_exist_ok=True) # README.mdファイル shutil.copy("/home/terms/bin/FACE01_DEV/README.md", "/home/terms/bin/DIST/README.md") # imagesフォルダ shutil.copytree('/home/terms/bin/FACE01_DEV/images/', '/home/terms/bin/DIST/images/', dirs_exist_ok=True) # dockerフォルダ shutil.copytree('/home/terms/bin/FACE01_DEV/docker/', '/home/terms/bin/DIST/docker/', dirs_exist_ok=True) # assetsフォルダ shutil.copytree('/home/terms/bin/FACE01_DEV/assets/', '/home/terms/bin/DIST/assets/', dirs_exist_ok=True) # config.iniファイル shutil.copy("/home/terms/bin/FACE01_DEV/config.ini", "/home/terms/bin/DIST/config.ini") # requirements.txtファイル shutil.copy("/home/terms/bin/FACE01_DEV/requirements.txt", "/home/terms/bin/DIST/requirements.txt") # make_DockerImages.shファイル shutil.copy("/home/terms/bin/FACE01_DEV/make_DockerImages.sh", "/home/terms/bin/DIST/make_DockerImages.sh") # INSTALL_FACE01_DEVファイル shutil.copy("/home/terms/bin/FACE01_DEV/INSTALL_FACE01_DEV.sh", "/home/terms/bin/DIST/INSTALL_FACE01_DEV.sh")
[ドキュメント] def docker_image(): """⑤Docker image作成とpush. make_DockerImage.sh参照 """ print("⑤Docker image作成とpush") subprocess.run(["play -v 1 -q voices/008DISTフォルダに.wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") subprocess.run(["play -v 1 -q voices/009ちなみにCPUやメ.wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") cwd: str = "/home/terms/bin/DIST/" os.chdir(cwd) try: ret = subprocess.run("/home/terms/bin/DIST/make_DockerImages.sh", shell=True, check=True, cwd="/home/terms/bin/DIST") except subprocess.CalledProcessError as e: print(e) subprocess.run(["play -v 1 -q voices/error.wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") exit(1)
if __name__ == "__main__": # 変数`dokokara`の説明 # 1: 最初から処理する # 2: sphinxから処理する # 3: Cythonから処理する # 4: 必要なファイルをFACE01_DEVからDISTフォルダに上書き複製から始める # 5: Docker image作成とpushから始める dokokara: int = 1 main(dokokara) # rewrite_version() # sphinx_function() # cython() # copy_files() # docker_image() # subprocess.run(["play -v 1 -q voices/001全ての作業が滞りな….wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV") # subprocess.run(["play -v 1 -q voices/002DISTフォルダを….wav"], shell=True, check=True, cwd="/home/terms/bin/FACE01_DEV")