Skip to content

Commit ef31963

Browse files
committed
maturin builds
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
1 parent c7e2da0 commit ef31963

39 files changed

+14261
-5524
lines changed

.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ charts
44
env
55
**/.terraform
66
offline_build/
7+
!offline_build/arrow
8+
!offline_build/ibis

Makefile

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,27 +85,25 @@ lock-python-dependencies-all:
8585
# Remove all existing requirements because we noticed the lock file is not always updated correctly.
8686
# Removing and running the command again ensures that the lock file is always up to date.
8787
rm -rf sdk/python/requirements/* 2>/dev/null || true
88-
pixi run --environment $(call get_env_name,3.11) --manifest-path infra/scripts/pixi/pixi.toml \
89-
"uv pip compile -p 3.11 --no-strip-extras setup.py --extra addtl-sources \
90-
--generate-hashes --output-file sdk/python/requirements/py3.11-addtl-sources-requirements.txt"
91-
pixi run --environment $(call get_env_name,3.11) --manifest-path infra/scripts/pixi/pixi.toml \
92-
"uv pip compile -p 3.11 --no-strip-extras setup.py --extra pandas-build \
93-
--generate-hashes --output-file sdk/python/requirements/py3.11-pandas-requirements.txt"
94-
pixi run --environment $(call get_env_name,3.11) --manifest-path infra/scripts/pixi/pixi.toml \
95-
"uv pip compile -p 3.11 --no-strip-extras setup.py --extra minimal-sdist-build \
96-
--no-emit-package milvus-lite \
97-
--no-emit-package psycopg-binary \
98-
--output-file sdk/python/requirements/py3.11-sdist-requirements.txt"
9988
$(foreach ver,$(PYTHON_VERSIONS),\
100-
pixi run --environment $(call get_env_name,$(ver)) --manifest-path infra/scripts/pixi/pixi.toml \
101-
"uv pip compile -p $(ver) --no-strip-extras setup.py --extra minimal \
102-
--generate-hashes --output-file sdk/python/requirements/py$(ver)-minimal-requirements.txt" && \
10389
pixi run --environment $(call get_env_name,$(ver)) --manifest-path infra/scripts/pixi/pixi.toml \
10490
"uv pip compile -p $(ver) --no-strip-extras setup.py --extra ci \
10591
--generate-hashes --output-file sdk/python/requirements/py$(ver)-ci-requirements.txt" && \
10692
pixi run --environment $(call get_env_name,$(ver)) --manifest-path infra/scripts/pixi/pixi.toml \
10793
"uv pip compile -p $(ver) --no-strip-extras setup.py \
10894
--generate-hashes --output-file sdk/python/requirements/py$(ver)-requirements.txt" && \
95+
pixi run --environment $(call get_env_name,$(ver)) --manifest-path infra/scripts/pixi/pixi.toml \
96+
"uv pip compile -p $(ver) --no-strip-extras setup.py --extra minimal \
97+
--generate-hashes --output-file sdk/python/requirements/py$(ver)-minimal-requirements.txt" && \
98+
pixi run --environment $(call get_env_name,$(ver)) --manifest-path infra/scripts/pixi/pixi.toml \
99+
"uv pip compile -p $(ver) --no-strip-extras setup.py --extra minimal-sdist-build \
100+
--no-emit-package milvus-lite \
101+
--generate-hashes --output-file sdk/python/requirements/py$(ver)-minimal-sdist-requirements.txt" && \
102+
pixi run --environment $(call get_env_name,$(ver)) --manifest-path infra/scripts/pixi/pixi.toml \
103+
"uv pip install -p $(ver) pybuild-deps==0.5.0 && \
104+
pybuild-deps compile --generate-hashes \
105+
-o sdk/python/requirements/py$(ver)-minimal-sdist-requirements-build.txt \
106+
sdk/python/requirements/py$(ver)-minimal-sdist-requirements.txt" && \
109107
) true
110108

111109
compile-protos-python:

infra/scripts/offline-binary-build.sh

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,34 @@ cd ${PROJECT_ROOT_DIR}
99
rm -rf ./offline_build
1010
mkdir offline_build
1111

12-
alias cachi2='docker run --rm -ti -v "$PWD:$PWD:z" -w "$PWD" quay.io/konflux-ci/cachi2:f7a61b067f4446e4982d0e3b9545ce4aa0d8284f'
13-
cachi2 fetch-deps \
14-
--output ${OFFLINE_BUILD_DIR}/cachi2-output \
12+
alias hermeto='docker run --rm -ti -v "$PWD:$PWD:Z" -w "$PWD" quay.io/konflux-ci/hermeto:0.24.0'
13+
# not needed for downstream build from release
14+
###############################
15+
# yarn builder
16+
docker build \
17+
--tag yarn-builder \
18+
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.builder.yarn \
19+
sdk/python/feast/infra/feature_servers/multicloud/offline
20+
21+
hermeto fetch-deps \
22+
--output ${OFFLINE_BUILD_DIR}/hermeto-yarn-ui-output \
23+
'{
24+
"type": "yarn",
25+
"path": "ui"
26+
}'
27+
hermeto generate-env -o ${OFFLINE_BUILD_DIR}/hermeto-yarn-ui.env --for-output-dir /tmp/hermeto-yarn-ui-output ${OFFLINE_BUILD_DIR}/hermeto-yarn-ui-output
28+
29+
hermeto fetch-deps \
30+
--output ${OFFLINE_BUILD_DIR}/hermeto-yarn-output \
31+
'{
32+
"type": "yarn",
33+
"path": "sdk/python/feast/ui"
34+
}'
35+
hermeto generate-env -o ${OFFLINE_BUILD_DIR}/hermeto-yarn.env --for-output-dir /tmp/hermeto-yarn-output ${OFFLINE_BUILD_DIR}/hermeto-yarn-output
36+
###############################
37+
38+
hermeto fetch-deps \
39+
--output ${OFFLINE_BUILD_DIR}/hermeto-output \
1540
'{
1641
"type": "pip",
1742
"path": ".",
@@ -20,20 +45,24 @@ cachi2 fetch-deps \
2045
],
2146
"requirements_build_files": [
2247
"sdk/python/requirements/py3.11-minimal-requirements.txt",
23-
"sdk/python/requirements/py3.11-sdist-requirements.txt"
48+
"sdk/python/requirements/py3.11-minimal-sdist-requirements.txt",
49+
"sdk/python/requirements/py3.11-minimal-sdist-requirements-build.txt"
2450
],
2551
"allow_binary": "true"
2652
}'
27-
28-
cachi2 generate-env ${OFFLINE_BUILD_DIR}/cachi2-output -o ${OFFLINE_BUILD_DIR}/cachi2.env --for-output-dir /tmp/cachi2-output
53+
hermeto generate-env -o ${OFFLINE_BUILD_DIR}/hermeto.env --for-output-dir /tmp/hermeto-output ${OFFLINE_BUILD_DIR}/hermeto-output
2954

3055
# feast OFFLINE builder
3156
docker build \
32-
--volume ${OFFLINE_BUILD_DIR}/cachi2-output:/tmp/cachi2-output:Z \
33-
--volume ${OFFLINE_BUILD_DIR}/cachi2.env:/tmp/cachi2.env:Z \
57+
--volume ${OFFLINE_BUILD_DIR}/hermeto-yarn-ui-output:/tmp/hermeto-yarn-ui-output:Z \
58+
--volume ${OFFLINE_BUILD_DIR}/hermeto-yarn-ui.env:/tmp/hermeto-yarn-ui.env:Z \
59+
--volume ${OFFLINE_BUILD_DIR}/hermeto-yarn-output:/tmp/hermeto-yarn-output:Z \
60+
--volume ${OFFLINE_BUILD_DIR}/hermeto-yarn.env:/tmp/hermeto-yarn.env:Z \
61+
--volume ${OFFLINE_BUILD_DIR}/hermeto-output:/tmp/hermeto-output:Z \
62+
--volume ${OFFLINE_BUILD_DIR}/hermeto.env:/tmp/hermeto.env:Z \
3463
--network none \
3564
--tag feature-server:binary-build \
3665
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.binary \
37-
--load sdk/python/feast/infra/feature_servers/multicloud
66+
${PROJECT_ROOT_DIR}
3867

3968
docker run --rm -ti feature-server:binary-build feast version
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# to run -> source ./infra/scripts/offline-binary-release-build.sh
2+
# on the build host... requires docker/podman
3+
4+
# Get Feast project repository root directory
5+
PROJECT_ROOT_DIR=$(git rev-parse --show-toplevel)
6+
OFFLINE_BUILD_DIR=${PROJECT_ROOT_DIR}/offline_build
7+
cd ${PROJECT_ROOT_DIR}
8+
9+
rm -rf ./offline_build
10+
mkdir offline_build
11+
12+
# yarn builder
13+
docker build \
14+
--build-arg RELEASE=true \
15+
--tag yarn-builder \
16+
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.builder.yarn \
17+
sdk/python/feast/infra/feature_servers/multicloud/offline
18+
19+
alias hermeto='docker run --rm -ti -v "$PWD:$PWD:Z" -w "$PWD" quay.io/konflux-ci/hermeto:0.24.0'
20+
hermeto fetch-deps \
21+
--output ${OFFLINE_BUILD_DIR}/hermeto-output \
22+
'{
23+
"type": "pip",
24+
"path": ".",
25+
"requirements_files": [
26+
"sdk/python/feast/infra/feature_servers/multicloud/requirements.txt"
27+
],
28+
"requirements_build_files": [
29+
"sdk/python/requirements/py3.11-minimal-requirements.txt",
30+
"sdk/python/requirements/py3.11-minimal-sdist-requirements.txt",
31+
"sdk/python/requirements/py3.11-minimal-sdist-requirements-build.txt"
32+
],
33+
"allow_binary": "true"
34+
}'
35+
hermeto generate-env -o ${OFFLINE_BUILD_DIR}/hermeto.env --for-output-dir /tmp/hermeto-output ${OFFLINE_BUILD_DIR}/hermeto-output
36+
37+
# feast OFFLINE builder
38+
docker build \
39+
--volume ${OFFLINE_BUILD_DIR}/hermeto-output:/tmp/hermeto-output:Z \
40+
--volume ${OFFLINE_BUILD_DIR}/hermeto.env:/tmp/hermeto.env:Z \
41+
--network none \
42+
--tag feature-server:binary-release-build \
43+
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.binary.release \
44+
sdk/python/feast/infra/feature_servers/multicloud
45+
46+
docker run --rm -ti feature-server:binary-release-build feast version

infra/scripts/offline-build.sh

Lines changed: 45 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
APACHE_ARROW_VERSION="17.0.0"
55
SUBSTRAIT_VERSION="0.44.0"
6+
IBIS_VERSION="9.5.0"
67

78
# Get Feast project repository root directory
89
PROJECT_ROOT_DIR=$(git rev-parse --show-toplevel)
@@ -16,81 +17,81 @@ mkdir offline_build
1617
docker build \
1718
--tag yum-builder \
1819
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.builder.yum \
19-
--load sdk/python/feast/infra/feature_servers/multicloud/offline
20+
sdk/python/feast/infra/feature_servers/multicloud/offline
2021

2122
git clone --branch apache-arrow-${APACHE_ARROW_VERSION} https://github.com/apache/arrow ${OFFLINE_BUILD_DIR}/arrow
2223
${OFFLINE_BUILD_DIR}/arrow/cpp/thirdparty/download_dependencies.sh ${OFFLINE_BUILD_DIR}/arrow/cpp/arrow-thirdparty
2324
wget https://github.com/substrait-io/substrait/archive/v${SUBSTRAIT_VERSION}.tar.gz -O ${OFFLINE_BUILD_DIR}/arrow/cpp/arrow-thirdparty/substrait-${SUBSTRAIT_VERSION}.tar.gz
2425

25-
alias cachi2='docker run --rm -ti -v "$PWD:$PWD:z" -w "$PWD" quay.io/konflux-ci/cachi2:f7a61b067f4446e4982d0e3b9545ce4aa0d8284f'
26-
cachi2 fetch-deps \
27-
--output ${OFFLINE_BUILD_DIR}/cachi2-output \
26+
alias hermeto='docker run --rm -ti -v "$PWD:$PWD:Z" -w "$PWD" quay.io/konflux-ci/hermeto:0.24.0'
27+
# not needed for downstream build from release
28+
###############################
29+
hermeto fetch-deps \
30+
--output ${OFFLINE_BUILD_DIR}/hermeto-yarn-ui-output \
31+
'{
32+
"type": "yarn",
33+
"path": "ui"
34+
}'
35+
hermeto generate-env -o ${OFFLINE_BUILD_DIR}/hermeto-yarn-ui.env --for-output-dir /tmp/hermeto-yarn-ui-output ${OFFLINE_BUILD_DIR}/hermeto-yarn-ui-output
36+
37+
hermeto fetch-deps \
38+
--output ${OFFLINE_BUILD_DIR}/hermeto-yarn-output \
39+
'{
40+
"type": "yarn",
41+
"path": "sdk/python/feast/ui"
42+
}'
43+
hermeto generate-env -o ${OFFLINE_BUILD_DIR}/hermeto-yarn.env --for-output-dir /tmp/hermeto-yarn-output ${OFFLINE_BUILD_DIR}/hermeto-yarn-output
44+
###############################
45+
46+
hermeto fetch-deps \
47+
--output ${OFFLINE_BUILD_DIR}/hermeto-output \
2848
'{
2949
"type": "pip",
3050
"path": ".",
3151
"requirements_files": [
3252
"sdk/python/feast/infra/feature_servers/multicloud/requirements.txt"
3353
],
3454
"requirements_build_files": [
35-
"sdk/python/feast/infra/feature_servers/multicloud/offline/pyarrow17-wheel-build-requirements.txt",
36-
"sdk/python/feast/infra/feature_servers/multicloud/offline/psycopg3.2.5-wheel-build-requirements.txt",
37-
"sdk/python/requirements/py3.11-sdist-requirements.txt",
38-
"sdk/python/requirements/py3.11-pandas-requirements.txt",
39-
"sdk/python/requirements/py3.11-addtl-sources-requirements.txt"
55+
"sdk/python/requirements/py3.11-minimal-sdist-requirements.txt",
56+
"sdk/python/requirements/py3.11-minimal-sdist-requirements-build.txt"
4057
],
4158
"allow_binary": "false"
4259
}'
43-
cachi2 generate-env ${OFFLINE_BUILD_DIR}/cachi2-output -o ${OFFLINE_BUILD_DIR}/cachi2.env --for-output-dir /tmp/cachi2-output
60+
hermeto generate-env -o ${OFFLINE_BUILD_DIR}/hermeto.env --for-output-dir /tmp/hermeto-output ${OFFLINE_BUILD_DIR}/hermeto-output
61+
hermeto inject-files --for-output-dir /tmp/hermeto-output ${OFFLINE_BUILD_DIR}/hermeto-output
4462

45-
# arrow OFFLINE builder - version 17.0.0
63+
# arrow OFFLINE builder
4664
rm -f ${OFFLINE_BUILD_DIR}/arrow/.dockerignore
4765
docker build \
48-
--volume ${OFFLINE_BUILD_DIR}/arrow:/tmp/arrow:Z \
49-
--volume ${OFFLINE_BUILD_DIR}/cachi2-output:/tmp/cachi2-output:Z \
50-
--volume ${OFFLINE_BUILD_DIR}/cachi2.env:/tmp/cachi2.env:Z \
51-
--volume ${PROJECT_ROOT_DIR}/sdk/python/feast/infra/feature_servers/multicloud/offline:/tmp/offline:ro \
5266
--network none \
67+
--volume ${OFFLINE_BUILD_DIR}/arrow:/tmp/arrow:Z \
68+
--volume ${OFFLINE_BUILD_DIR}/hermeto-output:/tmp/hermeto-output:Z \
69+
--volume ${OFFLINE_BUILD_DIR}/hermeto.env:/tmp/hermeto.env:Z \
5370
--tag arrow-builder \
5471
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.builder.arrow \
55-
--load offline_build/arrow
72+
${OFFLINE_BUILD_DIR}/arrow
5673

57-
# pip builder
74+
# ibis OFFLINE builder - ibis-framework must build from its own git repo... versioning requirement
75+
git clone -b ${IBIS_VERSION} https://github.com/ibis-project/ibis ${OFFLINE_BUILD_DIR}/ibis
5876
docker build \
59-
--tag pip-builder \
60-
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.builder.pip \
61-
--load sdk/python/feast/infra/feature_servers/multicloud/offline
62-
63-
# ibis OFFLINE builder
64-
docker build \
65-
--volume ${OFFLINE_BUILD_DIR}/cachi2-output:/tmp/cachi2-output:Z \
66-
--volume ${OFFLINE_BUILD_DIR}/cachi2.env:/tmp/cachi2.env:Z \
6777
--network none \
78+
--volume ${OFFLINE_BUILD_DIR}/hermeto-output:/tmp/hermeto-output:Z \
79+
--volume ${OFFLINE_BUILD_DIR}/hermeto.env:/tmp/hermeto.env:Z \
6880
--tag ibis-builder \
6981
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.builder.ibis \
70-
--load sdk/python/feast/infra/feature_servers/multicloud/offline
71-
72-
# is this needed? check for reqs logs as feast builds
73-
# maturin OFFLINE builder
74-
#mkdir -p ${OFFLINE_BUILD_DIR}/cachi2-maturin
75-
#git clone --branch v1.8.3 https://github.com/PyO3/maturin ${OFFLINE_BUILD_DIR}/maturin
76-
#cachi2 fetch-deps cargo --source ${OFFLINE_BUILD_DIR}/maturin --output ${OFFLINE_BUILD_DIR}/cachi2-maturin
77-
#cachi2 inject-files --for-output-dir /tmp/cachi2-maturin ${OFFLINE_BUILD_DIR}/cachi2-maturin
78-
#docker build \
79-
# --volume ${OFFLINE_BUILD_DIR}/cachi2-maturin:/tmp/cachi2-maturin:Z \
80-
# --volume ${OFFLINE_BUILD_DIR}/cachi2-output:/tmp/cachi2-output:Z \
81-
# --volume ${OFFLINE_BUILD_DIR}/cachi2.env:/tmp/cachi2.env:Z \
82-
# --network none \
83-
# --tag maturin-builder \
84-
# -f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.builder.maturin \
85-
# --load ${OFFLINE_BUILD_DIR}/maturin
82+
${OFFLINE_BUILD_DIR}
8683

8784
# feast OFFLINE builder
8885
docker build \
89-
--volume ${OFFLINE_BUILD_DIR}/cachi2-output:/tmp/cachi2-output:Z \
90-
--volume ${OFFLINE_BUILD_DIR}/cachi2.env:/tmp/cachi2.env:Z \
9186
--network none \
87+
--volume ${OFFLINE_BUILD_DIR}/hermeto-yarn-ui-output:/tmp/hermeto-yarn-ui-output:Z \
88+
--volume ${OFFLINE_BUILD_DIR}/hermeto-yarn-ui.env:/tmp/hermeto-yarn-ui.env:Z \
89+
--volume ${OFFLINE_BUILD_DIR}/hermeto-yarn-output:/tmp/hermeto-yarn-output:Z \
90+
--volume ${OFFLINE_BUILD_DIR}/hermeto-yarn.env:/tmp/hermeto-yarn.env:Z \
91+
--volume ${OFFLINE_BUILD_DIR}/hermeto-output:/tmp/hermeto-output:Z \
92+
--volume ${OFFLINE_BUILD_DIR}/hermeto.env:/tmp/hermeto.env:Z \
9293
--tag feature-server:sdist-build \
9394
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.sdist \
94-
--load sdk/python/feast/infra/feature_servers/multicloud
95+
${PROJECT_ROOT_DIR}
9596

9697
docker run --rm -ti feature-server:sdist-build feast version
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# to run -> source ./infra/scripts/offline-release-build.sh
2+
# on the build host... requires docker/podman, git, wget
3+
4+
APACHE_ARROW_VERSION="17.0.0"
5+
SUBSTRAIT_VERSION="0.44.0"
6+
IBIS_VERSION="9.5.0"
7+
8+
# Get Feast project repository root directory
9+
PROJECT_ROOT_DIR=$(git rev-parse --show-toplevel)
10+
OFFLINE_BUILD_DIR=${PROJECT_ROOT_DIR}/offline_build
11+
cd ${PROJECT_ROOT_DIR}
12+
13+
rm -rf ./offline_build
14+
mkdir offline_build
15+
16+
# yum builder
17+
docker build \
18+
--build-arg RELEASE=true \
19+
--tag yum-builder \
20+
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.builder.yum \
21+
sdk/python/feast/infra/feature_servers/multicloud/offline
22+
23+
git clone --branch apache-arrow-${APACHE_ARROW_VERSION} https://github.com/apache/arrow ${OFFLINE_BUILD_DIR}/arrow
24+
${OFFLINE_BUILD_DIR}/arrow/cpp/thirdparty/download_dependencies.sh ${OFFLINE_BUILD_DIR}/arrow/cpp/arrow-thirdparty
25+
wget https://github.com/substrait-io/substrait/archive/v${SUBSTRAIT_VERSION}.tar.gz -O ${OFFLINE_BUILD_DIR}/arrow/cpp/arrow-thirdparty/substrait-${SUBSTRAIT_VERSION}.tar.gz
26+
27+
alias hermeto='docker run --rm -ti -v "$PWD:$PWD:Z" -w "$PWD" quay.io/konflux-ci/hermeto:0.24.0'
28+
hermeto fetch-deps \
29+
--output ${OFFLINE_BUILD_DIR}/hermeto-output \
30+
'{
31+
"type": "pip",
32+
"path": ".",
33+
"requirements_files": [
34+
"sdk/python/feast/infra/feature_servers/multicloud/requirements.txt"
35+
],
36+
"requirements_build_files": [
37+
"sdk/python/requirements/py3.11-minimal-sdist-requirements.txt",
38+
"sdk/python/requirements/py3.11-minimal-sdist-requirements-build.txt"
39+
],
40+
"allow_binary": "false"
41+
}'
42+
hermeto generate-env -o ${OFFLINE_BUILD_DIR}/hermeto.env --for-output-dir /tmp/hermeto-output ${OFFLINE_BUILD_DIR}/hermeto-output
43+
hermeto inject-files --for-output-dir /tmp/hermeto-output ${OFFLINE_BUILD_DIR}/hermeto-output
44+
45+
# ibis OFFLINE builder - ibis-framework must build from its own git repo... versioning requirement
46+
git clone -b ${IBIS_VERSION} https://github.com/ibis-project/ibis ${OFFLINE_BUILD_DIR}/ibis
47+
48+
# feast OFFLINE builder
49+
docker build \
50+
--network none \
51+
--volume ${OFFLINE_BUILD_DIR}/arrow:/tmp/arrow:Z \
52+
--volume ${OFFLINE_BUILD_DIR}/hermeto-output:/tmp/hermeto-output:Z \
53+
--volume ${OFFLINE_BUILD_DIR}/hermeto.env:/tmp/hermeto.env:Z \
54+
--tag feature-server:sdist-release-build \
55+
-f sdk/python/feast/infra/feature_servers/multicloud/offline/Dockerfile.sdist.release \
56+
${PROJECT_ROOT_DIR}
57+
58+
docker run --rm -ti feature-server:sdist-release-build feast version

0 commit comments

Comments
 (0)