name: build wheels # Call this workflow from other workflows in the repository by specifying "uses: ./.github/workflows/build_wheels.yml" # Developers who are starting a new release should use this workflow to ensure wheels will be built correctly. # Devs should check out their fork, add a tag to the last master commit on their fork, and run the release off of their fork on the added tag to ensure wheels will be built correctly. on: workflow_dispatch: # Allows manual trigger of the workflow inputs: custom_version: # Optional input for a custom version description: 'Custom version to publish (e.g., v1.2.3) -- only edit if you know what you are doing' required: false type: string token: description: 'Personal Access Token' required: true default: "" type: string workflow_call: inputs: custom_version: # Optional input for a custom version description: 'Custom version to publish (e.g., v1.2.3) -- only edit if you know what you are doing' required: false type: string token: description: 'Personal Access Token' required: true default: "" type: string jobs: build-python-wheel: name: Build wheels runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: "3.11" architecture: x64 - name: Setup Node uses: actions/setup-node@v3 with: node-version-file: './ui/.nvmrc' registry-url: 'https://registry.npmjs.org' - name: Build UI run: make build-ui - id: get-version uses: ./.github/actions/get-semantic-release-version with: custom_version: ${{ github.event.inputs.custom_version }} token: ${{ github.event.inputs.token }} - name: Build wheels env: VERSION: ${{ steps.get-version.outputs.release_version }} PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | git fetch --tags git checkout ${VERSION} python -m pip install build python -m build --wheel --outdir wheelhouse/ - uses: actions/upload-artifact@v4 with: name: python-wheels path: ./wheelhouse/*.whl build-source-distribution: name: Build source distribution runs-on: macos-13 steps: - uses: actions/checkout@v4 - name: Setup Python id: setup-python uses: actions/setup-python@v5 with: python-version: "3.11" architecture: x64 - name: Setup Node uses: actions/setup-node@v3 with: node-version-file: './ui/.nvmrc' registry-url: 'https://registry.npmjs.org' - id: get-version uses: ./.github/actions/get-semantic-release-version with: custom_version: ${{ github.event.inputs.custom_version }} token: ${{ github.event.inputs.token }} - name: Build and install dependencies env: VERSION: ${{ steps.get-version.outputs.release_version }} # There's a `git restore` in here because `make install-go-ci-dependencies` is actually messing up go.mod & go.sum. run: | git fetch --tags git checkout ${VERSION} pip install -U pip setuptools wheel twine make build-ui git status git restore go.mod go.sum git restore sdk/python/feast/ui/yarn.lock - name: Build run: | python3 setup.py sdist - uses: actions/upload-artifact@v4 with: name: source-distribution path: dist/* # We add this step so the docker images can be built as part of the pre-release verification steps. build-docker-images: name: Build Docker images runs-on: ubuntu-latest needs: [ build-python-wheel, build-source-distribution ] strategy: matrix: component: [ feature-server-dev, feature-server-java, feature-transformation-server, feast-operator ] env: REGISTRY: feastdev steps: - uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - id: get-version uses: ./.github/actions/get-semantic-release-version with: custom_version: ${{ github.event.inputs.custom_version }} token: ${{ github.event.inputs.token }} - name: Build image env: VERSION_WITHOUT_PREFIX: ${{ steps.get-version.outputs.version_without_prefix }} RELEASE_VERSION: ${{ steps.get-version.outputs.release_version }} run: | echo "Building docker image for ${{ matrix.component }} with version $VERSION_WITHOUT_PREFIX and release version $RELEASE_VERSION" make build-${{ matrix.component }}-docker REGISTRY=${REGISTRY} VERSION=${VERSION_WITHOUT_PREFIX} verify-python-wheels: name: Verify Python wheels runs-on: ${{ matrix.os }} needs: [ build-python-wheel, build-source-distribution ] strategy: matrix: os: [ ubuntu-latest, macos-13 ] python-version: [ "3.9", "3.10", "3.11" ] from-source: [ True, False ] env: # this script is for testing servers # it starts server with timeout and checks whether process killed by timeout (started healthy) or died by itself TEST_SCRIPT: | timeout 10s $@ & pid=$! wait $pid ret=$? if [[ $ret -ne 124 ]] then exit $ret else echo "Succeeded!" fi steps: - uses: actions/checkout@v4 - name: Setup Python id: setup-python uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} architecture: x64 - uses: actions/download-artifact@v4.1.7 with: name: python-wheels path: dist - uses: actions/download-artifact@v4.1.7 with: name: source-distribution path: dist - name: Install OS X dependencies if: matrix.os == 'macos-13' run: brew install coreutils - name: Install wheel if: ${{ !matrix.from-source }} # try to install all wheels; only the current platform wheel should be actually installed run: | cd dist/ pip install wheel for f in *.whl; do pip install $f || true; done - name: Install sdist # try to install the sdist if: ${{ matrix.from-source }} run: pip install dist/*tar.gz # Validate that the feast version installed is not development and is the correct version of the tag we ran it off of. - id: get-version uses: ./.github/actions/get-semantic-release-version with: custom_version: ${{ github.event.inputs.custom_version }} token: ${{ github.event.inputs.token }} - name: Validate Feast Version env: VERSION_WITHOUT_PREFIX: ${{ steps.get-version.outputs.version_without_prefix }} run: | feast version if ! VERSION_OUTPUT=$(feast version); then echo "Error: Failed to get Feast version." exit 1 fi VERSION_REGEX='[0-9]+\.[0-9]+\.[0-9]+' OUTPUT_REGEX='^Feast SDK Version: "$VERSION_REGEX"$' VERSION=$(echo $VERSION_OUTPUT | grep -oE "$VERSION_REGEX") OUTPUT=$(echo $VERSION_OUTPUT | grep -E "$REGEX") echo "Installed Feast Version: $VERSION and using Feast Version: $VERSION_WITHOUT_PREFIX" if [ -n "$OUTPUT" ] && [ "$VERSION" = "$VERSION_WITHOUT_PREFIX" ]; then echo "Correct Feast Version Installed" else echo "$VERSION_OUTPUT from installed wheel is not in the correct format or doesn't have the right version $VERSION." exit 1 fi # This is temporarily disabled. # - name: Smoke test # run: | # feast init test_repo # cd test_repo/feature_repo # feast apply # echo "$TEST_SCRIPT" > run-and-wait.sh # bash run-and-wait.sh feast serve # bash run-and-wait.sh feast ui