diff --git a/.github/workflows/build-engine-container.yml b/.github/workflows/build-engine-container.yml index 7bd317365..636e9e329 100644 --- a/.github/workflows/build-engine-container.yml +++ b/.github/workflows/build-engine-container.yml @@ -35,59 +35,44 @@ jobs: build-docker: needs: [config] - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest strategy: matrix: - os: [ubuntu-latest] - tag: - - "" - - cpu - - cpu-ubuntu20.04 - - nvidia - - nvidia-ubuntu20.04 - - cpu-ubuntu22.04 - - nvidia-ubuntu22.04 + # 各変数の説明 + # prefixes: Docker tagのプレフィックス。カンマ区切り。空文字列の場合、バージョン文字列のみがタグ名になる + # buildcache_prefix: ビルドキャッシュのプレフィックス。空文字列やカンマは使用不可 + # target: Dockerfileのビルドステージ名 + # base_image: Dockerfileのビルド用ステージのベースイメージ + # base_runtime_image: Dockerfileの実行用ステージのベースイメージ + # onnxruntime_version: ONNX Runtimeのバージョン + # platforms: Dockerのプラットフォームバリアント。カンマ区切り。 参考: https://docs.docker.com/build/building/multi-platform/ include: # Ubuntu 20.04 - - tag: "" + - prefixes: "cpu-ubuntu20.04" + buildcache_prefix: "cpu-ubuntu20.04" target: runtime-env base_image: ubuntu:20.04 base_runtime_image: ubuntu:20.04 onnxruntime_version: 1.13.1 platforms: linux/amd64,linux/arm64/v8 - - tag: cpu - target: runtime-env - base_image: ubuntu:20.04 - base_runtime_image: ubuntu:20.04 - onnxruntime_version: 1.13.1 - platforms: linux/amd64,linux/arm64/v8 - - tag: cpu-ubuntu20.04 - target: runtime-env - base_image: ubuntu:20.04 - base_runtime_image: ubuntu:20.04 - onnxruntime_version: 1.13.1 - platforms: linux/amd64,linux/arm64/v8 - - tag: nvidia - target: runtime-nvidia-env - base_image: ubuntu:20.04 - base_runtime_image: nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04 - onnxruntime_version: 1.13.1 - platforms: linux/amd64 - - tag: nvidia-ubuntu20.04 + - prefixes: "nvidia-ubuntu20.04" + buildcache_prefix: "nvidia-ubuntu20.04" target: runtime-nvidia-env base_image: ubuntu:20.04 base_runtime_image: nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04 onnxruntime_version: 1.13.1 platforms: linux/amd64 # Ubuntu 22.04 - - tag: cpu-ubuntu22.04 + - prefixes: ",cpu,cpu-ubuntu22.04" + buildcache_prefix: "cpu-ubuntu22.04" target: runtime-env base_image: ubuntu:22.04 base_runtime_image: ubuntu:22.04 onnxruntime_version: 1.13.1 platforms: linux/amd64,linux/arm64/v8 - - tag: nvidia-ubuntu22.04 + - prefixes: "nvidia,nvidia-ubuntu22.04" + buildcache_prefix: "nvidia-ubuntu22.04" target: runtime-nvidia-env base_image: ubuntu:22.04 base_runtime_image: nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 @@ -137,32 +122,43 @@ jobs: DOWNLOAD_RESOURCE_PATH: download/resource run: bash tools/process_voicevox_resource.bash + - name: Generate Docker image names + id: generate-docker-image-names + run: | + # Dockerイメージ名を outputs.tags に改行区切りで格納する + { + echo "tags<> "$GITHUB_OUTPUT" + + # ビルドキャッシュに指定するためのDockerイメージ名を生成する + # NOTE: デフォルトブランチへのコミットの場合のみキャッシュを作成する + - name: Generate Docker buildcache image names + id: generate-docker-buildcache-image-names + run: | + # --cache-from に指定するためのDockerイメージ名 + # 常にデフォルトブランチのビルドキャッシュ(*-latest-buildcache)を使用する + cache_from="type=registry,ref=${{ env.IMAGE_NAME }}:${{ matrix.buildcache_prefix }}-latest-buildcache" + + # --cache-to に指定するためのDockerイメージ名 + # リリースの場合、ビルドキャッシュを作成しないため、空文字列を格納する + cache_to="" + if [ "${{ needs.config.outputs.version_or_latest }}" = "latest" ]; then + cache_to="type=registry,ref=${{ env.IMAGE_NAME }}:${{ matrix.buildcache_prefix }}-latest-buildcache,mode=max" + fi + + # outputs に格納する + echo "cache-from=$cache_from" >> "$GITHUB_OUTPUT" + echo "cache-to=$cache_to" >> "$GITHUB_OUTPUT" + - name: Build and Deploy Docker image uses: docker/build-push-action@v5 - env: - IMAGE_TAG: - |- # If it's a release, add the version, otherwise add the `latest` - ${{ ( - matrix.tag != '' && ( - format('{0}:{1}-{2}', env.IMAGE_NAME, matrix.tag, needs.config.outputs.version_or_latest) - ) || format('{0}:{1}', env.IMAGE_NAME, needs.config.outputs.version_or_latest) - ) }} - IMAGE_CACHE_FROM: - |- # Always use the `latest` buildcache. :latest-buildcache or :{tag}-latest-buildcache - ${{ ( - matrix.tag != '' && ( - format('type=registry,ref={0}:{1}-latest-buildcache', env.IMAGE_NAME, matrix.tag) - ) || format('type=registry,ref={0}:latest-buildcache', env.IMAGE_NAME) - ) }} - IMAGE_CACHE_TO: - |- # If it's a release, do not create buildcache, otherwise create the `latest` buildcache. :latest-buildcache or :{tag}-latest-buildcache - ${{ ( - needs.config.outputs.version_or_latest == 'latest' && ( - matrix.tag != '' && ( - format('type=registry,ref={0}:{1}-latest-buildcache,mode=max', env.IMAGE_NAME, matrix.tag) - ) || format('type=registry,ref={0}:latest-buildcache,mode=max', env.IMAGE_NAME) - ) || '' - ) }} with: context: . builder: ${{ steps.buildx.outputs.name }} @@ -178,9 +174,9 @@ jobs: ONNXRUNTIME_VERSION=${{ matrix.onnxruntime_version }} target: ${{ matrix.target }} push: true - tags: ${{ env.IMAGE_TAG }} - cache-from: ${{ env.IMAGE_CACHE_FROM }} - cache-to: ${{ env.IMAGE_CACHE_TO }} + tags: ${{ steps.generate-docker-image-names.outputs.tags }} + cache-from: ${{ steps.generate-docker-buildcache-image-names.outputs.cache-from }} + cache-to: ${{ steps.generate-docker-buildcache-image-names.outputs.cache-to }} platforms: ${{ matrix.platforms }} run-release-test-workflow: diff --git a/README.md b/README.md index e16c9fad8..42fe80f8b 100644 --- a/README.md +++ b/README.md @@ -43,15 +43,15 @@ VOICEVOX エンジンもしくはエディタを起動した状態で http://127 #### CPU ```bash -docker pull voicevox/voicevox_engine:cpu-ubuntu20.04-latest -docker run --rm -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest +docker pull voicevox/voicevox_engine:cpu-latest +docker run --rm -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-latest ``` #### GPU ```bash -docker pull voicevox/voicevox_engine:nvidia-ubuntu20.04-latest -docker run --rm --gpus all -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:nvidia-ubuntu20.04-latest +docker pull voicevox/voicevox_engine:nvidia-latest +docker run --rm --gpus all -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:nvidia-latest ``` ##### トラブルシューティング diff --git a/tools/generate_docker_image_names.py b/tools/generate_docker_image_names.py new file mode 100644 index 000000000..c3abc34b9 --- /dev/null +++ b/tools/generate_docker_image_names.py @@ -0,0 +1,117 @@ +""" +Dockerリポジトリ名、バージョン文字列、カンマ区切りのプレフィックスを受け取り、 +バージョン文字列付きのDockerイメージ名を改行区切りで標準出力に出力する + +例 +$ python3 ./tools/generate_docker_image_names.py \ + --repository "REPO" \ + --version "VER" \ + --prefix ",A,B" +REPO:VER +REPO:A-VER +REPO:B-VER + +$ python3 ./tools/generate_docker_image_names.py \ + --repository "REPO" \ + --version "VER" \ + --prefix "" +REPO:VER +""" + +from argparse import ArgumentParser + + +def generate_docker_image_names( + repository: str, + version: str, + comma_separated_prefix: str, +) -> list[str]: + """ + Dockerリポジトリ名、バージョン文字列、カンマ区切りのプレフィックスを受け取り、 + バージョン文字列付きのDockerイメージ名を配列で返す + + prefixが空文字列でない場合、"{prefix}-{version}"をタグにする + + - 例: repository="REPO", version="VER", prefix="A" -> "REPO:A-VER" + + prefixが空文字列の場合、"{version}"をタグにする + + - 例: repository="REPO", version="VER", prefix="" -> "REPO:VER" + + Parameters + ---------- + repository : str + Dockerリポジトリ名 + version : str + バージョン文字列 + comma_separated_prefix : str + カンマ区切りのプレフィックス + + Returns + ------- + list[str] + Dockerイメージ名の配列。 + + Examples + -------- + >>> generate_docker_image_names("voicevox/voicevox_engine", "0.22.0", "cpu,cpu-ubuntu22.04") + ['voicevox/voicevox_engine:0.22.0', + 'voicevox/voicevox_engine:cpu-0.22.0', + 'voicevox/voicevox_engine:cpu-ubuntu22.04-0.22.0'] + """ + # カンマ区切りのタグ名を配列に変換 + prefixes = comma_separated_prefix.split(",") + + # 戻り値の配列 + docker_image_names: list[str] = [] + + for prefix in prefixes: + # プレフィックスが空文字列でない場合、末尾にハイフンを付ける + if prefix: + prefix = f"{prefix}-" + docker_image_names.append(f"{repository}:{prefix}{version}") + + return docker_image_names + + +def main() -> None: + parser = ArgumentParser() + parser.add_argument( + "--repository", + type=str, + required=True, + help="Dockerリポジトリ名(例: voicevox/voicevox_engine)", + ) + parser.add_argument( + "--version", + type=str, + default="latest", + help='バージョン文字列(例: "0.22.0", "latest")', + ) + parser.add_argument( + "--prefix", + type=str, + default="", + help='カンマ区切りのプレフィックス(例: ",cpu,cpu-ubuntu22.04", "nvidia,nvidia-ubuntu22.04")', + ) + + args = parser.parse_args() + + repository: str = args.repository + version: str = args.version + comma_separated_prefix: str = args.prefix + + # Dockerイメージ名を生成 + docker_image_names = generate_docker_image_names( + repository=repository, + version=version, + comma_separated_prefix=comma_separated_prefix, + ) + + # 標準出力に出力 + for docker_image_name in docker_image_names: + print(docker_image_name) + + +if __name__ == "__main__": + main() diff --git a/voicevox_engine/app/middlewares.py b/voicevox_engine/app/middlewares.py index 509e3d15a..d1fabe65a 100644 --- a/voicevox_engine/app/middlewares.py +++ b/voicevox_engine/app/middlewares.py @@ -42,7 +42,7 @@ async def global_execution_handler(request: Request, exc: Exception) -> Response if "*" in allow_origin: print( 'WARNING: Deprecated use of argument "*" in allow_origin. ' - 'Use option "--cors_policy_mod all" instead. See "--help" for more.', + 'Use option "--cors_policy_mode all" instead. See "--help" for more.', file=sys.stderr, )