Skip to content

MLOS Linux

MLOS Linux #4161

Workflow file for this run

name: MLOS Linux
on:
workflow_dispatch:
inputs:
tags:
description: Manual MLOS Linux run
push:
branches: [ main ]
pull_request:
branches: [ main ]
merge_group:
types: [checks_requested]
schedule:
- cron: "1 0 * * *"
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
cancel-in-progress: true
jobs:
LinuxCondaBuildTest:
name: Linux Build/Test with Conda
runs-on: ubuntu-latest
permissions:
contents: read
# Test multiple versions of python.
strategy:
fail-fast: false
matrix:
python_version:
# Empty string is the floating most recent version of python
# (useful to catch new compatibility issues in nightly builds)
- ""
- "3.8"
- "3.9"
- "3.10"
- "3.11"
- "3.12"
- "3.13"
env:
cache_cur_date: unset
cache_cur_hour: unset
cache_prev_hour: unset
CONDA_ENV_NAME: unset
# See notes about $CONDA below.
CONDA_DIR: unset
# When parallel jobs are used, group the output to make debugging easier.
MAKEFLAGS: -Oline
steps:
- uses: actions/checkout@v4
- uses: conda-incubator/setup-miniconda@v3
- name: Set cache timestamp variables
id: set_cache_vars
run: |
set -x
if [ -z "${{ matrix.python_version }}" ]; then
CONDA_ENV_NAME=mlos
else
CONDA_ENV_NAME="mlos-${{ matrix.python_version }}"
fi
echo "CONDA_ENV_NAME=$CONDA_ENV_NAME" >> $GITHUB_ENV
echo "cache_cur_date=$(date -u +%Y-%m-%d)" >> $GITHUB_ENV
echo "cache_cur_hour=$(date -u +%H)" >> $GITHUB_ENV
echo "cache_prev_hour=$(date -u -d'1 hour ago' +%H)" >> $GITHUB_ENV
# $CONDA should be set by the setup-miniconda action.
# We set a separate environment variable to allow the dependabot tool
# to parse this file since it expects all env vars to be declared above.
echo "CONDA_DIR=$CONDA" >> $GITHUB_ENV
echo "PIP_CACHE_DIR=$(conda run -n base pip cache dir)" >> $GITHUB_ENV
#- name: Restore cached conda environment
- name: Restore cached conda packages
id: restore-conda-cache
if: ${{ github.event_name != 'schedule' }}
uses: actions/cache@v4
with:
#path: ${{ env.CONDA_DIR }}/envs/${{ env.CONDA_ENV_NAME }}
path: ${{ env.CONDA_DIR }}/pkgs
key: conda-${{ runner.os }}-${{ env.CONDA_ENV_NAME }}-${{ hashFiles('conda-envs/${{ env.CONDA_ENV_NAME }}.yml') }}-${{ hashFiles('mlos_*/pyproject.toml') }}-${{ hashFiles('mlos_*/setup.py') }}-${{ env.cache_cur_date }}-${{ env.cache_cur_hour }}
restore-keys: |
conda-${{ runner.os }}-${{ env.CONDA_ENV_NAME }}-${{ hashFiles('conda-envs/${{ env.CONDA_ENV_NAME }}.yml') }}-${{ hashFiles('mlos_*/pyproject.toml') }}-${{ hashFiles('mlos_*/setup.py') }}-${{ env.cache_cur_date }}-${{ env.cache_prev_hour }}
conda-${{ runner.os }}-${{ env.CONDA_ENV_NAME }}-${{ hashFiles('conda-envs/${{ env.CONDA_ENV_NAME }}.yml') }}-${{ hashFiles('mlos_*/pyproject.toml') }}-${{ hashFiles('mlos_*/setup.py') }}-${{ env.cache_cur_date }}
- name: Restore cached pip packages
id: restore-pip-cache
if: ${{ github.event_name != 'schedule' }}
uses: actions/cache@v4
with:
path: ${{ env.PIP_CACHE_DIR }}
key: conda-${{ runner.os }}-${{ env.CONDA_ENV_NAME }}-${{ hashFiles('conda-envs/${{ env.CONDA_ENV_NAME }}.yml') }}-${{ hashFiles('mlos_*/pyproject.toml') }}-${{ hashFiles('mlos_*/setup.py') }}-${{ env.cache_cur_date }}-${{ env.cache_cur_hour }}
restore-keys: |
conda-${{ runner.os }}-${{ env.CONDA_ENV_NAME }}-${{ hashFiles('conda-envs/${{ env.CONDA_ENV_NAME }}.yml') }}-${{ hashFiles('mlos_*/pyproject.toml') }}-${{ hashFiles('mlos_*/setup.py') }}-${{ env.cache_cur_date }}-${{ env.cache_prev_hour }}
conda-${{ runner.os }}-${{ env.CONDA_ENV_NAME }}-${{ hashFiles('conda-envs/${{ env.CONDA_ENV_NAME }}.yml') }}-${{ hashFiles('mlos_*/pyproject.toml') }}-${{ hashFiles('mlos_*/setup.py') }}-${{ env.cache_cur_date }}
- name: Log some environment variables for debugging
run: |
set -x
printenv
echo "cache_cur_date: $cache_cur_date"
echo "cache_cur_hour: $cache_cur_hour"
echo "cache_prev_hour: $cache_prev_hour"
echo "cache-hit: ${{ steps.restore-conda-cache.outputs.cache-hit }}"
- name: Update and configure conda
run: |
set -x
conda config --set channel_priority strict
conda update -v -y -n base -c defaults --all
# Try and speed up the pipeline by using a faster solver:
- name: Install and default to mamba solver
run: |
set -x
conda install -v -y -n base conda-libmamba-solver
# Try to set either of the configs for the solver.
conda config --set experimental_solver libmamba || true
conda config --set solver libmamba || true
echo "CONDA_EXPERIMENTAL_SOLVER=libmamba" >> $GITHUB_ENV
echo "EXPERIMENTAL_SOLVER=libmamba" >> $GITHUB_ENV
- name: Create/update mlos conda environment
run: make CONDA_ENV_NAME=$CONDA_ENV_NAME CONDA_INFO_LEVEL=-v conda-env
- name: Log conda info
run: |
conda info
conda config --show
conda config --show-sources
conda list -n $CONDA_ENV_NAME
ls -l $CONDA_DIR/envs/$CONDA_ENV_NAME/lib/python*/site-packages/
conda run -n $CONDA_ENV_NAME pip cache dir
conda run -n $CONDA_ENV_NAME pip cache info
- name: Verify expected version of python in conda env
if: ${{ matrix.python_version == '' }}
timeout-minutes: 2
run: |
set -x
conda run -n mlos python -c \
'from sys import version_info as vers; assert (vers.major, vers.minor) == (3, 13), f"Unexpected python version: {vers}"'
# This is moreso about code cleanliness, which is a dev thing, not a
# functionality thing, and the rules for that change between python versions,
# so only do this for the default in the devcontainer.
#- name: Run lint checks
# run: make CONDA_ENV_NAME=$CONDA_ENV_NAME check
# Only run the coverage checks on the devcontainer job.
- name: Run tests
run: make CONDA_ENV_NAME=$CONDA_ENV_NAME SKIP_COVERAGE=true test
- name: Generate and test binary distribution files
run: make CONDA_ENV_NAME=$CONDA_ENV_NAME CONDA_INFO_LEVEL=-v dist dist-test