diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 2f2d0d2f5e3..00000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: 'kind/bug, priority/p2' -assignees: '' - ---- - -## Expected Behavior - -## Current Behavior - -## Steps to reproduce - -### Specifications - -- Version: -- Platform: -- Subsystem: - -## Possible Solution diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index d73d6444812..00000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: 'kind/feature' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/TRIAGE_LIST.md b/.github/TRIAGE_LIST.md deleted file mode 100644 index b4e09934644..00000000000 --- a/.github/TRIAGE_LIST.md +++ /dev/null @@ -1 +0,0 @@ -@jyejare @ntkathole diff --git a/.github/actions/check-skip-tests/action.yml b/.github/actions/check-skip-tests/action.yml deleted file mode 100644 index 6c5f19fecc8..00000000000 --- a/.github/actions/check-skip-tests/action.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: Check if Tests should be Skipped -description: Determines if tests can be skipped based on changed files - -inputs: - head-sha: - description: 'The SHA of the head commit' - required: true - excluded-dirs: - description: 'Comma-separated list of directories to exclude' - required: false - default: 'docs/**,community/**,examples/**' - -outputs: - skip_tests: - description: 'Whether tests should be skipped' - value: ${{ steps.check_skip_tests.outputs.skip_tests }} - -runs: - using: composite - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - ref: ${{ inputs.head-sha }} - - - name: Fetch base branch - shell: bash - run: | - git fetch origin ${{ github.base_ref }}:$GITHUB_REF_BASE - env: - GITHUB_REF_BASE: refs/remotes/origin/${{ github.base_ref }} - - - name: Set excluded dirs - id: set_excluded_dirs - shell: bash - run: | - EXCLUDED_DIRS="${{ inputs.excluded-dirs }}" - IFS=',' read -r -a EXCLUDED_DIRS_ARRAY <<< "$EXCLUDED_DIRS" - echo "Excluded directories: ${EXCLUDED_DIRS_ARRAY[@]}" - echo "EXCLUDED_DIRS_ARRAY=${EXCLUDED_DIRS_ARRAY[@]}" >> $GITHUB_ENV - - - name: Check for excluded directory changes - id: check_skip_tests - shell: bash - run: | - CHANGED_FILES=$(git diff --name-only $GITHUB_REF_BASE ${{ inputs.head-sha }}) - echo "Changed files:" - echo "$CHANGED_FILES" - - # Build a regex pattern from the excluded directories - EXCLUDE_PATTERN=$(IFS='|'; echo "${EXCLUDED_DIRS_ARRAY[*]}") - NON_EXCLUDED_CHANGED=$(echo "$CHANGED_FILES" | grep -Ev "^($EXCLUDE_PATTERN)" || true) - - if [[ -z "$NON_EXCLUDED_CHANGED" ]]; then - echo "skip_tests=true" >> $GITHUB_ENV - echo "skip_tests=true" >> $GITHUB_OUTPUT - else - echo "skip_tests=false" >> $GITHUB_ENV - echo "skip_tests=false" >> $GITHUB_OUTPUT - fi \ No newline at end of file diff --git a/.github/actions/get-semantic-release-version/action.yml b/.github/actions/get-semantic-release-version/action.yml deleted file mode 100644 index a53bc337b44..00000000000 --- a/.github/actions/get-semantic-release-version/action.yml +++ /dev/null @@ -1,87 +0,0 @@ -name: Get semantic release version -description: "" -inputs: - custom_version: # Optional input for a custom version - description: "Custom version to publish (e.g., v1.2.3 or v1.2.3.dev4) -- only edit if you know what you are doing" - required: false - token: - description: "Personal Access Token" - required: true - default: "" -outputs: - release_version: - description: "The release version to use (e.g., v1.2.3 or v1.2.3.dev4)" - value: ${{ steps.get_release_version.outputs.release_version }} - version_without_prefix: - description: "The release version to use without 'v' (e.g., 1.2.3 or 1.2.3.dev4)" - value: ${{ steps.get_release_version_without_prefix.outputs.version_without_prefix }} - highest_semver_tag: - description: "The highest semantic version tag without the 'v' prefix (e.g., 1.2.3)" - value: ${{ steps.get_highest_semver.outputs.highest_semver_tag }} -runs: - using: composite - steps: - - name: Get release version - id: get_release_version - shell: bash - env: - GITHUB_TOKEN: ${{ inputs.token }} - GIT_AUTHOR_NAME: feast-ci-bot - GIT_AUTHOR_EMAIL: feast-ci-bot@willem.co - GIT_COMMITTER_NAME: feast-ci-bot - GIT_COMMITTER_EMAIL: feast-ci-bot@willem.co - run: | - if [[ -n "${{ inputs.custom_version }}" ]]; then - VERSION_REGEX="^v[0-9]+\.[0-9]+\.[0-9]+(\.dev[0-9]+)?$" - echo "Using custom version: ${{ inputs.custom_version }}" - if [[ ! "${{ inputs.custom_version }}" =~ $VERSION_REGEX ]]; then - echo "Error: custom_version must match semantic versioning (e.g., v1.2.3 or v1.2.3.dev4)." - exit 1 - fi - echo "::set-output name=release_version::${{ inputs.custom_version }}" - elif [[ "${GITHUB_REF}" == refs/tags/* ]]; then - echo "Using tag reference: ${GITHUB_REF#refs/tags/}" - echo "::set-output name=release_version::${GITHUB_REF#refs/tags/}" - else - echo "Defaulting to branch name: ${GITHUB_REF#refs/heads/}" - echo "::set-output name=release_version::${GITHUB_REF#refs/heads/}" - fi - - name: Get release version without prefix - id: get_release_version_without_prefix - shell: bash - env: - RELEASE_VERSION: ${{ steps.get_release_version.outputs.release_version }} - run: | - if [[ "${RELEASE_VERSION}" == v* ]]; then - echo "::set-output name=version_without_prefix::${RELEASE_VERSION:1}" - else - echo "::set-output name=version_without_prefix::${RELEASE_VERSION}" - fi - - name: Get highest semver - id: get_highest_semver - shell: bash - env: - RELEASE_VERSION: ${{ steps.get_release_version.outputs.release_version }} - run: | - if [[ -n "${{ inputs.custom_version }}" ]]; then - HIGHEST_SEMVER_TAG="${{ inputs.custom_version }}" - echo "::set-output name=highest_semver_tag::$HIGHEST_SEMVER_TAG" - echo "Using custom version as highest semantic version: $HIGHEST_SEMVER_TAG" - else - source infra/scripts/setup-common-functions.sh - SEMVER_REGEX='^v[0-9]+\.[0-9]+\.[0-9]+(-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?$' - if echo "${RELEASE_VERSION}" | grep -P "$SEMVER_REGEX" &>/dev/null ; then - echo ::set-output name=highest_semver_tag::$(get_tag_release -m) - echo "Using infra/scripts/setup-common-functions.sh to generate highest semantic version: $HIGHEST_SEMVER_TAG" - fi - fi - - name: Check output - shell: bash - env: - RELEASE_VERSION: ${{ steps.get_release_version.outputs.release_version }} - VERSION_WITHOUT_PREFIX: ${{ steps.get_release_version_without_prefix.outputs.version_without_prefix }} - HIGHEST_SEMVER_TAG: ${{ steps.get_highest_semver.outputs.highest_semver_tag }} - run: | - echo $RELEASE_VERSION - echo $VERSION_WITHOUT_PREFIX - echo $HIGHEST_SEMVER_TAG diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml deleted file mode 100644 index 2a6cff517c4..00000000000 --- a/.github/auto_assign.yml +++ /dev/null @@ -1,18 +0,0 @@ -# Set to true to add reviewers to pull requests -addReviewers: false - -# Set to true to add assignees to pull requests -addAssignees: true - -# A list of assignees, overrides reviewers if set -assignees: - - woop - - tsotnet - - achals - - felixwang9817 - -# A number of assignees to add to the pull request -# Set to 0 to add all of the assignees. -# Uses numberOfReviewers if unset. -numberOfAssignees: 1 - diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..9b750b413e0 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "pip" + directory: "/" + pull-request-branch-name: + # Separate sections of the branch name with a hyphen + # for example, `dependabot-npm_and_yarn-next_js-acorn-6.4.1` + separator: "-" + schedule: + interval: "daily" \ No newline at end of file diff --git a/.github/fork_workflows/fork_pr_integration_tests_aws.yml b/.github/fork_workflows/fork_pr_integration_tests_aws.yml deleted file mode 100644 index 6722e225b91..00000000000 --- a/.github/fork_workflows/fork_pr_integration_tests_aws.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: fork-pr-integration-tests-aws - -on: [pull_request] - -jobs: - integration-test-python: - if: github.repository == 'your github repo' # swap here with your project id - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - python-version: [ "3.11" ] - os: [ ubuntu-latest ] - env: - OS: ${{ matrix.os }} - PYTHON: ${{ matrix.python-version }} - services: - redis: - image: redis - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - steps: - - uses: actions/checkout@v4 - with: - # pull_request_target runs the workflow in the context of the base repo - # as such actions/checkout needs to be explicit configured to retrieve - # code from the PR. - ref: refs/pull/${{ github.event.pull_request.number }}/merge - submodules: recursive - - name: Setup Python - uses: actions/setup-python@v5 - id: setup-python - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - name: Setup Go - id: setup-go - uses: actions/setup-go@v5 - with: - go-version: 1.18.0 - - name: Set up AWS SDK - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - name: Use AWS CLI - run: aws sts get-caller-identity - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install apache-arrow on ubuntu - if: matrix.os == 'ubuntu-latest' - run: | - sudo apt update - sudo apt install -y -V ca-certificates lsb-release wget - wget https://apache.jfrog.io/artifactory/arrow/$(lsb_release --id --short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb - sudo apt install -y -V ./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb - sudo apt update - sudo apt install -y -V libarrow-dev - - name: Install dependencies - run: make install-python-dependencies-ci - - name: Setup Redis Cluster - run: | - docker pull vishnunair/docker-redis-cluster:latest - docker run -d -p 6001:6379 -p 6002:6380 -p 6003:6381 -p 6004:6382 -p 6005:6383 -p 6006:6384 --name redis-cluster vishnunair/docker-redis-cluster - - name: Test python - if: ${{ always() }} # this will guarantee that step won't be canceled and resources won't leak - run: | - pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread -k "aws and not Snowflake and not BigQuery and not minio_registry" - pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread -k "File and not Snowflake and not BigQuery and not minio_registry" - pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread -k "dynamo and not Snowflake and not BigQuery and not minio_registry" - pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread -k "Redshift and not Snowflake and not BigQuery and not minio_registry" - - name: Minimize uv cache - run: uv cache prune --ci diff --git a/.github/fork_workflows/fork_pr_integration_tests_gcp.yml b/.github/fork_workflows/fork_pr_integration_tests_gcp.yml deleted file mode 100644 index c6810e1dac2..00000000000 --- a/.github/fork_workflows/fork_pr_integration_tests_gcp.yml +++ /dev/null @@ -1,82 +0,0 @@ -name: fork-pr-integration-tests-gcp - -on: [pull_request] - -jobs: - integration-test-python: - if: github.repository == 'your github repo' # swap here with your project id - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - python-version: [ "3.11" ] - os: [ ubuntu-latest ] - env: - OS: ${{ matrix.os }} - PYTHON: ${{ matrix.python-version }} - services: - redis: - image: redis - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - steps: - - uses: actions/checkout@v4 - with: - # pull_request_target runs the workflow in the context of the base repo - # as such actions/checkout needs to be explicit configured to retrieve - # code from the PR. - ref: refs/pull/${{ github.event.pull_request.number }}/merge - submodules: recursive - - name: Setup Python - uses: actions/setup-python@v5 - id: setup-python - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - name: Setup Go - id: setup-go - uses: actions/setup-go@v5 - with: - go-version: 1.18.0 - - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_SA_KEY }}' - - name: Set up gcloud SDK - uses: google-github-actions/setup-gcloud@v2 - with: - project_id: ${{ secrets.GCP_PROJECT_ID }} - - name: Use gcloud CLI - run: gcloud info - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install apache-arrow on ubuntu - if: matrix.os == 'ubuntu-latest' - run: | - sudo apt update - sudo apt install -y -V ca-certificates lsb-release wget - wget https://apache.jfrog.io/artifactory/arrow/$(lsb_release --id --short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb - sudo apt install -y -V ./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb - sudo apt update - sudo apt install -y -V libarrow-dev - - name: Install dependencies - run: make install-python-dependencies-ci - - name: Setup Redis Cluster - run: | - docker pull vishnunair/docker-redis-cluster:latest - docker run -d -p 6001:6379 -p 6002:6380 -p 6003:6381 -p 6004:6382 -p 6005:6383 -p 6006:6384 --name redis-cluster vishnunair/docker-redis-cluster - - name: Test python - if: ${{ always() }} # this will guarantee that step won't be canceled and resources won't leak - # Run only BigQuery and File tests without dynamo and redshift tests. - run: | - pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread -k "BigQuery and not dynamo and not Redshift and not Snowflake and not minio_registry" - pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread -k "File and not dynamo and not Redshift and not Snowflake and not minio_registry" - - name: Minimize uv cache - run: uv cache prune --ci diff --git a/.github/fork_workflows/fork_pr_integration_tests_snowflake.yml b/.github/fork_workflows/fork_pr_integration_tests_snowflake.yml deleted file mode 100644 index 0db580ce7db..00000000000 --- a/.github/fork_workflows/fork_pr_integration_tests_snowflake.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: fork-pr-integration-tests-snowflake - -on: [pull_request] - -jobs: - integration-test-python: - if: github.repository == 'your github repo' # swap here with your project id - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - python-version: [ "3.11" ] - os: [ ubuntu-latest ] - env: - OS: ${{ matrix.os }} - PYTHON: ${{ matrix.python-version }} - services: - redis: - image: redis - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - steps: - - uses: actions/checkout@v4 - with: - # pull_request_target runs the workflow in the context of the base repo - # as such actions/checkout needs to be explicit configured to retrieve - # code from the PR. - ref: refs/pull/${{ github.event.pull_request.number }}/merge - submodules: recursive - - name: Setup Python - uses: actions/setup-python@v5 - id: setup-python - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - name: Setup Go - id: setup-go - uses: actions/setup-go@v5 - with: - go-version: 1.18.0 - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install apache-arrow on ubuntu - if: matrix.os == 'ubuntu-latest' - run: | - sudo apt update - sudo apt install -y -V ca-certificates lsb-release wget - wget https://apache.jfrog.io/artifactory/arrow/$(lsb_release --id --short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb - sudo apt install -y -V ./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb - sudo apt update - sudo apt install -y -V libarrow-dev - - name: Install dependencies - run: make install-python-dependencies-ci - - name: Setup Redis Cluster - run: | - docker pull vishnunair/docker-redis-cluster:latest - docker run -d -p 6001:6379 -p 6002:6380 -p 6003:6381 -p 6004:6382 -p 6005:6383 -p 6006:6384 --name redis-cluster vishnunair/docker-redis-cluster - - name: Test python - if: ${{ always() }} # this will guarantee that step won't be canceled and resources won't leak - env: - SNOWFLAKE_CI_DEPLOYMENT: ${{ secrets.SNOWFLAKE_CI_DEPLOYMENT }} - SNOWFLAKE_CI_USER: ${{ secrets.SNOWFLAKE_CI_USER }} - SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }} - SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }} - SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }} - # Run only Snowflake BigQuery and File tests without dynamo and redshift tests. - run: | - pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread -k "(Snowflake or snowflake_registry) and not dynamo and not Redshift and not Bigquery and not gcp and not minio_registry" - pytest -n 8 --cov=./ --cov-report=xml --color=yes sdk/python/tests --integration --durations=5 --timeout=1200 --timeout_method=thread -k "File and not dynamo and not Redshift and not Bigquery and not gcp and not minio_registry" - - name: Minimize uv cache - run: uv cache prune --ci diff --git a/.github/issue_label_bot.yaml b/.github/issue_label_bot.yaml deleted file mode 100644 index de9464b29de..00000000000 --- a/.github/issue_label_bot.yaml +++ /dev/null @@ -1,5 +0,0 @@ -label-alias: - bug: 'kind/bug' - feature_request: 'kind/feature' - feature: 'kind/feature' - question: 'kind/question' diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 48bb592ed84..00000000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,37 +0,0 @@ - - -# What this PR does / why we need it: - - -# Which issue(s) this PR fixes: - - -# Checks -- [ ] I've made sure the tests are passing. -- [ ] My commits are signed off (`git commit -s`) -- [ ] My PR title follows [conventional commits](https://www.conventionalcommits.org/) format - -## Testing Strategy -- [ ] Unit tests -- [ ] Integration tests -- [ ] Manual tests -- [ ] Testing is not required for this change - -# Misc - diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index aa5cf512c2f..00000000000 --- a/.github/stale.yml +++ /dev/null @@ -1,18 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 120 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - pinned - - security - - keep-open -# Label to use when marking an issue as stale -staleLabel: wontfix -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml deleted file mode 100644 index c69b5d8e699..00000000000 --- a/.github/workflows/build_wheels.yml +++ /dev/null @@ -1,218 +0,0 @@ -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 or v1.2.3.dev4) -- only edit if you know what you are doing' - required: false - type: string - checkout_ref: - description: 'Git ref to checkout before building wheels. Defaults to the release version.' - required: false - type: string - build_docker_images: - description: 'Build Docker images as part of release verification.' - required: true - default: true - type: boolean - 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 or v1.2.3.dev4) -- only edit if you know what you are doing' - required: false - type: string - checkout_ref: - description: 'Git ref to checkout before building wheels. Defaults to the release version.' - required: false - type: string - build_docker_images: - description: 'Build Docker images as part of release verification.' - required: false - default: true - type: boolean - token: - description: 'Personal Access Token' - required: true - default: "" - type: string - -jobs: - build-python-wheel: - name: Build wheels and source - 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@v4 - 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: ${{ inputs.custom_version }} - token: ${{ inputs.token }} - - name: Checkout version and install dependencies - env: - VERSION: ${{ steps.get-version.outputs.release_version }} - CHECKOUT_REF: ${{ inputs.checkout_ref }} - PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} - run: | - git fetch --tags - git checkout "${CHECKOUT_REF:-$VERSION}" - python -m pip install build - - name: Build feast - env: - SETUPTOOLS_SCM_PRETEND_VERSION: ${{ steps.get-version.outputs.version_without_prefix }} - run: python -m build - - uses: actions/upload-artifact@v4 - with: - name: python-wheels - 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 - if: ${{ inputs.build_docker_images }} - runs-on: ubuntu-latest - needs: [ build-python-wheel ] - strategy: - matrix: - component: [ feature-server-dev, feature-transformation-server, feast-operator ] - env: - REGISTRY: quay.io/feastdev - steps: - - uses: actions/checkout@v4 - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@v1.3.1 - with: - android: true - dotnet: true - haskell: true - large-packages: false - docker-images: false - swap-storage: false - tool-cache: false - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - install: true - - id: get-version - uses: ./.github/actions/get-semantic-release-version - with: - custom_version: ${{ inputs.custom_version }} - token: ${{ 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 ] - strategy: - matrix: - os: [ ubuntu-latest, macos-14 ] - python-version: [ "3.10", "3.11", "3.12"] - from-source: [ True, False ] - exclude: - # Skip macOS 14 with Python 3.10 due to gettext library issues - - os: macos-14 - python-version: "3.10" - 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: Install OS X dependencies - if: matrix.os == 'macos-14' - run: brew install coreutils gettext - - 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 - - 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: ${{ inputs.custom_version }} - token: ${{ 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_OUTPUT=$(printf '%s\n' "$VERSION_OUTPUT" | python -c 'import re, sys; print(re.sub(r"\x1b\[[0-9;]*[A-Za-z]", "", sys.stdin.read()).strip())') - VERSION_REGEX='[0-9]+\.[0-9]+\.[0-9]+(\.dev[0-9]+)?' - OUTPUT_REGEX="^Feast SDK Version: \"${VERSION_REGEX}\"$" - VERSION=$(echo "$VERSION_OUTPUT" | grep -oE "$VERSION_REGEX") - OUTPUT=$(echo "$VERSION_OUTPUT" | grep -E "$OUTPUT_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 diff --git a/.github/workflows/check_skip_tests.yml b/.github/workflows/check_skip_tests.yml deleted file mode 100644 index ba85ad8fe75..00000000000 --- a/.github/workflows/check_skip_tests.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: Check if Tests should be Skipped - -on: - workflow_call: - inputs: - head-sha: - required: true - type: string - excluded-dirs: - required: false - type: string - default: 'docs/**,community/**,examples/**' - -jobs: - check-changes: - runs-on: ubuntu-latest - outputs: - skip_tests: ${{ steps.check_skip_tests.outputs.skip_tests }} - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - ref: ${{ inputs.head-sha }} - - - name: Fetch base branch - run: | - git fetch origin ${{ github.base_ref }}:$GITHUB_REF_BASE - env: - GITHUB_REF_BASE: refs/remotes/origin/${{ github.base_ref }} - - - name: Set excluded dirs - id: set_excluded_dirs - run: | - EXCLUDED_DIRS="${{ inputs.excluded-dirs }}" - IFS=',' read -r -a EXCLUDED_DIRS_ARRAY <<< "$EXCLUDED_DIRS" - echo "Excluded directories: ${EXCLUDED_DIRS_ARRAY[@]}" - echo "EXCLUDED_DIRS_ARRAY=${EXCLUDED_DIRS_ARRAY[@]}" >> $GITHUB_ENV - - - name: Check for excluded directory changes - id: check_skip_tests - run: | - CHANGED_FILES=$(git diff --name-only $GITHUB_REF_BASE ${{ inputs.head-sha }}) - echo "Changed files:" - echo "$CHANGED_FILES" - - # Build a regex pattern from the excluded directories - EXCLUDE_PATTERN=$(IFS='|'; echo "${EXCLUDED_DIRS_ARRAY[*]}") - NON_EXCLUDED_CHANGED=$(echo "$CHANGED_FILES" | grep -Ev "^($EXCLUDE_PATTERN)" || true) - - if [[ -z "$NON_EXCLUDED_CHANGED" ]]; then - echo "skip_tests=true" >> "$GITHUB_ENV" - echo "::set-output name=skip_tests::true" - else - echo "skip_tests=false" >> "$GITHUB_ENV" - echo "::set-output name=skip_tests::false" - fi \ No newline at end of file diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000000..65e573901bd --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,93 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + pull_request: + schedule: + - cron: '26 9 * * *' + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + include: + - language: python + build-mode: none + # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + config: | + threat-models: [remote, local] + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" \ No newline at end of file diff --git a/.github/workflows/dbt-integration-tests.yml b/.github/workflows/dbt-integration-tests.yml deleted file mode 100644 index dd54ab36665..00000000000 --- a/.github/workflows/dbt-integration-tests.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: dbt-integration-tests - -# Run dbt integration tests on PRs -on: - pull_request: - types: - - opened - - synchronize - - labeled - paths: - - 'sdk/python/feast/dbt/**' - - 'sdk/python/tests/integration/dbt/**' - - 'sdk/python/tests/unit/dbt/**' - - '.github/workflows/dbt-integration-tests.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - dbt-integration-test: - if: - ((github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'lgtm' || github.event.label.name == 'ok-to-test')) || - (github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved') || contains(github.event.pull_request.labels.*.name, 'lgtm')))) && - github.event.pull_request.base.repo.full_name == 'feast-dev/feast' - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.11", "3.12"] - env: - PYTHON: ${{ matrix.python-version }} - steps: - - uses: actions/checkout@v4 - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - - name: Install dependencies - run: make install-python-dependencies-ci - - - name: Install dbt and dbt-duckdb - run: | - uv pip install --system dbt-core dbt-duckdb - - - name: Run dbt integration tests - run: uv run make test-python-integration-dbt - - - name: Minimize uv cache - run: uv cache prune --ci diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml deleted file mode 100644 index f402f907919..00000000000 --- a/.github/workflows/deploy-website.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Deploy Website to GitHub Pages - -on: - push: - branches: [ master, main ] - paths: - - 'infra/website/**' - # Allow manual triggers - workflow_dispatch: - -permissions: - contents: read - pages: write - id-token: write - -concurrency: - group: "pages" - cancel-in-progress: true - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - cache-dependency-path: infra/website/package-lock.json - - - name: Install dependencies - working-directory: infra/website - run: npm ci - - - name: Build site - working-directory: infra/website - run: npm run build - - - name: Setup Pages - uses: actions/configure-pages@v4 - - - name: Upload artifact - uses: actions/upload-pages-artifact@v4 - with: - path: infra/website/dist - - deploy: - needs: build - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.github/workflows/docker_smoke_tests.yml b/.github/workflows/docker_smoke_tests.yml deleted file mode 100644 index 1aed85cd93e..00000000000 --- a/.github/workflows/docker_smoke_tests.yml +++ /dev/null @@ -1,112 +0,0 @@ -name: docker-smoke-tests - -on: - pull_request: - paths: - - "sdk/python/feast/infra/feature_servers/multicloud/**" - - "sdk/python/feast/feature_server.py" - - "infra/scripts/feature_server_docker_smoke.py" - - "Makefile" - - ".github/workflows/publish_images.yml" - - ".github/workflows/docker_smoke_tests.yml" - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - feature-server-docker-smoke: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - arch: [amd64, arm64] - steps: - - uses: actions/checkout@v4 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - install: true - - name: Build feature-server image - env: - ARCH: ${{ matrix.arch }} - run: | - make build-feature-server-docker REGISTRY=feastdev VERSION=smoke-${ARCH} DOCKER_PLATFORMS=linux/${ARCH} - - name: Run container - env: - ARCH: ${{ matrix.arch }} - run: | - docker run -d --rm \ - --name feature-server-smoke-${ARCH} \ - --platform linux/${ARCH} \ - -p 6566:6566 \ - -v "${GITHUB_WORKSPACE}/infra/scripts/feature_server_docker_smoke.py:/smoke.py:ro" \ - feastdev/feature-server:smoke-${ARCH} \ - python /smoke.py - - name: Wait for /health - run: | - for i in $(seq 1 60); do - if curl -fsS http://localhost:6566/health >/dev/null; then - exit 0 - fi - sleep 2 - done - echo "feature-server /health did not become ready" - docker logs feature-server-smoke-${{ matrix.arch }} || true - exit 1 - - name: Cleanup - if: always() - env: - ARCH: ${{ matrix.arch }} - run: | - docker stop feature-server-smoke-${ARCH} || true - feature-server-dev-docker-smoke: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - arch: [amd64, arm64] - steps: - - uses: actions/checkout@v4 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - install: true - - name: Build feature-server-dev image - env: - ARCH: ${{ matrix.arch }} - run: | - make build-feature-server-dev-docker REGISTRY=feastdev VERSION=smoke-${ARCH} DOCKER_PLATFORMS=linux/${ARCH} - - name: Run container - env: - ARCH: ${{ matrix.arch }} - run: | - docker run -d --rm \ - --name feature-server-dev-smoke-${ARCH} \ - --platform linux/${ARCH} \ - -p 6566:6566 \ - -v "${GITHUB_WORKSPACE}/infra/scripts/feature_server_docker_smoke.py:/smoke.py:ro" \ - feastdev/feature-server:smoke-${ARCH} \ - python /smoke.py - - name: Wait for /health - run: | - for i in $(seq 1 60); do - if curl -fsS http://localhost:6566/health >/dev/null; then - exit 0 - fi - sleep 2 - done - echo "feature-server /health did not become ready" - docker logs feature-server-dev-smoke-${{ matrix.arch }} || true - exit 1 - - name: Cleanup - if: always() - env: - ARCH: ${{ matrix.arch }} - run: | - docker stop feature-server-dev-smoke-${ARCH} || true diff --git a/.github/workflows/lint_pr.yml b/.github/workflows/lint_pr.yml deleted file mode 100644 index 8cbfc78e21c..00000000000 --- a/.github/workflows/lint_pr.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: lint-pr - -on: - pull_request: - types: - - opened - - edited - - synchronize - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - validate-title: - if: - github.event.pull_request.base.repo.full_name == 'feast-dev/feast' - name: Validate PR title - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - sparse-checkout: .commitlintrc.yaml - sparse-checkout-cone-mode: false - - name: Lint PR title with commitlint - env: - PR_TITLE: ${{ github.event.pull_request.title }} - run: | - npm install --no-save @commitlint/cli @commitlint/config-conventional - echo "$PR_TITLE" | npx commitlint diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml deleted file mode 100644 index 9e8a3fe3d1b..00000000000 --- a/.github/workflows/linter.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: linter - -on: - pull_request: - paths-ignore: - - 'docs/**' - - 'community/**' - - 'examples/**' - push: - paths-ignore: - - 'docs/**' - - 'community/**' - - 'examples/**' - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - lint-python: - runs-on: [ubuntu-latest] - env: - PYTHON: 3.11 - steps: - - uses: actions/checkout@v4 - - name: Setup Python - id: setup-python - uses: actions/setup-python@v5 - with: - python-version: "3.11" - architecture: x64 - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install dependencies - run: | - make install-python-dependencies-ci - - name: Run pre-commit checks - uses: pre-commit/action@v3.0.1 - - name: Cache MyPy - uses: actions/cache@v4 - with: - path: sdk/python/.mypy_cache - key: mypy-${{ runner.os }}-py${{ env.PYTHON }}-${{ hashFiles('pyproject.toml', 'sdk/python/pyproject.toml', 'sdk/python/requirements/*.txt') }} - restore-keys: | - mypy-${{ runner.os }}-py${{ env.PYTHON }}- - mypy-${{ runner.os }}- - - name: Lint python - run: make lint-python - - name: Minimize uv cache - run: uv cache prune --ci diff --git a/.github/workflows/master_only.yml b/.github/workflows/master_only.yml deleted file mode 100644 index 4900135add1..00000000000 --- a/.github/workflows/master_only.yml +++ /dev/null @@ -1,144 +0,0 @@ -name: integration-tests-and-build - -on: - push: - branches: - - master - -jobs: - integration-test-python: - if: github.repository == 'feast-dev/feast' - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - python-version: ["3.10", "3.11", "3.12"] - os: [ ubuntu-latest ] - env: - OS: ${{ matrix.os }} - PYTHON: ${{ matrix.python-version }} - services: - redis: - image: redis - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - steps: - - uses: actions/checkout@v4 - - name: Setup Python - id: setup-python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_SA_KEY }}' - - name: Set up gcloud SDK - uses: google-github-actions/setup-gcloud@v2 - with: - project_id: ${{ secrets.GCP_PROJECT_ID }} - - name: Use gcloud CLI - run: gcloud info - - name: Set up AWS SDK - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - name: Use AWS CLI - run: aws sts get-caller-identity - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install dependencies - run: make install-python-dependencies-ci - - name: Setup Redis Cluster - run: | - docker pull vishnunair/docker-redis-cluster:latest - docker run -d -p 6001:6379 -p 6002:6380 -p 6003:6381 -p 6004:6382 -p 6005:6383 -p 6006:6384 --name redis-cluster vishnunair/docker-redis-cluster - - name: Test python and go - env: - SNOWFLAKE_CI_DEPLOYMENT: ${{ secrets.SNOWFLAKE_CI_DEPLOYMENT }} - SNOWFLAKE_CI_USER: ${{ secrets.SNOWFLAKE_CI_USER }} - SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }} - SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }} - SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }} - run: make test-python-integration - - name: Benchmark python - if: matrix.python-version == '3.11' - env: - SNOWFLAKE_CI_DEPLOYMENT: ${{ secrets.SNOWFLAKE_CI_DEPLOYMENT }} - SNOWFLAKE_CI_USER: ${{ secrets.SNOWFLAKE_CI_USER }} - SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }} - SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }} - SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }} - run: uv run pytest --verbose --color=yes sdk/python/tests --integration --benchmark --benchmark-autosave --benchmark-save-data --durations=5 - - name: Upload Benchmark Artifact to S3 - if: matrix.python-version == '3.11' - run: aws s3 cp --recursive .benchmarks s3://feast-ci-pytest-benchmark - - name: Minimize uv cache - run: uv cache prune --ci - - build-all-docker-images: - if: github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - strategy: - matrix: - include: - - component: feature-server-dev - target: feature-server-dev - image_name: feature-server - build_args: DOCKER_PUSH=true DOCKER_PLATFORMS=linux/amd64,linux/arm64 - push_mode: imagetools - - component: feature-transformation-server - target: feature-transformation-server - image_name: feature-transformation-server - build_args: "" - push_mode: all_tags - - component: feast-operator - target: feast-operator - image_name: feast-operator - build_args: DOCKER_PUSH=true DOCKER_PLATFORMS=linux/amd64,linux/arm64 - push_mode: imagetools - env: - REGISTRY: quay.io/feastdev-ci - steps: - - uses: actions/checkout@v4 - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@v1.3.1 - with: - android: true - dotnet: true - haskell: true - large-packages: false - docker-images: false - swap-storage: false - tool-cache: false - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - install: true - - name: Login to Quay.io - uses: docker/login-action@v3 - with: - registry: quay.io - username: ${{ secrets.QUAYIO_CI_USERNAME }} - password: ${{ secrets.QUAYIO_CI_TOKEN }} - - name: Build image - run: make build-${{ matrix.target }}-docker REGISTRY=${REGISTRY} VERSION=${GITHUB_SHA} ${{ matrix.build_args }} - - name: Push image - run: | - if [[ "${{ matrix.push_mode }}" == "imagetools" ]]; then - docker buildx imagetools create -t ${REGISTRY}/${{ matrix.image_name }}:develop ${REGISTRY}/${{ matrix.image_name }}:${GITHUB_SHA} - else - docker tag ${REGISTRY}/${{ matrix.image_name }}:${GITHUB_SHA} ${REGISTRY}/${{ matrix.image_name }}:develop && docker push ${REGISTRY}/${{ matrix.image_name }} --all-tags - fi diff --git a/.github/workflows/nightly-ci.yml b/.github/workflows/nightly-ci.yml deleted file mode 100644 index e4ab32acd6d..00000000000 --- a/.github/workflows/nightly-ci.yml +++ /dev/null @@ -1,152 +0,0 @@ -name: nightly-ci - -on: - schedule: - - cron: '00 08 * * *' # early morning 08:00 AM UTC, which is 1 AM PST/4 AM EST. - -# concurrency is currently broken, see details https://github.com/actions/runner/issues/1532 -#concurrency: -# group: pr-integration-tests-${{ github.event.pull_request.number }} -# cancel-in-progress: true - -jobs: - check_date: - if: github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - name: Check latest commit - outputs: - WAS_EDITED: ${{ steps.check_date.outputs.WAS_EDITED }} - steps: - - uses: actions/checkout@v4 - with: - ref: master - - id: check_date - name: Check if there were commits in the last day - if: ${{ github.event_name == 'schedule' }} - run: echo '::set-output name=WAS_EDITED::'$(test -n "$(git log --format=%H --since='24 hours ago')" && echo 'true' || echo 'false') - cleanup_dynamo_tables: - if: github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - name: Cleanup Bigtable / Dynamo tables which can fail to cleanup - steps: - - uses: actions/checkout@v4 - with: - ref: master - - name: Setup Python - uses: actions/setup-python@v5 - id: setup-python - with: - python-version: "3.11" - architecture: x64 - - name: Set up AWS SDK - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - name: Install Python dependencies - run: | - pip install boto3 - pip install google-cloud-bigtable - pip install tqdm - - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_SA_KEY }}' - - name: Set up gcloud SDK - uses: google-github-actions/setup-gcloud@v2 - with: - project_id: ${{ secrets.GCP_PROJECT_ID }} - - name: Use gcloud CLI - run: gcloud info - - name: Run DynamoDB / Bigtable cleanup script - run: python infra/scripts/cleanup_ci.py - integration-test-python: - if: github.repository == 'feast-dev/feast' - needs: [check_date, cleanup_dynamo_tables] - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - python-version: [ "3.11" ] - os: [ ubuntu-latest ] - env: - OS: ${{ matrix.os }} - PYTHON: ${{ matrix.python-version }} - services: - redis: - image: redis - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - steps: - - uses: actions/checkout@v4 - with: - ref: master - submodules: recursive - - name: Setup Python - uses: actions/setup-python@v5 - id: setup-python - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - name: Setup Go - id: setup-go - uses: actions/setup-go@v5 - with: - go-version: 1.18.0 - - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_SA_KEY }}' - - name: Set up gcloud SDK - uses: google-github-actions/setup-gcloud@v2 - with: - project_id: ${{ secrets.GCP_PROJECT_ID }} - - name: Use gcloud CLI - run: gcloud info - - name: Set up AWS SDK - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - name: Use AWS CLI - run: aws sts get-caller-identity - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install apache-arrow on ubuntu - if: matrix.os == 'ubuntu-latest' - run: | - sudo apt update - sudo apt install -y -V ca-certificates lsb-release wget - wget https://apache.jfrog.io/artifactory/arrow/$(lsb_release --id --short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb - sudo apt install -y -V ./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb - sudo apt update - sudo apt install -y -V libarrow-dev - - name: Install apache-arrow on macos - if: matrix.os == 'macos-14' - run: brew install apache-arrow - - name: Install dependencies - run: make install-python-dependencies-ci - - name: Setup Redis Cluster - run: | - docker pull vishnunair/docker-redis-cluster:latest - docker run -d -p 6001:6379 -p 6002:6380 -p 6003:6381 -p 6004:6382 -p 6005:6383 -p 6006:6384 --name redis-cluster vishnunair/docker-redis-cluster - - name: Test python - if: ${{ always() }} # this will guarantee that step won't be canceled and resources won't leak - env: - SNOWFLAKE_CI_DEPLOYMENT: ${{ secrets.SNOWFLAKE_CI_DEPLOYMENT }} - SNOWFLAKE_CI_USER: ${{ secrets.SNOWFLAKE_CI_USER }} - SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }} - SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }} - SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }} - run: make test-python-integration - - name: Minimize uv cache - run: uv cache prune --ci diff --git a/.github/workflows/nightly_python_sdk_release.yml b/.github/workflows/nightly_python_sdk_release.yml deleted file mode 100644 index 6c758360d56..00000000000 --- a/.github/workflows/nightly_python_sdk_release.yml +++ /dev/null @@ -1,95 +0,0 @@ -name: nightly python sdk release - -on: - schedule: - - cron: "0 8 * * *" - workflow_dispatch: - inputs: - base_version: - description: "Optional base version without the .dev suffix (e.g., 1.2.3). Defaults to the next semantic-release version." - required: false - type: string - dev_number: - description: "Optional dev release number. Defaults to the workflow run number." - required: false - type: string - -permissions: - contents: write - -concurrency: - group: nightly-python-sdk-release - cancel-in-progress: false - -jobs: - get-nightly-version: - if: github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - outputs: - nightly_version: ${{ steps.version.outputs.nightly_version }} - env: - GITHUB_TOKEN: ${{ github.token }} - INPUT_BASE_VERSION: ${{ inputs.base_version }} - INPUT_DEV_NUMBER: ${{ inputs.dev_number }} - DEFAULT_DEV_NUMBER: ${{ github.run_number }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: "lts/*" - - name: Get nightly version - id: version - run: | - set -euo pipefail - - if [[ -n "$INPUT_BASE_VERSION" ]]; then - BASE_VERSION="${INPUT_BASE_VERSION#v}" - else - set +e - SEMANTIC_OUTPUT=$(npx -p @semantic-release/changelog -p @semantic-release/git -p @semantic-release/exec -p semantic-release semantic-release --dry-run 2>&1) - SEMANTIC_STATUS=$? - set -e - echo "$SEMANTIC_OUTPUT" - - BASE_VERSION=$(printf '%s\n' "$SEMANTIC_OUTPUT" | sed -nE 's/.*The next release version is ([[:digit:].]+)$/\1/p' | tail -n 1) - if [[ -z "$BASE_VERSION" ]]; then - echo "Could not determine a semantic-release next version (exit code: ${SEMANTIC_STATUS}); falling back to next patch after latest stable tag." - LATEST_TAG=$(git tag -l 'v[0-9]*.[0-9]*.[0-9]*' --sort=-v:refname | sed -nE '/^v[0-9]+\.[0-9]+\.[0-9]+$/{p;q;}') - if [[ -z "$LATEST_TAG" ]]; then - echo "Could not determine latest stable tag." - exit 1 - fi - LATEST_VERSION="${LATEST_TAG#v}" - IFS=. read -r MAJOR MINOR PATCH <<< "$LATEST_VERSION" - BASE_VERSION="${MAJOR}.${MINOR}.$((PATCH + 1))" - fi - fi - - if [[ ! "$BASE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "Base version must match X.Y.Z, got: ${BASE_VERSION}" - exit 1 - fi - - DEV_NUMBER="${INPUT_DEV_NUMBER:-$DEFAULT_DEV_NUMBER}" - if [[ ! "$DEV_NUMBER" =~ ^[0-9]+$ ]]; then - echo "Dev number must be numeric, got: ${DEV_NUMBER}" - exit 1 - fi - - NIGHTLY_VERSION="v${BASE_VERSION}.dev${DEV_NUMBER}" - echo "Nightly version is ${NIGHTLY_VERSION}" - echo "nightly_version=${NIGHTLY_VERSION}" >> "$GITHUB_OUTPUT" - - publish-nightly-python-sdk: - needs: get-nightly-version - uses: ./.github/workflows/publish_python_sdk.yml - secrets: inherit # pragma: allowlist secret - with: - custom_version: ${{ needs.get-nightly-version.outputs.nightly_version }} - checkout_ref: ${{ github.sha }} - build_docker_images: false - token: ${{ github.token }} diff --git a/.github/workflows/operator-e2e-integration-tests.yml b/.github/workflows/operator-e2e-integration-tests.yml deleted file mode 100644 index 788d6f1cac5..00000000000 --- a/.github/workflows/operator-e2e-integration-tests.yml +++ /dev/null @@ -1,108 +0,0 @@ -# .github/workflows/operator-e2e-integration-tests.yml -name: Operator e2e tests - -on: - push: - branches: - - main - pull_request: - types: - - opened - - synchronize - - labeled - paths: - - 'infra/**' - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - operator-e2e-tests: - timeout-minutes: 40 - if: - ((github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'lgtm' || github.event.label.name == 'ok-to-test')) || - (github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved') || contains(github.event.pull_request.labels.*.name, 'lgtm')))) && - github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - - services: - kind: - # Specify the Kubernetes version - image: kindest/node:v1.30.6 - - env: - KIND_CLUSTER: "operator-e2e-cluster" - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@v1.3.1 - with: - android: true - dotnet: true - haskell: true - large-packages: false - docker-images: false - swap-storage: false - tool-cache: false - - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version: 1.25.0 - - - name: Create KIND cluster - run: | - cat <- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - steps: - - uses: actions/checkout@v4 - with: - # pull_request_target runs the workflow in the context of the base repo - # as such actions/checkout needs to be explicit configured to retrieve - # code from the PR. - ref: refs/pull/${{ github.event.pull_request.number }}/merge - submodules: recursive - persist-credentials: false - allow-unsafe-pr-checkout: true # Security: gated by label check above - - name: Setup Python - uses: actions/setup-python@v5 - id: setup-python - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_SA_KEY }}' - - name: Set up gcloud SDK - uses: google-github-actions/setup-gcloud@v2 - with: - project_id: ${{ secrets.GCP_PROJECT_ID }} - - name: Use gcloud CLI - run: gcloud info - - name: Set up AWS SDK - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - name: Use AWS CLI - run: aws sts get-caller-identity - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install dependencies - run: make install-python-dependencies-ci - - name: Setup Redis Cluster - run: | - docker pull vishnunair/docker-redis-cluster:latest - docker run -d -p 6001:6379 -p 6002:6380 -p 6003:6381 -p 6004:6382 -p 6005:6383 -p 6006:6384 --name redis-cluster vishnunair/docker-redis-cluster - - name: Test python - if: ${{ always() }} # this will guarantee that step won't be canceled and resources won't leak - env: - FEAST_SERVER_DOCKER_IMAGE_TAG: ${{ needs.build-docker-image.outputs.DOCKER_IMAGE_TAG }} - SNOWFLAKE_CI_DEPLOYMENT: ${{ secrets.SNOWFLAKE_CI_DEPLOYMENT }} - SNOWFLAKE_CI_USER: ${{ secrets.SNOWFLAKE_CI_USER }} - SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }} - SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }} - SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }} - run: make test-python-integration - - name: Minimize uv cache - run: uv cache prune --ci - - mcp-feature-server-runtime: - if: - ((github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'lgtm' || github.event.label.name == 'ok-to-test')) || - (github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved') || contains(github.event.pull_request.labels.*.name, 'lgtm')))) && - github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: refs/pull/${{ github.event.pull_request.number }}/merge - submodules: recursive - persist-credentials: false - allow-unsafe-pr-checkout: true # Security: gated by label check above - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: "3.11" - architecture: x64 - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install dependencies - run: make install-python-dependencies-ci - - name: Start feature server (MCP HTTP) - run: | - cd examples/mcp_feature_store - uv run python -m feast.cli.cli serve --host 127.0.0.1 --port 6566 --workers 1 --no-access-log & - SERVER_PID=$! - echo $SERVER_PID > /tmp/feast_server_pid - for i in $(seq 1 60); do - kill -0 "$SERVER_PID" || { echo "server died"; exit 1; } - if curl -fsS http://127.0.0.1:6566/health >/dev/null; then - break - fi - sleep 1 - done - curl -fsS http://127.0.0.1:6566/health >/dev/null - - name: Validate MCP endpoint - run: | - rm -f /tmp/mcp_headers /tmp/mcp_headers2 /tmp/mcp_body2 - - curl -sS -D /tmp/mcp_headers -o /dev/null --max-time 10 \ - -X POST \ - -H "Accept: application/json, text/event-stream" \ - -H "Content-Type: application/json" \ - -H "mcp-protocol-version: 2025-03-26" \ - --data '{}' \ - http://127.0.0.1:6566/mcp - - SESSION_ID=$(grep -i "^mcp-session-id:" /tmp/mcp_headers | head -1 | awk '{print $2}' | tr -d '\r') - if [ -z "${SESSION_ID}" ]; then - cat /tmp/mcp_headers || true - exit 1 - fi - - curl -sS -D /tmp/mcp_headers2 -o /tmp/mcp_body2 --max-time 10 \ - -X POST \ - -H "Accept: application/json, text/event-stream" \ - -H "Content-Type: application/json" \ - -H "mcp-protocol-version: 2025-03-26" \ - -H "mcp-session-id: ${SESSION_ID}" \ - --data '{}' \ - http://127.0.0.1:6566/mcp - - grep -Eq "^HTTP/.* 400" /tmp/mcp_headers2 - grep -Eiq "^content-type: application/json" /tmp/mcp_headers2 - grep -Eiq "^mcp-session-id: ${SESSION_ID}" /tmp/mcp_headers2 - - name: Stop feature server - if: always() - run: | - if [ -f /tmp/feast_server_pid ]; then - kill "$(cat /tmp/feast_server_pid)" || true - fi - - name: Minimize uv cache - if: always() - run: uv cache prune --ci diff --git a/.github/workflows/pr_local_integration_tests.yml b/.github/workflows/pr_local_integration_tests.yml deleted file mode 100644 index 115be2298cd..00000000000 --- a/.github/workflows/pr_local_integration_tests.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: pr-local-integration-tests -# This runs local tests with containerized stubs of online stores. This is the main dev workflow - -on: - pull_request: - types: - - opened - - synchronize - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - integration-test-python-local: - if: - ((github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'lgtm' || github.event.label.name == 'ok-to-test')) || - (github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved') || contains(github.event.pull_request.labels.*.name, 'lgtm')))) && - github.event.pull_request.base.repo.full_name == 'feast-dev/feast' - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - python-version: [ "3.11" ] - os: [ ubuntu-latest ] - env: - OS: ${{ matrix.os }} - PYTHON: ${{ matrix.python-version }} - steps: - - uses: actions/checkout@v4 - with: - repository: ${{ github.event.repository.full_name }} # Uses the full repository name - ref: ${{ github.ref }} # Uses the ref from the event - token: ${{ secrets.GITHUB_TOKEN }} # Automatically provided token - submodules: recursive - - name: Setup Python - uses: actions/setup-python@v5 - id: setup-python - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install dependencies - run: make install-python-dependencies-ci - - name: Cache Hadoop tarball - uses: actions/cache@v4 - with: - path: ~/hadoop-3.4.2.tar.gz - key: hadoop-3.4.2 - - name: Install Hadoop dependencies - run: make install-hadoop-dependencies-ci - - name: Test local integration tests - if: ${{ always() }} # this will guarantee that step won't be canceled and resources won't leak - run: make test-python-integration-local - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version: 1.25.0 - - name: Operator Data Source types test - run: make -C infra/feast-operator test-datasources - - name: Minimize uv cache - run: uv cache prune --ci diff --git a/.github/workflows/pr_ray_integration_tests.yml b/.github/workflows/pr_ray_integration_tests.yml deleted file mode 100644 index 81c82bf0c49..00000000000 --- a/.github/workflows/pr_ray_integration_tests.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: pr-ray-integration-tests - -on: - pull_request: - types: - - opened - - synchronize - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - integration-test-ray: - if: - ((github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'lgtm' || github.event.label.name == 'ok-to-test')) || - (github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved') || contains(github.event.pull_request.labels.*.name, 'lgtm')))) && - github.event.pull_request.base.repo.full_name == 'feast-dev/feast' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - repository: ${{ github.event.repository.full_name }} - ref: ${{ github.ref }} - token: ${{ secrets.GITHUB_TOKEN }} - submodules: recursive - - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.10.0 - with: - pixi-version: v0.75.0 - environments: ray-tests - cache: true - - name: Run Ray integration tests (offline store + compute engine) - run: make test-python-ray-integration diff --git a/.github/workflows/pr_registration_integration_tests.yml b/.github/workflows/pr_registration_integration_tests.yml deleted file mode 100644 index ab60cb22b3a..00000000000 --- a/.github/workflows/pr_registration_integration_tests.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: pr-registration-integration-tests - -on: - pull_request_target: - types: - - opened - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -permissions: - actions: write - pull-requests: read - -jobs: - integration-test-registration-local: - if: - ((github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'lgtm' || github.event.label.name == 'ok-to-test')) || - (github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved') || contains(github.event.pull_request.labels.*.name, 'lgtm')))) && - github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: refs/pull/${{ github.event.pull_request.number }}/merge - submodules: recursive - persist-credentials: false - allow-unsafe-pr-checkout: true # Security: gated by label check above - - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.10.0 - with: - pixi-version: v0.75.0 - environments: registration-tests - cache: true - - name: Run registration integration tests (local) - run: make test-python-registration - - integration-test-registration-ci: - if: - ((github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'lgtm' || github.event.label.name == 'ok-to-test')) || - (github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved') || contains(github.event.pull_request.labels.*.name, 'lgtm')))) && - github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - services: - redis: - image: redis - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - steps: - - uses: actions/checkout@v4 - with: - ref: refs/pull/${{ github.event.pull_request.number }}/merge - submodules: recursive - persist-credentials: false - allow-unsafe-pr-checkout: true # Security: gated by label check above - - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_SA_KEY }}' - - name: Set up gcloud SDK - uses: google-github-actions/setup-gcloud@v2 - with: - project_id: ${{ secrets.GCP_PROJECT_ID }} - - name: Set up AWS SDK - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-west-2 - - name: Cache Hadoop tarball - uses: actions/cache@v4 - with: - path: ~/hadoop-3.4.2.tar.gz - key: hadoop-3.4.2 - - name: Install Hadoop dependencies - run: make install-hadoop-dependencies-ci - - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.10.0 - with: - pixi-version: v0.75.0 - environments: registration-tests - cache: true - - name: Run registration integration tests (CI) - run: make test-python-registration-ci diff --git a/.github/workflows/pr_remote_rbac_integration_tests.yml b/.github/workflows/pr_remote_rbac_integration_tests.yml deleted file mode 100644 index 91cf0f4c564..00000000000 --- a/.github/workflows/pr_remote_rbac_integration_tests.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: pr-remote-rbac-integration-tests -# This runs the integration tests related to rbac functionality and remote registry and online features. - -on: - pull_request: - types: - - opened - - synchronize - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - remote-rbac-integration-tests-python: - if: - ((github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'lgtm' || github.event.label.name == 'ok-to-test')) || - (github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved') || contains(github.event.pull_request.labels.*.name, 'lgtm')))) && - github.event.pull_request.base.repo.full_name == 'feast-dev/feast' - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - python-version: [ "3.11" ] - os: [ ubuntu-latest ] - env: - OS: ${{ matrix.os }} - PYTHON: ${{ matrix.python-version }} - steps: - - uses: actions/checkout@v4 - with: - repository: ${{ github.event.repository.full_name }} # Uses the full repository name - ref: ${{ github.ref }} # Uses the ref from the event - token: ${{ secrets.GITHUB_TOKEN }} # Automatically provided token - submodules: recursive - - name: Setup Python - uses: actions/setup-python@v5 - id: setup-python - with: - python-version: ${{ matrix.python-version }} - architecture: x64 - - name: Install the latest version of uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - name: Install dependencies - run: make install-python-dependencies-ci - - name: Test rbac and remote feature integration tests - if: ${{ always() }} # this will guarantee that step won't be canceled and resources won't leak - run: make test-python-integration-rbac-remote - - name: Minimize uv cache - run: uv cache prune --ci diff --git a/.github/workflows/pr_website_build.yml b/.github/workflows/pr_website_build.yml deleted file mode 100644 index 926f1fca0f9..00000000000 --- a/.github/workflows/pr_website_build.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Website Build Check - -on: - pull_request: - paths: - - 'infra/website/**' - -concurrency: - group: "pr-website-${{ github.event.pull_request.number }}" - cancel-in-progress: true - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - cache-dependency-path: infra/website/package-lock.json - - - name: Install dependencies - working-directory: infra/website - run: npm ci - - - name: Build site - working-directory: infra/website - run: npm run build diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index ffa91034d32..00000000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: publish - -on: - push: - tags: - - 'v*.*.*' - 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 - publish_ui: - description: 'Publish to NPM?' - required: true - default: true - type: boolean - workflow_call: # Allows trigger the workflow from other 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 - type: string - publish_ui: - description: 'Publish to NPM?' - required: true - type: boolean - -permissions: - contents: read - id-token: write - -jobs: - publish-python-sdk: - uses: ./.github/workflows/publish_python_sdk.yml - secrets: inherit - with: - custom_version: ${{ github.event.inputs.custom_version }} - token: ${{ github.event.inputs.token }} - - build-publish-docker-images: - uses: ./.github/workflows/publish_images.yml - needs: [ publish-python-sdk ] - secrets: inherit - with: - custom_version: ${{ github.event.inputs.custom_version }} - token: ${{ github.event.inputs.token }} - - publish-helm-charts: - uses: ./.github/workflows/publish_helm_charts.yml - needs: [ publish-python-sdk ] - secrets: inherit - with: - custom_version: ${{ github.event.inputs.custom_version }} - token: ${{ github.event.inputs.token }} - - publish-web-ui: - uses: ./.github/workflows/publish_web_ui.yml - needs: [ publish-python-sdk ] - secrets: inherit - with: - custom_version: ${{ github.event.inputs.custom_version }} - token: ${{ github.event.inputs.token || github.token }} - publish_ui: ${{ github.event.inputs.publish_ui != 'false' }} diff --git a/.github/workflows/publish_helm_charts.yml b/.github/workflows/publish_helm_charts.yml deleted file mode 100644 index 85c780a23b9..00000000000 --- a/.github/workflows/publish_helm_charts.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: publish helm charts - -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: # Allows trigger of the workflow from another 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 - -jobs: - publish-helm-charts: - if: github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - env: - HELM_VERSION: v3.8.0 - steps: - - uses: actions/checkout@v4 - with: - submodules: 'true' - - id: get-version - uses: ./.github/actions/get-semantic-release-version - with: - custom_version: ${{ github.event.inputs.custom_version }} - token: ${{ github.event.inputs.token }} - - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_SA_KEY }}' - - name: Set up gcloud SDK - uses: google-github-actions/setup-gcloud@v2 - with: - project_id: ${{ secrets.GCP_PROJECT_ID }} - - run: gcloud auth configure-docker --quiet - - name: Remove previous Helm - run: sudo rm -rf $(which helm) - - name: Install Helm - run: ./infra/scripts/helm/install-helm.sh - - name: Validate Helm chart prior to publishing - run: ./infra/scripts/helm/validate-helm-chart-publish.sh - - name: Validate all version consistency - env: - VERSION_WITHOUT_PREFIX: ${{ steps.get-version.outputs.version_without_prefix }} - run: ./infra/scripts/helm/validate-helm-chart-versions.sh $VERSION_WITHOUT_PREFIX - - name: Publish Helm charts - env: - VERSION_WITHOUT_PREFIX: ${{ steps.get-version.outputs.version_without_prefix }} - run: ./infra/scripts/helm/push-helm-charts.sh $VERSION_WITHOUT_PREFIX - diff --git a/.github/workflows/publish_images.yml b/.github/workflows/publish_images.yml deleted file mode 100644 index 5ef0a972ae3..00000000000 --- a/.github/workflows/publish_images.yml +++ /dev/null @@ -1,102 +0,0 @@ -name: build and publish docker images - -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 - token: - description: 'Personal Access Token' - required: true - default: "" - type: string - ref: - description: 'Git ref to checkout (branch, tag, or SHA). Defaults to the triggering ref. Use to rebuild images from a different branch (e.g., master) when the release tag has a broken Dockerfile.' - required: false - type: string - workflow_call: # Allows trigger of the workflow from another 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 - -jobs: - build-publish-docker-images: - if: github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - strategy: - matrix: - component: [ feature-server, feature-transformation-server, feast-operator, go-feature-server ] - env: - MAVEN_CACHE: gs://feast-templocation-kf-feast/.m2.2020-08-19.tar - REGISTRY: quay.io/feastdev - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.inputs.ref || github.ref }} - submodules: 'true' - - id: get-version - uses: ./.github/actions/get-semantic-release-version - with: - custom_version: ${{ github.event.inputs.custom_version }} - token: ${{ github.event.inputs.token }} - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - install: true - - name: Login to Quay.io - uses: docker/login-action@v3 - with: - registry: quay.io - username: ${{ secrets.QUAYIO_USERNAME }} - password: ${{ secrets.QUAYIO_TOKEN }} - - name: Authenticate to Google Cloud - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_SA_KEY }}' - - name: Set up gcloud SDK - uses: google-github-actions/setup-gcloud@v2 - with: - project_id: ${{ secrets.GCP_PROJECT_ID }} - - name: Use gcloud CLI - run: gcloud info - - run: gcloud auth configure-docker --quiet - - name: Build image - env: - VERSION_WITHOUT_PREFIX: ${{ steps.get-version.outputs.version_without_prefix }} - run: | - if [[ "${{ matrix.component }}" == "feature-server" || "${{ matrix.component }}" == "feast-operator" ]]; then - make build-${{ matrix.component }}-docker REGISTRY=${REGISTRY} VERSION=${VERSION_WITHOUT_PREFIX} DOCKER_PUSH=true DOCKER_PLATFORMS=linux/amd64,linux/arm64 - else - make build-${{ matrix.component }}-docker REGISTRY=${REGISTRY} VERSION=${VERSION_WITHOUT_PREFIX} - fi - - name: Push versioned images - env: - VERSION_WITHOUT_PREFIX: ${{ steps.get-version.outputs.version_without_prefix }} - HIGHEST_SEMVER_TAG: ${{ steps.get-version.outputs.highest_semver_tag }} - run: | - if [[ "${{ matrix.component }}" == "feature-server" || "${{ matrix.component }}" == "feast-operator" ]]; then - echo "${{ matrix.component }} image pushed via buildx during build step" - else - make push-${{ matrix.component }}-docker REGISTRY=${REGISTRY} VERSION=${VERSION_WITHOUT_PREFIX} - fi - - echo "Only push to latest tag if tag is the highest semver version $HIGHEST_SEMVER_TAG" - if [ "${VERSION_WITHOUT_PREFIX}" = "${HIGHEST_SEMVER_TAG:1}" ] - then - if [[ "${{ matrix.component }}" == "feature-server" || "${{ matrix.component }}" == "feast-operator" ]]; then - docker buildx imagetools create -t ${REGISTRY}/${{ matrix.component }}:latest ${REGISTRY}/${{ matrix.component }}:${VERSION_WITHOUT_PREFIX} - else - docker tag ${REGISTRY}/${{ matrix.component }}:${VERSION_WITHOUT_PREFIX} ${REGISTRY}/${{ matrix.component }}:latest - docker push ${REGISTRY}/${{ matrix.component }}:latest - fi - fi diff --git a/.github/workflows/publish_python_sdk.yml b/.github/workflows/publish_python_sdk.yml deleted file mode 100644 index 85be4bc226b..00000000000 --- a/.github/workflows/publish_python_sdk.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: publish python sdk - -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 or v1.2.3.dev4) -- only edit if you know what you are doing' - required: false - type: string - checkout_ref: - description: 'Git ref to checkout before building wheels. Defaults to the release version.' - required: false - type: string - build_docker_images: - description: 'Build Docker images as part of release verification.' - required: true - default: true - type: boolean - token: - description: 'Personal Access Token' - required: true - default: "" - type: string - - workflow_call: # Allows trigger of the workflow from another workflow - inputs: - custom_version: # Optional input for a custom version - description: 'Custom version to publish (e.g., v1.2.3 or v1.2.3.dev4) -- only edit if you know what you are doing' - required: false - type: string - checkout_ref: - description: 'Git ref to checkout before building wheels. Defaults to the release version.' - required: false - type: string - build_docker_images: - description: 'Build Docker images as part of release verification.' - required: false - default: true - type: boolean - token: - description: 'Personal Access Token' - required: true - default: "" - type: string - -jobs: - build-wheels: - uses: ./.github/workflows/build_wheels.yml - secrets: inherit - with: - custom_version: ${{ inputs.custom_version }} - checkout_ref: ${{ inputs.checkout_ref }} - build_docker_images: ${{ inputs.build_docker_images }} - token: ${{ inputs.token }} - - publish-python-sdk: - if: github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - needs: [ build-wheels ] - steps: - - uses: actions/download-artifact@v4.1.7 - with: - name: python-wheels - path: dist - - name: Publish package to PyPI - uses: pypa/gh-action-pypi-publish@v1.4.2 - with: - user: __token__ - password: ${{ secrets.PYPI_PASSWORD }} diff --git a/.github/workflows/publish_web_ui.yml b/.github/workflows/publish_web_ui.yml deleted file mode 100644 index b36165625fd..00000000000 --- a/.github/workflows/publish_web_ui.yml +++ /dev/null @@ -1,122 +0,0 @@ -name: publish web ui - -on: - workflow_call: # Allows trigger of the workflow from another workflow - inputs: - current_version: - description: 'Current version to bump from (e.g., v1.2.3). If not provided, will auto-detect from git tags' - required: false - type: string - 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: false - default: "" - type: string - publish_ui: - description: 'Publish to NPM?' - required: true - type: boolean - -permissions: - contents: read - id-token: write - -jobs: - publish-web-ui-npm: - if: github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - environment: production - steps: - - uses: actions/checkout@v4 - - name: Determine current version - id: get-current-version - if: github.event.inputs.custom_version != '' - shell: bash - run: | - if [[ -n "${{ github.event.inputs.current_version }}" ]]; then - # Use provided current version - CURRENT_VERSION_RAW="${{ github.event.inputs.current_version }}" - echo "Using provided current version: $CURRENT_VERSION_RAW" - - else - # Auto-detect current version from git tags - echo "No current version provided, auto-detecting from git tags..." - source infra/scripts/setup-common-functions.sh - - if [[ "${GITHUB_REF}" == refs/tags/* ]]; then - # If running from a tag, get the previous tag - CURRENT_TAG="${GITHUB_REF#refs/tags/}" - echo "Running from tag: $CURRENT_TAG" - - # Get all tags, sort them, find the one before current tag - PREVIOUS_TAG=$(git tag -l | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | grep -B1 "^${CURRENT_TAG}$" | head -1) - - if [[ -z "$PREVIOUS_TAG" ]]; then - echo "Error: Could not find previous version before $CURRENT_TAG" - exit 1 - fi - - echo "Found previous version: $PREVIOUS_TAG" - CURRENT_VERSION_RAW="$PREVIOUS_TAG" - - else - # If running from branch, get the latest released version - LATEST_TAG=$(get_tag_release -s) - - if [[ -z "$LATEST_TAG" ]]; then - echo "Error: No semantic version tags found in repository" - exit 1 - fi - - echo "Latest released version: $LATEST_TAG" - CURRENT_VERSION_RAW="$LATEST_TAG" - fi - fi - - # Remove 'v' prefix once at the end if present - if [[ "$CURRENT_VERSION_RAW" =~ ^v ]]; then - CURRENT_VERSION="${CURRENT_VERSION_RAW:1}" - else - CURRENT_VERSION="$CURRENT_VERSION_RAW" - fi - - echo "version_without_prefix=$CURRENT_VERSION" >> $GITHUB_OUTPUT - echo "Final current version (without prefix): $CURRENT_VERSION" - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '22.14.0' - registry-url: 'https://registry.npmjs.org' - - name: Update npm for trusted publishing - run: npm install --global npm@11.5.1 - - name: Bump file versions (temporarily for Web UI publish) - if: github.event.inputs.custom_version != '' - env: - CUSTOM_VERSION: ${{ github.event.inputs.custom_version }} - run: | - # Get current version from previous step - CURRENT_VERSION="${{ steps.get-current-version.outputs.version_without_prefix }}" - - # Normalize custom version (next version) by removing 'v' prefix if present - NEXT_VERSION="${CUSTOM_VERSION}" - if [[ "$NEXT_VERSION" =~ ^v ]]; then - NEXT_VERSION="${NEXT_VERSION:1}" - fi - - echo "Using current version: $CURRENT_VERSION" - echo "Using next version (custom): $NEXT_VERSION" - python ./infra/scripts/release/bump_file_versions.py ${CURRENT_VERSION} ${NEXT_VERSION} - - name: Install yarn dependencies - working-directory: ./ui - run: yarn install - - name: Build yarn rollup - working-directory: ./ui - run: yarn build:lib - - name: Publish UI package - working-directory: ./ui - if: github.event.inputs.publish_ui != 'false' - run: npm publish diff --git a/.github/workflows/registry-rest-api-tests.yml b/.github/workflows/registry-rest-api-tests.yml deleted file mode 100644 index 7862a396458..00000000000 --- a/.github/workflows/registry-rest-api-tests.yml +++ /dev/null @@ -1,171 +0,0 @@ -# .github/workflows/registry-rest-api-tests.yml -name: pr-rest-API-tests - -on: - push: - branches: - - main - pull_request: - types: - - opened - - synchronize - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - registry-rest-api-tests: - timeout-minutes: 30 - if: - ((github.event.action == 'labeled' && (github.event.label.name == 'approved' || github.event.label.name == 'lgtm' || github.event.label.name == 'ok-to-test')) || - (github.event.action != 'labeled' && (contains(github.event.pull_request.labels.*.name, 'ok-to-test') || contains(github.event.pull_request.labels.*.name, 'approved') || contains(github.event.pull_request.labels.*.name, 'lgtm')))) && - github.repository == 'feast-dev/feast' - runs-on: ubuntu-latest - - services: - kind: - # Specify the Kubernetes version - image: kindest/node:v1.30.6 - - env: - KIND_CLUSTER: "registry-rest-api-cluster" - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@v1.3.1 - with: - android: true - dotnet: true - haskell: true - large-packages: false - docker-images: false - swap-storage: false - tool-cache: false - - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version: 1.25.0 - - - name: Create KIND cluster - run: | - cat <> $GITHUB_PATH - - name: Install feast locally - run: make install-feast-locally - - name: Run Go tests with coverage - run: | - CGO_ENABLED=1 go test \ - -coverprofile=go/coverage.out \ - -covermode=atomic \ - -skip "TestGetOnlineFeatures|TestSqliteOnlineRead" \ - ./go/... - - name: Upload Go coverage to Codecov - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 - with: - file: ./go/coverage.out - flags: go-feature-server - fail_ci_if_error: false - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - - unit-test-ui: - runs-on: ubuntu-latest - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version-file: './ui/.nvmrc' - registry-url: 'https://registry.npmjs.org' - cache: 'yarn' - cache-dependency-path: 'ui/yarn.lock' - - name: Install yarn dependencies - working-directory: ./ui - run: yarn install - - name: Check code formatting - working-directory: ./ui - run: yarn format:check - - name: Build yarn rollup - working-directory: ./ui - run: yarn build:lib - - name: Build production UI - working-directory: ./ui - run: CI=true npm run build --omit=dev - - name: Run yarn tests - working-directory: ./ui - run: yarn test --watchAll=false diff --git a/.github/workflows/update_stable_branch.yml b/.github/workflows/update_stable_branch.yml deleted file mode 100644 index b09af9cc2eb..00000000000 --- a/.github/workflows/update_stable_branch.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Update Stable Branch - -on: - workflow_dispatch: - inputs: - token: - description: 'GitHub token to authenticate' - required: true - type: string - -jobs: - update_stable_branch: - name: Update Stable Branch after release - runs-on: ubuntu-latest - env: - GITHUB_TOKEN: ${{ github.event.inputs.token }} - GIT_AUTHOR_NAME: feast-ci-bot - GIT_AUTHOR_EMAIL: feast-ci-bot@willem.co - GIT_COMMITTER_NAME: feast-ci-bot - GIT_COMMITTER_EMAIL: feast-ci-bot@willem.co - GITHUB_REPOSITORY: ${{ github.repository }} - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Set up Git credentials - run: | - git config --global user.name "$GIT_AUTHOR_NAME" - git config --global user.email "$GIT_AUTHOR_EMAIL" - git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY} - - - name: Fetch all branches - run: git fetch --all - - - name: Reset stable branch to match release branch - run: | - git checkout -B stable origin/${GITHUB_REF#refs/heads/} - git push origin stable --force