Skip to content

Integration test

Integration test #327

name: Integration test
on:
schedule:
- cron: "0 0 * * *" # Run daily at midnight UTC
push:
branches: [main]
pull_request:
branches: [main]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
test:
strategy:
fail-fast: false
matrix:
python: ["3.11", "3.12"]
package:
# extras should be a comma seperated list of strings, like `extras: "lazy,accelerated"`
# The 'test' extra is always installed
- {name: "mudata", extras: ""}
- {name: "spatialdata", extras: ""}
- {name: "scirpy", extras: ""}
- {name: "muon", extras: ""}
- {name: "scanpy", extras: ""}
- {name: "squidpy", extras: ""}
- {name: "scvi-tools", extras: ""}
- {name: "pertpy", extras: "de"}
- {name: "decoupler", extras: ""}
defaults:
run:
shell: bash -el {0}
runs-on: ubuntu-latest
env:
# This env variable is used by the `gh` CLI
GH_TOKEN: ${{ secrets.TOKEN_FOR_ISSUE_WRITE }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
filter: blob:none
path: integration-testing
- uses: actions/checkout@v4
with:
repository: scverse/${{ matrix.package.name }}
fetch-depth: 0
filter: blob:none
path: ${{ matrix.package.name }}
- name: Install Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python }}
- name: Install UV
uses: hynek/setup-cached-uv@v2
- name: Install AnnData and scverse package
run: |
EXTRAS="test"
if [ -n "${{ matrix.package.extras }}" ]; then
EXTRAS="$EXTRAS,${{ matrix.package.extras }}"
fi
uv pip install --compile --system ".[$EXTRAS]" git+https://github.com/scverse/anndata -c ../integration-testing/constraints.txt -v
working-directory: ${{ matrix.package.name }}
- name: Set failure type for install
if: failure()
run: |
echo "Installation failed for ${{ matrix.package.name }}"
echo "failure_type=install" >> $GITHUB_ENV
- name: Env list
run: uv pip freeze
- name: Run test
run: |
pytest
working-directory: ${{ matrix.package.name }}
- name: Set failure type for test
if: failure() && env.failure_type != 'install'
run: |
echo "Test failed for ${{ matrix.package.name }}"
echo "failure_type=test" >> $GITHUB_ENV
- name: Check for open failure issue
if: failure() && github.event_name == 'schedule'
id: find_issue
run: |
ISSUE_TITLE="Integration Testing CI ${failure_type^} Failure on python ${{ matrix.python }}"
echo "Checking for existing issue: $ISSUE_TITLE"
ISSUE_COUNT=$(gh issue list --repo scverse/${{ matrix.package.name }} --state open --search "${ISSUE_TITLE}" --json number --jq 'length')
if [[ "$ISSUE_COUNT" -gt 0 ]]; then
echo "${failure_type^} failure issue already exists for today."
echo "issue_exists=true" >> $GITHUB_ENV
else
echo "issue_exists=false" >> $GITHUB_ENV
echo "issue_title=$ISSUE_TITLE" >> $GITHUB_ENV
fi
- name: Report failure issue
if: failure() && env.issue_exists == 'false' && github.event_name == 'schedule'
run: |
RUN_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
ISSUE_BODY="The daily CI failed on ${failure_type} for ${{ matrix.package.name }} failed. Please go to [the logs of the integration testing repo](${RUN_URL}) to review. @scverse/anndata"
gh issue create --repo scverse/${{ matrix.package.name }} --title "${{ env.issue_title }}" --body "${ISSUE_BODY}"
keepalive-job:
name: Keepalive Workflow
runs-on: ubuntu-latest
permissions:
actions: write
steps:
- name: Re-enable workflow
env:
GITHUB_TOKEN: ${{ inputs.GITHUB_TOKEN || github.token }}
shell: sh
run: |
gh api --verbose -X PUT "repos/${GITHUB_REPOSITORY}/actions/workflows/integration-test.yml/enable"