-
Notifications
You must be signed in to change notification settings - Fork 209
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Linux用実行バイナリの自動ビルドを追加 (#95) #96
Linux用実行バイナリの自動ビルドを追加 (#95) #96
Conversation
NuitkaのキャッシュをうまくGitHub Actions上で保存できていなかったのでDraftにしていましたが、解決しました。 |
このPRは、masterブランチにpush、またはGitHub Release作成のタイミングで、 成果物は、master pushまたはRelease作成後、およそ1.5時間後にGitHub Artifact(GitHub Actionsの実行結果ページ)にアップロードされます。 バイナリの動作確認は各LinuxディストリビューションのDockerコンテナ内でしていますが、実環境では、テストしたDockerコンテナとディストリビューションは同じでも、動作する環境と動作しない環境が出てくる可能性はあります。
このPRで考慮していない ディストリビューションやCPUの種類など への対応に関する議論、 動作状況amd64 (x86_64)
要求する共有ライブラリ・バージョン
|
現在差分にはコマンドの実行ユーザを簡便に切り替えるための このPRでgosuを使っているのは、
ホスト側のディレクトリをコンテナにマウントして成果物とキャッシュを取り出している関係で、entrypointでroot権限を使って、 マウントされたディレクトリの所有者は、ホスト側にディレクトリが存在しない場合rootに、存在する場合もともとの所有者(ホスト側のUID・GID)になります。変更にはroot権限が必要です。 対応の候補として考えているもの
|
一応、docker runではなく、docker buildの方で実行バイナリをビルドする実装も試そうと思っています。 バイナリを実行するコンテナにも拡張できそうです。 ビルド成果物やNuitkaのキャッシュは、 ただ、Dockerイメージのキャッシュの扱いが難しそうです |
要点
ready for reviewにしていましたが、masterにマージされた変更が影響しそうなのでdraftに戻します |
詳細ありがとうございます!
対応バージョンがわかるようになっていれば全く問題ないと思います。
こちらもその方針で大丈夫です。
こちら、僕自身よくわかっていなくて申し訳ないのですが、gosuを使うメリット・使わない場合のデメリットをご教示頂けると非常に助かります・・・。 |
実行用のイメージ バイナリを実行する実行用のイメージを配布する可能性を想定していることも背景にあります(このイメージを配布するメリットはいまのところ思いつきませんが、バイナリにすることでプログラムの実行が高速になる、などがあれば意味があるかもしれません)。 デメリットについては、 メリットについては、 https://github.com/Hiroshiba/voicevox_engine/pull/105#issuecomment-922242197 の前半で言及した内容で、ビルド時ではありますが、ホスト側が影響を受ける可能性を予防しようとしています。 ちなみに、gosuの利用を継続するようであれば、gosuはディストリビューションのリポジトリからもインストールできる( と、思ったのですが、 #105 の方でディストリビューションのリポジトリを使用する形に対応 e6d725d されていますね。 |
なるほどです! |
Dockerfileにおけるバイナリビルド用スクリプトの書き出しについて、 ファイルに書き出してもいいのですが、Dockerの外部から使うことを想定していないスクリプトのため、
また、バイナリビルド用スクリプトを 個人的には、これらは、それほど大きな問題ではないと思うので、希望、またはいい方法があれば、将来のPRで対応するのがよいと思っていますが、このPRで考えた方がよさそうでしょうか。 ちなみに、以前言及していたdocker buildのタイミングでバイナリビルドする方法(ビルド成果物を含むレイヤーを作成する方法、https://github.com/Hiroshiba/voicevox_engine/pull/96#issuecomment-921534213 )は、GitHub Actionsの14GBの容量を使い切って、成果物の取り出しに失敗してしまうようだったので、むずかしそうです。複数のJobやWorkflowにDockerビルドとArtifactアップロードを分ければできるかも、とは思っています。 実環境での動作検証については、 #106 で募集し、 #95 はこのPRと一緒に閉じていいと思っています。 fork先での現在 Hiroshiba@28eba6e のビルド: https://github.com/aoirint/voicevox_engine/actions/runs/1250414693 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
./docker/scripts/のようなディレクトリを作るというのも考えましたが
VOICEVOXリポジトリと同じ用に、./build/ディレクトリを作る手もありそうです。
でも結局実行するのは数コマンドだけだし、Dockerfile内に記述されていてもあまり問題ではないかなと思いました!
docker runで呼び出す方法
僕も同意見で、docker buildとdocker runどちらでも良いと思っています。
軽量化されたり、よりよい方法が見つかったときに変更を考えましょう!
(artifactじゃなくreleasesにアップロードできるくらい軽量化したいですね・・・。)
ちなみにwindows版も自動ビルドを試される予定はありますか? |
ビルドまでの道筋は整っていると思ったので、#107 を開いてみました。 coreの自動ビルド準備時のGitHub Workflowが似ていたので、参考にさせていただいています。 |
@aoirint はい、ぜひ参考にしてください! また、CPU版やubuntu18ビルド版も用意してみました。もしよかったらお使いください! |
ref: #95
ref: #85
内容
Docker内でLinux用実行バイナリを自動ビルドするGitHub Workflowを追加します。
run.pyをNuitkaでビルドし、成果物をGitHub ActionsのArtifactとして書き出します。
ビルドしたバイナリの動作には、CUDA/cuDNN(GPUの場合)とlibsndfileを別途インストールすることが必要です。
# On Ubuntu 20.04 sudo apt install libsndfile1
TODO
GLIBCXX_3.4.26
(libstdc++
)依存のため、ビルドはできるが起動しないstrings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
にGLIBCXX_3.4.26
が含まれる必要がある)*.so
に加えて*.so.*
をコピー)ubuntu:focal
,9d6a8699fb5c9c39cf08a0871bd6219f0400981c570894cd8cbea30d3424a31f
)nvidia/cuda:11.4.1-cudnn8-runtime-ubuntu20.04
,ddd2828688c94c18b77f095577652faa053052cc40e32b870481087918f04a64
)debian:stable-20210902
,a9cb4a9ddf9f28bc17fc390baba42ac7eb067ae54d20b55720ed9ff3323b1d87
)fedora:34
,d18bc88f640bc3e88bbfacaff698c3e1e83cae649019657a3880881f2549a1d0
)Docker内でビルドする利点
autoconf
やcmake
を使ったビルドスクリプト構築の知見はもっていません(ネイティブビルドの方がよさそうであればCloseするかもです)
Dockerイメージのpushについて
*-buildcache
というビルド環境のキャッシュ用のDockerイメージのみpushします(--cache-to
オプション)build-docker.yml
の方に記述したほうがいいかもしれませんrun.py
を実行していますbuild.yml
を実行バイナリビルド用のWorkflowと考えていますキャッシュについて
docker/build-push-action@v2
のload: true
というオプションを使っていますload: true
により、docker-container
という仮想化されたDocker環境からDockerイメージを取り出し、あとのstepで使えるようにしているので、イメージサイズの2倍の容量が必要かもしれません