name: "setup-python" description: "Ensures to install a python version that's available on Anaconda" inputs: python-version: description: "The python version to install. If unspecified, install the minimum python version mlflow supports." required: false pin-micro-version: description: "Whether to pin to a specific micro version for Anaconda compatibility. Set to false for workflows that don't need conda/pyenv to hit the runner's pre-installed Python cache and avoid a ~9s download." required: false default: "true" outputs: python-version: description: "The installed python version" value: ${{ steps.get-python-version.outputs.version }} runs: using: "composite" steps: - name: get-python-version id: get-python-version shell: bash # We used to use `conda search python=3.x` to dynamically fetch the latest available version # in 3.x on Anaconda, but it turned out `conda search` is very slow (takes 40 ~ 50 seconds). # This overhead sums up to a significant amount of delay in the cross version tests # where we trigger more than 100 GitHub Actions runs. env: PYTHON_VERSION_INPUT: ${{ inputs.python-version }} PIN_MICRO_VERSION: ${{ inputs.pin-micro-version }} run: | python_version="$PYTHON_VERSION_INPUT" if [ -z "$python_version" ]; then python_version=$(cat .python-version) fi if [[ "$PIN_MICRO_VERSION" == "true" ]]; then if [[ "$python_version" == "3.10" ]]; then if [ "$RUNNER_OS" == "Linux" ]; then python_version="3.10.20" else python_version="3.10.11" fi elif [[ "$python_version" == "3.11" ]]; then if [ "$RUNNER_OS" == "Windows" ]; then python_version="3.11.9" else python_version="3.11.15" fi elif [[ "$python_version" == "3.12" ]]; then if [ "$RUNNER_OS" == "Windows" ]; then python_version="3.12.10" else python_version="3.12.13" fi else echo "Invalid python version: '$python_version'. Must be '3.10', '3.11', or '3.12'." exit 1 fi fi echo "version=$python_version" >> $GITHUB_OUTPUT - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ steps.get-python-version.outputs.version }} - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 with: version: "0.11.14" # Caching disabled to avoid cache-poisoning exposure across CI workflows. enable-cache: false - run: | # The default `first-index` strategy is too strict. Use `unsafe-first-match` instead. # https://docs.astral.sh/uv/configuration/environment/#uv_index_strategy echo "UV_INDEX_STRATEGY=unsafe-first-match" >> $GITHUB_ENV # Disable progress bars and spinners to reduce CI log clutter # https://docs.astral.sh/uv/reference/environment/#uv_no_progress echo "UV_NO_PROGRESS=1" >> $GITHUB_ENV # Exclude packages newer than 7 days to guard against supply chain attacks # https://docs.astral.sh/uv/reference/environment/#uv_exclude_newer echo "UV_EXCLUDE_NEWER=P7D" >> $GITHUB_ENV # Disable Hugging Face download progress bars to reduce CI log clutter # https://huggingface.co/docs/huggingface_hub/package_reference/environment_variables#hfhubdisableprogressbars echo "HF_HUB_DISABLE_PROGRESS_BARS=1" >> $GITHUB_ENV shell: bash