Skip to content

Workspace Integration #18

Workspace Integration

Workspace Integration #18

Workflow file for this run

name: Workspace Integration
on:
pull_request:
branches: [main]
schedule:
# 08:00 UTC nightly
- cron: "0 8 * * *"
workflow_dispatch:
inputs:
override_repo:
description: "Sibling repo name to pin to a specific sha (optional)"
required: false
override_sha:
description: "Commit sha for the override_repo (optional)"
required: false
repository_dispatch:
types: [sibling-updated]
concurrency:
group: integration-${{ github.ref }}
cancel-in-progress: false
jobs:
integration:
runs-on: ubuntu-latest
timeout-minutes: 45
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.12"]
steps:
- name: Checkout robot-code
uses: actions/checkout@v4
- name: Set up uv
uses: astral-sh/setup-uv@v5
with:
enable-cache: true
python-version: ${{ matrix.python-version }}
- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install -y libeigen3-dev
- name: Bootstrap siblings
env:
# While any sibling repo is still private, setup.sh needs auth to clone.
# Once all repos are public, GH_TOKEN can be removed.
GH_TOKEN: ${{ secrets.SIBLING_CHECKOUT_TOKEN || secrets.GITHUB_TOKEN }}
run: |
# Configure git to use the token for personalrobotics clones.
git config --global url."https://x-access-token:${GH_TOKEN}@github.com/personalrobotics/".insteadOf "https://github.com/personalrobotics/"
./setup.sh
- name: Override sibling at specific sha (dispatch)
if: github.event_name == 'repository_dispatch'
working-directory: ${{ github.event.client_payload.repo }}
run: |
git fetch origin "${{ github.event.client_payload.sha }}"
git checkout "${{ github.event.client_payload.sha }}"
- name: Override sibling at specific sha (manual)
if: github.event_name == 'workflow_dispatch' && inputs.override_repo != ''
working-directory: ${{ inputs.override_repo }}
run: |
git fetch origin "${{ inputs.override_sha }}"
git checkout "${{ inputs.override_sha }}"
- name: Re-sync after override
if: github.event_name == 'repository_dispatch' || (github.event_name == 'workflow_dispatch' && inputs.override_repo != '')
run: uv sync
- name: Per-sibling unit tests
run: |
set +e
fail=0
for d in asset_manager geodude geodude_assets mj_environment mj_manipulator mj_viser prl_assets pycbirrt tsr; do
if [ -d "$d/tests" ]; then
echo "::group::$d tests"
(cd "$d" && uv run pytest tests/ -q) || fail=1
echo "::endgroup::"
fi
done
exit $fail
- name: Cross-repo integration tests
run: uv run pytest tests/integration -v
- name: Import smoke check
run: |
uv run python -c "import asset_manager, geodude, geodude_assets, mj_environment, mj_manipulator, mj_viser, prl_assets, pycbirrt, tsr; print('all imports OK')"
notify-on-nightly-failure:
needs: integration
if: failure() && github.event_name == 'schedule'
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- uses: actions/github-script@v7
with:
script: |
const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: `Nightly integration failed (run ${context.runId})`,
body: `Nightly workspace-integration run failed.\n\nSee: ${runUrl}`,
labels: ["ci", "nightly-fail"],
});