Skip to content
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

DockerビルドCI: イメージタグの別名を別々にビルドしないようにする #1498

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
2e0d450
Docker: イメージタグの別名を別々にビルドしないようにする
aoirint Dec 2, 2024
3e180d6
create tools/generate_docker_image_names.bash
aoirint Dec 2, 2024
fa77f87
comment: quote shell args
aoirint Dec 2, 2024
d4bb31f
comment: improve examples
aoirint Dec 2, 2024
3ef0338
comment: improve examples
aoirint Dec 2, 2024
bfaefce
comment: improve examples
aoirint Dec 2, 2024
cff34d6
comment: 冗長な例を削除
aoirint Dec 2, 2024
bdf3ec4
Merge branch 'master' into feature/docker-commonize-hash-of-same-feat…
aoirint Dec 2, 2024
7cdda64
-eq -> =
aoirint Dec 2, 2024
0269f25
fix SC2086: double quote $GITHUB_OUTPUT
aoirint Dec 2, 2024
45f9db6
fix wrong step output reference
aoirint Dec 2, 2024
6c9e331
remove shell: bash
aoirint Dec 2, 2024
8e45a97
コンフリクト解消時にUbuntu 22.04のincludeが増殖していたのを削除
aoirint Dec 2, 2024
45fe81e
print usage to stderr
aoirint Dec 2, 2024
74415b5
add matrix var descriptions
aoirint Dec 2, 2024
a1cefe8
add comment
aoirint Dec 2, 2024
4a9bd5f
fix comment
aoirint Dec 2, 2024
5185c6a
update comment
aoirint Dec 2, 2024
5d694c3
fix buildcache image name: add repository
aoirint Dec 2, 2024
2553d7e
remove typo quote
aoirint Dec 2, 2024
ccf960c
create tools/generate_docker_image_names.py
aoirint Dec 3, 2024
42e98d3
pysen run format
aoirint Dec 3, 2024
06ea55f
update usage
aoirint Dec 3, 2024
4f68687
fix B950
aoirint Dec 3, 2024
6f2a03c
Bashの行コメント"#"をdocstringに変えたときに消し忘れていたので削除
aoirint Dec 3, 2024
d0967b7
コメントの表現修正: タグ名 -> Dockerイメージ名
aoirint Dec 3, 2024
7f195e9
コメントの表現修正: タグ名 -> Dockerイメージ名
aoirint Dec 3, 2024
a7d0ce4
コメントの表現修正: タグ名 -> Dockerイメージ名
aoirint Dec 3, 2024
ca8b31b
add --repository argument help
aoirint Dec 3, 2024
71e6e99
コメントの表現修正: 空文字 -> 空文字列
aoirint Dec 3, 2024
8695207
helpの出力を末尾句点なしに統一
aoirint Dec 3, 2024
7acfa20
Update .github/workflows/build-engine-container.yml
aoirint Dec 10, 2024
f15175f
Update .github/workflows/build-engine-container.yml
aoirint Dec 10, 2024
97a6d9b
Update tools/generate_docker_image_names.py
aoirint Dec 10, 2024
ca5583c
Update tools/generate_docker_image_names.py
aoirint Dec 10, 2024
e4749ad
Update tools/generate_docker_image_names.py
aoirint Dec 10, 2024
a480d21
Update tools/generate_docker_image_names.py
aoirint Dec 10, 2024
8a46527
Update .github/workflows/build-engine-container.yml
aoirint Dec 10, 2024
a6fbb82
Update tools/generate_docker_image_names.py
aoirint Dec 10, 2024
2c6b51c
Update tools/generate_docker_image_names.py
aoirint Dec 10, 2024
5f6de21
Update tools/generate_docker_image_names.py
aoirint Dec 10, 2024
57e2f2d
pysen run format
aoirint Dec 10, 2024
07568fe
Merge remote-tracking branch 'origin/master' into feature/docker-comm…
aoirint Dec 10, 2024
f4ca78d
Update .github/workflows/build-engine-container.yml
aoirint Dec 12, 2024
093a46d
Update .github/workflows/build-engine-container.yml
aoirint Dec 12, 2024
262f25d
Update tools/generate_docker_image_names.py
aoirint Dec 12, 2024
039bf8c
Update .github/workflows/build-engine-container.yml
aoirint Dec 12, 2024
887e252
Update .github/workflows/build-engine-container.yml
aoirint Dec 12, 2024
bc57edf
Update tools/generate_docker_image_names.py
aoirint Dec 12, 2024
b6336d4
Update .github/workflows/build-engine-container.yml
aoirint Dec 12, 2024
260ff69
rename matrix.tags -> matrix.prefixes
aoirint Dec 12, 2024
195ec6c
rename buildcache_tag -> buildcache_prefix
aoirint Dec 12, 2024
83020ef
lockファイルに更新があったっぽいので追従
Hiroshiba Dec 12, 2024
1c577c6
generate_docker_image_names: styling arguments
aoirint Dec 12, 2024
d4b66a9
Merge remote-tracking branch 'hiroshiba/lockファイルに更新があったっぽいので追従' into …
aoirint Dec 12, 2024
c60808b
Update .github/workflows/build-engine-container.yml
Hiroshiba Dec 13, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 55 additions & 59 deletions .github/workflows/build-engine-container.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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,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,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-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-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
Expand Down Expand Up @@ -137,32 +122,43 @@ jobs:
DOWNLOAD_RESOURCE_PATH: download/resource
run: bash tools/process_voicevox_resource.bash

- name: <Build> Generate Docker image names
id: generate-docker-image-names
run: |
# Dockerイメージ名を outputs.tags に改行区切りで格納する
{
echo "tags<<EOF"

python3 tools/generate_docker_image_names.py \
--repository "${{ env.IMAGE_NAME }}" \
--version "${{ needs.config.outputs.version_or_latest }}" \
--prefix "${{ matrix.prefixes }}"

echo "EOF"
} >> "$GITHUB_OUTPUT"

# ビルドキャッシュに指定するためのDockerイメージ名を生成する
# NOTE: デフォルトブランチへのコミットの場合のみキャッシュを作成する
- name: <Build> 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/Deploy> 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 }}
Expand All @@ -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:
Expand Down
5 changes: 5 additions & 0 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

117 changes: 117 additions & 0 deletions tools/generate_docker_image_names.py
aoirint marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -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()