Cross version tests #443
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Cross version tests | |
on: | |
pull_request: | |
types: | |
- opened | |
- synchronize | |
- reopened | |
- ready_for_review | |
workflow_dispatch: | |
inputs: | |
repository: | |
description: > | |
[Optional] Repository name with owner. For example, mlflow/mlflow. | |
Defaults to the repository that triggered a workflow. | |
required: false | |
default: "" | |
ref: | |
description: > | |
[Optional] The branch, tag or SHA to checkout. When checking out the repository that | |
triggered a workflow, this defaults to the reference or SHA for that event. Otherwise, | |
uses the default branch. | |
required: false | |
default: "" | |
flavors: | |
description: "[Optional] Comma-separated string specifying which flavors to test (e.g. 'sklearn, xgboost'). If unspecified, all flavors are tested." | |
required: false | |
default: "" | |
versions: | |
description: "[Optional] Comma-separated string specifying which versions to test (e.g. '1.2.3, 4.5.6'). If unspecified, all versions are tested." | |
required: false | |
default: "" | |
schedule: | |
# Run this workflow daily at 13:00 UTC | |
- cron: "0 13 * * *" | |
permissions: | |
contents: read | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }} | |
cancel-in-progress: true | |
defaults: | |
run: | |
shell: bash --noprofile --norc -exo pipefail {0} | |
env: | |
MLFLOW_HOME: /home/runner/work/mlflow/mlflow | |
PIP_EXTRA_INDEX_URL: https://download.pytorch.org/whl/cpu | |
jobs: | |
set-matrix: | |
runs-on: ubuntu-latest | |
timeout-minutes: 10 | |
if: github.event_name == 'workflow_dispatch' || (github.event_name == 'schedule' && github.repository == 'mlflow-automation/mlflow') || (github.event_name == 'pull_request' && github.event.pull_request.draft == false) | |
permissions: | |
issues: read # listLabelsOnIssue | |
outputs: | |
matrix: ${{ steps.set-matrix.outputs.matrix }} | |
is_matrix_empty: ${{ steps.set-matrix.outputs.is_matrix_empty }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
repository: ${{ github.event_name == 'schedule' && 'mlflow/mlflow' || github.event.inputs.repository }} | |
ref: ${{ github.event.inputs.ref }} | |
- uses: ./.github/actions/untracked | |
- uses: ./.github/actions/setup-python | |
- name: Install dependencies | |
run: | | |
pip install -r dev/requirements.txt | |
pip install pytest pytest-cov | |
- name: Check labels | |
uses: actions/github-script@v7 | |
id: check-labels | |
with: | |
script: | | |
if (context.eventName !== "pull_request") { | |
return { | |
enable_dev_tests: true, | |
only_latest: false, | |
}; | |
} | |
const labels = await github.rest.issues.listLabelsOnIssue({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: context.issue.number, | |
}); | |
const labelNames = labels.data.map(({ name }) => name); | |
return { | |
enable_dev_tests: labelNames.includes("enable-dev-tests"), | |
only_latest: labelNames.includes("only-latest"), | |
}; | |
- name: Test set_matrix.py | |
run: | | |
python -m pytest --noconftest dev/tests | |
- id: set-matrix | |
name: Set matrix | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
EVENT_NAME="${{ github.event_name }}" | |
if [ "$EVENT_NAME" = "pull_request" ]; then | |
REPO="${{ github.repository }}" | |
PR_NUMBER="${{ github.event.pull_request.number }}" | |
BASE_REF="${{ github.base_ref }}" | |
REF_VERSIONS_YAML="https://raw.githubusercontent.com/$REPO/$BASE_REF/mlflow/ml-package-versions.yml" | |
CHANGED_FILES="$(python dev/list_changed_files.py --repository $REPO --pr-num $PR_NUMBER)" | |
ENABLE_DEV_TESTS="${{ fromJson(steps.check-labels.outputs.result).enable_dev_tests }}" | |
NO_DEV_FLAG=$([ "$ENABLE_DEV_TESTS" == "true" ] && echo "" || echo "--no-dev") | |
ONLY_LATEST="${{ fromJson(steps.check-labels.outputs.result).only_latest }}" | |
ONLY_LATEST_FLAG=$([ "$ONLY_LATEST" == "true" ] && echo "--only-latest" || echo "") | |
python dev/set_matrix.py --ref-versions-yaml $REF_VERSIONS_YAML --changed-files "$CHANGED_FILES" $NO_DEV_FLAG $ONLY_LATEST_FLAG | |
elif [ "$EVENT_NAME" = "workflow_dispatch" ]; then | |
python dev/set_matrix.py --flavors "${{ github.event.inputs.flavors }}" --versions "${{ github.event.inputs.versions }}" | |
else | |
python dev/set_matrix.py | |
fi | |
test: | |
needs: set-matrix | |
if: ${{ needs.set-matrix.outputs.is_matrix_empty == 'false' }} | |
runs-on: ubuntu-latest | |
timeout-minutes: 120 | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJson(needs.set-matrix.outputs.matrix) }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
repository: ${{ github.event_name == 'schedule' && 'mlflow/mlflow' || github.event.inputs.repository }} | |
ref: ${{ github.event.inputs.ref }} | |
- uses: ./.github/actions/free-disk-space | |
if: matrix.package == 'transformers' || matrix.package == 'sentence-transformers' || (matrix.package == 'torch' && startsWith(matrix.version, '2.')) | |
- name: Get python version | |
id: get-python-version | |
run: | | |
python_version=$(python dev/get_minimum_required_python.py -p ${{ matrix.package }} -v ${{ matrix.version }} --python-versions "3.8,3.9") | |
echo "version=$python_version" >> $GITHUB_OUTPUT | |
- uses: ./.github/actions/setup-python | |
with: | |
python-version: ${{ steps.get-python-version.outputs.version }} | |
- uses: ./.github/actions/setup-pyenv | |
- name: Get Java version | |
id: get-java-version | |
run: | | |
if [ "${{ matrix.package }}" = "mleap" ] | |
then | |
pip install packaging | |
supports_java11=$(python -c "from packaging.version import parse; print(parse('${{ matrix.version }}') >= parse('0.21.0'))") | |
if [ "$supports_java11" = "True" ] | |
then | |
java_version=11 | |
else | |
java_version=8 | |
fi | |
elif [ "${{ matrix.package }}" = "pyspark" ]; then | |
pip install packaging | |
use_java17=$(python -c "from packaging.version import parse; print('${{ matrix.version }}' == 'dev' or parse('${{ matrix.version }}') > parse('3.4.1'))") | |
if [ "$use_java17" = "True" ]; then | |
java_version=17 | |
else | |
java_version=11 | |
fi | |
else | |
java_version=11 | |
fi | |
echo "version=$java_version" >> $GITHUB_OUTPUT | |
- uses: ./.github/actions/setup-java | |
with: | |
java-version: ${{ steps.get-java-version.outputs.version }} | |
distribution: "adopt" | |
- name: Install mlflow & test dependencies | |
run: | | |
python --version | |
# prophet==1.0.1 can only be installed `setup.py install` fallback but this was removed | |
# in pip 23.1. See https://github.com/pypa/pip/issues/8368 more details. | |
if [ "${{ matrix.package }}==${{ matrix.version }}" = "prophet==1.0.1" ] | |
then | |
PIP_SPEC="<23.1" | |
else | |
PIP_SPEC="" | |
fi | |
pip install -U "pip$PIP_SPEC" wheel | |
pip install -e .[extras] | |
pip install -r requirements/test-requirements.txt | |
- name: Install ${{ matrix.package }} ${{ matrix.version }} | |
run: | | |
${{ matrix.install }} | |
# temp workaround before langchain_community release the following PR in a new version | |
# https://github.com/langchain-ai/langchain/pull/15691 | |
if [ "${{ matrix.package }}/${{ matrix.category }}" = "langchain/autologging" ] | |
then | |
pip uninstall -y langchain_community | |
pip install git+https://github.com/hwchase17/langchain#subdirectory=libs/community | |
fi | |
- name: Install pydantic no-binary for langchain | |
if: matrix.package == 'langchain' && ( matrix.version == 'dev' || matrix.version >= '0.0.267') | |
run: | | |
pip uninstall pydantic -y | |
# 0.0.267 is the minimum version that supports Pydantic v2 | |
# We need to install from source because cythonized pydantic | |
# objects can't be serialized https://github.com/cloudpipe/cloudpickle/issues/408 | |
pip install pydantic --no-binary :all: | |
- name: Check package versions | |
run: | | |
python dev/show_package_release_dates.py | |
- name: Prefetch Transformer models | |
if: matrix.package == 'transformers' && matrix.category == 'models' | |
run: | | |
python tests/transformers/helper.py | |
- uses: ./.github/actions/pipdeptree | |
- name: Run tests | |
env: | |
MLFLOW_CONDA_HOME: /usr/share/miniconda | |
SPARK_LOCAL_IP: localhost | |
PACKAGE_VERSION: ${{ matrix.version }} | |
JOHNSNOWLABS_LICENSE_JSON: ${{ secrets.JOHNSNOWLABS_LICENSE_JSON }} | |
HF_HUB_ENABLE_HF_TRANSFER: 1 | |
run: | | |
${{ matrix.run }} |