Skip to content

Commit a6be136

Browse files
committed
deployment: Move py38, py310.py312 difference from do into deployment/build.py
1 parent fa8f56d commit a6be136

8 files changed

Lines changed: 236 additions & 105 deletions

File tree

deployment/Dockerfile.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,5 @@ RUN poetry config virtualenvs.create false
4747
RUN poetry config virtualenvs.path /opt/venv
4848

4949
# Install project dependencies
50-
RUN poetry lock
50+
RUN poetry lock --no-update
5151
RUN poetry install --no-interaction --no-ansi --no-root --with dev
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ COPY ./deployment/${PYPROJECT} ./pyproject.toml
3636
COPY ./deployment/${POETRYLOCK} ./poetry.lock
3737

3838
# Install project dependencies
39-
RUN poetry lock
39+
RUN poetry lock --no-update
4040
RUN poetry install --no-root --with dev
4141

4242
# Set the final working directory

deployment/build.py

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import argparse
2+
import itertools
3+
import os
4+
import shutil
5+
import subprocess
6+
import sys
7+
from pathlib import Path
8+
9+
SCRIPT_DIR = Path(__file__).resolve().parent
10+
PROJECT_ROOT = SCRIPT_DIR.parent
11+
12+
13+
def get_cp_tag(version):
14+
try:
15+
major, minor = version.split(".")[:2]
16+
except Exception as e:
17+
print(f"Version '{version}' format error: {e}")
18+
sys.exit(1)
19+
return f"cp{major}{minor}"
20+
21+
22+
def find_matching_file(filename, cp_tags):
23+
for l in range(len(cp_tags), 0, -1):
24+
for combo in itertools.combinations(cp_tags, l):
25+
candidate = f"{filename}.{'.'.join(combo)}"
26+
if (SCRIPT_DIR / candidate).exists():
27+
return candidate, True
28+
return candidate, False
29+
30+
31+
def copy_project_files(versions):
32+
cp_tags = [get_cp_tag(v) for v in versions]
33+
34+
toml_file, toml_found = find_matching_file("pyproject.toml", cp_tags)
35+
lock_file, lock_found = find_matching_file("poetry.lock", cp_tags)
36+
37+
if not toml_found or not lock_found:
38+
print(f"Error: Could not find {toml_file}, {lock_file}")
39+
sys.exit(1)
40+
41+
shutil.copy(SCRIPT_DIR / toml_file, PROJECT_ROOT / "pyproject.toml")
42+
shutil.copy(SCRIPT_DIR / lock_file, PROJECT_ROOT / "poetry.lock")
43+
print(f"Copied {toml_file}, {lock_file}")
44+
45+
return cp_tags
46+
47+
48+
def build_wheel(cp_tags, python_version):
49+
try:
50+
env = os.environ.copy()
51+
env["PYTHON_VERSION"] = python_version
52+
print(f"Setting PYTHON_VERSION to {python_version}")
53+
54+
subprocess.run(
55+
["poetry", "build", "-f", "wheel"],
56+
check=True,
57+
cwd=PROJECT_ROOT,
58+
env=env,
59+
)
60+
61+
dist_dir = PROJECT_ROOT / "dist"
62+
for wheel_file in dist_dir.glob("*.whl"):
63+
parts = wheel_file.stem.split("-")
64+
if len(parts) >= 2 and "none" in parts[-2]:
65+
new_name = (
66+
"-".join(parts[:-2] + [".".join(cp_tags)] + parts[-1:])
67+
+ wheel_file.suffix
68+
)
69+
wheel_file.rename(dist_dir / new_name)
70+
print(f"Renamed wheel to: {new_name}")
71+
except subprocess.CalledProcessError as e:
72+
print(f"Error building wheel: {e}")
73+
sys.exit(1)
74+
75+
76+
def clean():
77+
dist_dir = PROJECT_ROOT / "dist"
78+
if dist_dir.exists():
79+
shutil.rmtree(dist_dir)
80+
print("Removed dist directory")
81+
82+
pyproject_file = PROJECT_ROOT / "pyproject.toml"
83+
if pyproject_file.exists():
84+
pyproject_file.unlink()
85+
print("Removed pyproject.toml")
86+
87+
lock_file = PROJECT_ROOT / "poetry.lock"
88+
if lock_file.exists():
89+
lock_file.unlink()
90+
print("Removed poetry.lock")
91+
92+
93+
def main():
94+
parser = argparse.ArgumentParser(
95+
description="Build Python wheels or clean project"
96+
)
97+
parser.add_argument(
98+
"--clean",
99+
action="store_true",
100+
help="Clean the project (remove dist directory, pyproject.toml, and poetry.lock)",
101+
)
102+
parser.add_argument(
103+
"--versions",
104+
nargs="+",
105+
default=["3.8"],
106+
help="Python version(s) to build for (default: 3.8)",
107+
)
108+
parser.add_argument(
109+
"--copy-only",
110+
action="store_true",
111+
help="Only copy pyproject.toml, and poetry.lock",
112+
)
113+
114+
args = parser.parse_args()
115+
116+
if args.clean:
117+
clean()
118+
elif args.copy_only:
119+
cp_tags = copy_project_files(args.versions)
120+
else:
121+
print(f"Build for Python Versions: {', '.join(args.versions)}")
122+
cp_tags = copy_project_files(args.versions)
123+
python_version = ".".join(args.versions[0].split(".")[:2])
124+
build_wheel(cp_tags, python_version)
125+
126+
127+
if __name__ == "__main__":
128+
main()

deployment/do

Lines changed: 106 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,69 @@ ARGS="${@:2}"
1010

1111
DATE=$(date -u +"%Y-%m-%d-%H-%M-%S")
1212

13+
build_ubuntu_docker() {
14+
local UBUNTU_VERSION=$1
15+
local ARGS="${@:2}"
16+
17+
DOCKER_BUILDKIT=1 docker build \
18+
--file deployment/Dockerfile.ubuntu \
19+
--build-arg UBUNTU_VERSION="$UBUNTU_VERSION" \
20+
$ARGS \
21+
--tag "test-ubuntu-${UBUNTU_VERSION}" \
22+
.
23+
}
24+
25+
run_docker() {
26+
local VOLUME=$1
27+
local WORKDIR=$2
28+
local IMAGE=$3
29+
local UBUNTU_VERSION=$4
30+
local ARG=$6
31+
local ARGS=${@:7}
32+
33+
local IMAGE_TAG="${IMAGE}-${UBUNTU_VERSION}"
34+
35+
if [[ -z "$ARG" ]]; then
36+
docker run -it --rm \
37+
-v ./:$VOLUME \
38+
-w $WORKDIR \
39+
"$IMAGE_TAG" \
40+
bash
41+
else
42+
docker run -it --rm \
43+
-v ./:$VOLUME \
44+
-w $WORKDIR \
45+
"$IMAGE_TAG" \
46+
bash \
47+
$ARG \
48+
"$ARGS"
49+
fi
50+
}
51+
52+
build_brainframe_cli_env() {
53+
local DOCKERFILE=$1
54+
local PYPROJECT=$2
55+
local POETRYLOCK=$3
56+
local UBUNTU_VERSION=$4
57+
local ADDITIONAL_ARGS=${@:5}
58+
59+
local IMAGE_TAG="brainframe-cli-env-${UBUNTU_VERSION}"
60+
61+
# Build the Docker image
62+
DOCKER_BUILDKIT=1 docker build \
63+
--file "deployment/$DOCKERFILE" \
64+
--build-arg WORKDIR=/deployment \
65+
--build-arg UBUNTU_VERSION="$UBUNTU_VERSION" \
66+
--build-arg PYPROJECT="$PYPROJECT" \
67+
--build-arg POETRYLOCK="$POETRYLOCK" \
68+
$ADDITIONAL_ARGS \
69+
--tag "$IMAGE_TAG" \
70+
.
71+
}
72+
1373
if [ -z $CMD ] || [ $CMD == '-h' ] || [ $CMD == '--help' ]; then
1474
echo " Copyright (c) 2024 AOTU, Inc. All rights reserved."
15-
cat $CMDLINE | grep echo | awk '(NR>2)' | awk '(NR<29)' | awk '{$1= ""; print $0}'
75+
cat $CMDLINE | grep echo | awk '(NR>2)' | awk '(NR<11)' | awk '{$1= ""; print $0}'
1676
fi
1777

1878
case $CMD in
@@ -24,129 +84,72 @@ case $CMD in
2484
echo ┌─────── deploy brainframe-cli ──────────────────────────
2585
;;
2686

27-
ubuntu-2404-build)
28-
echo ├ ./deployment/do ubuntu-2404-build # --no-cache
29-
DOCKER_BUILDKIT=1 docker build --file deployment/Dockerfile.ubuntu --build-arg UBUNTU_VERSION=24.04 $ARGS --tag ubuntu-2404 .
30-
;;
31-
32-
ubuntu-2404-run)
33-
echo │ ./deployment/do ubuntu-2404-run
34-
docker run -it --rm -v ./:/brainframe-cli -w /brainframe-cli/dist ubuntu-2404 bash
35-
;;
36-
37-
ubuntu-2204-build)
38-
echo ├ ./deployment/do ubuntu-2204-build # --no-cache
39-
DOCKER_BUILDKIT=1 docker build --file deployment/Dockerfile.ubuntu --build-arg UBUNTU_VERSION=22.04 $ARGS --tag ubuntu-2204 .
40-
;;
41-
42-
ubuntu-2204-run)
43-
echo │ ./deployment/do ubuntu-2204-run
44-
docker run -it --rm -v ./:/brainframe-cli -w /brainframe-cli/dist ubuntu-2204 bash
45-
;;
46-
47-
ubuntu-2004-build)
48-
echo ├ ./deployment/do ubuntu-2004-build # --no-cache
49-
DOCKER_BUILDKIT=1 docker build --file deployment/Dockerfile.ubuntu --build-arg UBUNTU_VERSION=20.04 $ARGS --tag ubuntu-2004 .
50-
;;
51-
52-
ubuntu-2004-run)
53-
echo │ ./deployment/do ubuntu-2004-run
54-
docker run -it --rm -v ./:/brainframe-cli -w /brainframe-cli/dist ubuntu-2004 bash
55-
;;
56-
57-
ubuntu-1804-build)
58-
echo ├ ./deployment/do ubuntu-1804-build # --no-cache
59-
DOCKER_BUILDKIT=1 docker build --file deployment/Dockerfile.ubuntu --build-arg UBUNTU_VERSION=18.04 $ARGS --tag ubuntu-1804 .
87+
ubuntu-build)
88+
echo ├ ./deployment/do ubuntu-build 20.04 # --no-cache
89+
build_ubuntu_docker $ARGS
6090
;;
6191

62-
ubuntu-1804-run)
63-
echo │ ./deployment/do ubuntu-1804-run
64-
docker run -it --rm -v ./:/brainframe-cli -w /brainframe-cli/dist ubuntu-1804 bash
92+
ubuntu-run)
93+
echo │ ./deployment/do ubuntu-run 20.04
94+
run_docker /brainframe-cli /brainframe-cli/dist test-ubuntu $ARGS
6595
;;
6696

6797
comments_only)
6898
echo └────────────────────────────────────────────────────────
6999
echo ┌─────── build brainframe-cli ───────────────────────────
70100
;;
71101

72-
brainframe-cli-2404-env-build)
73-
echo ├ ./deployment/do brainframe-cli-2404-env-build # --no-cache
74-
DOCKER_BUILDKIT=1 docker build --file deployment/Dockerfile.env.py312 --build-arg WORKDIR=/deployment --build-arg UBUNTU_VERSION=24.04 --build-arg PYPROJECT=pyproject.toml.py310.py312 --build-arg POETRYLOCK=poetry.lock.py310.py312 $ARGS --tag brainframe-cli-env:2404 .
75-
;;
102+
brainframe-cli-env-build)
103+
echo ├ ./deployment/do brainframe-cli-env-build 20.04 # --no-cache
104+
case $ARG in
105+
24.04)
106+
build_brainframe_cli_env Dockerfile.env.cp312 pyproject.toml.cp310.cp312 poetry.lock.cp310.cp312 $ARGS
107+
;;
76108

77-
brainframe-cli-2404-env-run)
78-
echo │ ./deployment/do brainframe-cli-2404-env-run
79-
docker run -it --rm -v ./:/brainframe-cli -w /deployment brainframe-cli-env:2404 bash
80-
;;
109+
22.04)
110+
build_brainframe_cli_env Dockerfile.env pyproject.toml.cp310.cp312 poetry.lock.cp310.cp312 $ARGS
111+
;;
81112

82-
brainframe-cli-2404-lint)
83-
echo │ ./deployment/do brainframe-cli-2404-lint
84-
docker run -it --rm -v ./:/brainframe-cli -w /deployment brainframe-cli-env:2404 bash -c "cp /deployment/* /brainframe-cli/ && poetry run black /brainframe-cli/ && poetry run isort /brainframe-cli/"
85-
;;
113+
20.04)
114+
build_brainframe_cli_env Dockerfile.env pyproject.toml.cp38 poetry.lock.cp38 $ARGS
115+
;;
86116

87-
brainframe-cli-2404-build)
88-
echo │ ./deployment/do brainframe-cli-2404-build
89-
docker run -it --rm -v ./:/brainframe-cli -w /brainframe-cli brainframe-cli-env:2404 bash -c "cp /deployment/* /brainframe-cli/ && poetry lock --no-update && poetry build -f wheel"
117+
18.04)
118+
build_brainframe_cli_env Dockerfile.env pyproject.toml.cp38 poetry.lock.cp38 $ARGS
119+
;;
120+
esac
90121
;;
91122

92-
brainframe-cli-2204-env-build)
93-
echo ./deployment/do brainframe-cli-2204-env-build # --no-cache
94-
DOCKER_BUILDKIT=1 docker build --file deployment/Dockerfile.env --build-arg WORKDIR=/deployment --build-arg UBUNTU_VERSION=22.04 --build-arg PYPROJECT=pyproject.toml.py310.py312 --build-arg POETRYLOCK=poetry.lock.py310.py312 $ARGS --tag brainframe-cli-env:2204 .
123+
brainframe-cli-env-run)
124+
echo ./deployment/do brainframe-cli-env-run 20.04
125+
run_docker /brainframe-cli /deployment brainframe-cli-env $ARGS
95126
;;
96127

97-
brainframe-cli-2204-env-run)
98-
echo │ ./deployment/do brainframe-cli-2204-env-run
99-
docker run -it --rm -v ./:/brainframe-cli -w /deployment brainframe-cli-env:2204 bash
128+
brainframe-cli-lint)
129+
echo │ ./deployment/do brainframe-cli-lint 20.04
130+
run_docker /brainframe-cli /deployment brainframe-cli-env $ARG bash -c "cp /deployment/* /brainframe-cli/ && poetry run black /brainframe-cli/ && poetry run isort /brainframe-cli/"
100131
;;
101132

102-
brainframe-cli-2204-lint)
103-
echo │ ./deployment/do brainframe-cli-2204-lint
104-
docker run -it --rm -v ./:/brainframe-cli -w /deployment brainframe-cli-env:2204 bash -c "cp /deployment/* /brainframe-cli/ && poetry run black /brainframe-cli/ && poetry run isort /brainframe-cli/"
105-
;;
106-
107-
brainframe-cli-2204-build)
108-
echo │ ./deployment/do brainframe-cli-2204-build
109-
docker run -it --rm -v ./:/brainframe-cli -w /brainframe-cli brainframe-cli-env:2204 bash -c "cp /deployment/* /brainframe-cli/ && poetry lock --no-update && poetry build -f wheel"
110-
;;
111-
112-
brainframe-cli-2004-env-build)
113-
echo ├ ./deployment/do brainframe-cli-2004-env-build # --no-cache
114-
DOCKER_BUILDKIT=1 docker build --file deployment/Dockerfile.env --build-arg WORKDIR=/deployment --build-arg UBUNTU_VERSION=20.04 --build-arg PYPROJECT=pyproject.toml --build-arg POETRYLOCK=poetry.lock $ARGS --tag brainframe-cli-env:2004 .
115-
;;
116-
117-
brainframe-cli-2004-env-run)
118-
echo │ ./deployment/do brainframe-cli-2004-env-run
119-
docker run -it --rm -v ./:/brainframe-cli -w /deployment brainframe-cli-env:2004 bash
120-
;;
133+
brainframe-cli-build)
134+
echo │ ./deployment/do brainframe-cli-build 20.04
135+
case $ARG in
136+
24.04)
137+
PYTHON_TAG="3.10 3.12"
138+
;;
121139

122-
brainframe-cli-2004-lint)
123-
echo │ ./deployment/do brainframe-cli-2004-lint
124-
docker run -it --rm -v ./:/brainframe-cli -w /deployment brainframe-cli-env:2004 bash -c "cp /deployment/* /brainframe-cli/ && poetry run black /brainframe-cli && poetry run isort /brainframe-cli"
125-
;;
140+
22.04)
141+
PYTHON_TAG="3.10 3.12"
142+
;;
126143

127-
brainframe-cli-2004-build)
128-
echo │ ./deployment/do brainframe-cli-2004-build
129-
docker run -it --rm -v ./:/brainframe-cli -w /brainframe-cli brainframe-cli-env:2004 bash -c "cp /deployment/* /brainframe-cli/ && poetry lock --no-update && poetry build -f wheel"
130-
;;
131-
132-
brainframe-cli-1804-env-build)
133-
echo ├ ./deployment/do brainframe-cli-1804-env-build # --no-cache
134-
DOCKER_BUILDKIT=1 docker build --file deployment/Dockerfile.env --build-arg WORKDIR=/deployment --build-arg UBUNTU_VERSION=18.04 --build-arg PYPROJECT=pyproject.toml --build-arg POETRYLOCK=poetry.lock --build-arg POETRY_VERSION=1.1.14 $ARGS --tag brainframe-cli-env:1804 .
135-
;;
136-
137-
brainframe-cli-1804-env-run)
138-
echo │ ./deployment/do brainframe-cli-1804-env-run
139-
docker run -it --rm -v ./:/brainframe-cli -w /deployment brainframe-cli-env:1804 bash
140-
;;
141-
142-
brainframe-cli-1804-lint)
143-
echo │ ./deployment/do brainframe-cli-1804-lint
144-
docker run -it --rm -v ./:/brainframe-cli -w /deployment brainframe-cli-env:1804 bash -c "cp /deployment/* /brainframe-cli/ && poetry run black /brainframe-cli && poetry run isort /brainframe-cli"
145-
;;
144+
20.04)
145+
PYTHON_TAG=3.8
146+
;;
146147

147-
brainframe-cli-1804-build)
148-
echo │ ./deployment/do brainframe-cli-1804-build
149-
docker run -it --rm -v ./:/brainframe-cli -w /brainframe-cli brainframe-cli-env:1804 bash -c "cp /deployment/* /brainframe-cli/ && poetry lock --no-update && poetry build -f wheel"
148+
18.04)
149+
PYTHON_TAG=
150+
;;
151+
esac
152+
run_docker /brainframe-cli /brainframe-cli brainframe-cli-env $ARG bash -c "cp /deployment/* /brainframe-cli/ && python3 deployment/build.py --versions $PYTHON_TAG"
150153
;;
151154

152155
comments_only)

0 commit comments

Comments
 (0)