mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-12-22 23:22:25 +00:00
# What does this PR do?
Various fixes to integration test recording + stainless calling of
integration tests:
1. only the library client was being run, they all should be
2. the git check grabs diffs like:
M tests/integration/client-typescript/package-lock.json
M tests/integration/client-typescript/package.json
it should not
additionally:
Fixes rebase conflicts when stainless workflow runs integration tests
with
record-if-missing mode on PRs. Previously, the workflow would:
1. Commit all files in tests/integration/ (including non-recordings)
2. Try to rebase and push to 'main' instead of the PR branch
3. Fail with merge conflicts on PR-specific changes
Changes:
- Add pr_head_ref and is_fork_pr parameters flowing through workflow
chain
- Use target-branch input instead of github.ref_name in recording
commits
- Detect and handle fork PRs by skipping push and uploading recordings
as artifacts
- Add 7-day artifact retention for fork PR recordings
- Support both workflow_call and direct pull_request trigger contexts
For same-repo PRs: recordings now commit/push to the PR branch correctly
For fork PRs: recordings upload as downloadable artifacts with
instructions
you can see a failing workflow:
5846590613
with the rebase issues.
---------
Signed-off-by: Charlie Doern <cdoern@redhat.com>
137 lines
5.1 KiB
YAML
137 lines
5.1 KiB
YAML
name: 'Run and Record Tests'
|
|
description: 'Run integration tests and handle recording/artifact upload'
|
|
|
|
inputs:
|
|
stack-config:
|
|
description: 'Stack configuration to use'
|
|
required: true
|
|
setup:
|
|
description: 'Setup to use for tests (e.g., ollama, gpt, vllm)'
|
|
required: false
|
|
default: ''
|
|
inference-mode:
|
|
description: 'Inference mode (record or replay)'
|
|
required: true
|
|
suite:
|
|
description: 'Test suite to use: base, responses, vision, etc.'
|
|
required: false
|
|
default: ''
|
|
subdirs:
|
|
description: 'Comma-separated list of test subdirectories to run; overrides suite'
|
|
required: false
|
|
default: ''
|
|
pattern:
|
|
description: 'Regex pattern to pass to pytest -k'
|
|
required: false
|
|
default: ''
|
|
target-branch:
|
|
description: 'Target branch for recording commits (for PRs, use the PR head branch)'
|
|
required: false
|
|
default: ''
|
|
is-fork-pr:
|
|
description: 'Whether this is a fork PR (recordings cannot be pushed to forks)'
|
|
required: false
|
|
default: 'false'
|
|
|
|
runs:
|
|
using: 'composite'
|
|
steps:
|
|
- name: Check Storage and Memory Available Before Tests
|
|
if: ${{ always() }}
|
|
shell: bash
|
|
run: |
|
|
free -h
|
|
df -h
|
|
|
|
- name: Run Integration Tests
|
|
shell: bash
|
|
run: |
|
|
SCRIPT_ARGS="--stack-config ${{ inputs.stack-config }} --inference-mode ${{ inputs.inference-mode }}"
|
|
|
|
# Add optional arguments only if they are provided
|
|
if [ -n '${{ inputs.setup }}' ]; then
|
|
SCRIPT_ARGS="$SCRIPT_ARGS --setup ${{ inputs.setup }}"
|
|
fi
|
|
if [ -n '${{ inputs.suite }}' ]; then
|
|
SCRIPT_ARGS="$SCRIPT_ARGS --suite ${{ inputs.suite }}"
|
|
fi
|
|
if [ -n '${{ inputs.subdirs }}' ]; then
|
|
SCRIPT_ARGS="$SCRIPT_ARGS --subdirs ${{ inputs.subdirs }}"
|
|
fi
|
|
if [ -n '${{ inputs.pattern }}' ]; then
|
|
SCRIPT_ARGS="$SCRIPT_ARGS --pattern ${{ inputs.pattern }}"
|
|
fi
|
|
|
|
echo "=== Running command ==="
|
|
echo "uv run --no-sync ./scripts/integration-tests.sh $SCRIPT_ARGS"
|
|
echo ""
|
|
|
|
uv run --no-sync ./scripts/integration-tests.sh $SCRIPT_ARGS | tee pytest-${{ inputs.inference-mode }}.log
|
|
|
|
|
|
- name: Commit and push recordings
|
|
if: ${{ inputs.inference-mode == 'record' || inputs.inference-mode == 'record-if-missing' }}
|
|
shell: bash
|
|
run: |
|
|
echo "Checking for recording changes"
|
|
git status --porcelain tests/integration/recordings/ tests/integration/*/recordings/
|
|
|
|
if [[ -n $(git status --porcelain tests/integration/recordings/ tests/integration/*/recordings/) ]]; then
|
|
echo "New recordings detected"
|
|
|
|
# Determine target branch: use target-branch input if provided, otherwise use current branch
|
|
TARGET_BRANCH="${{ inputs.target-branch }}"
|
|
if [ -z "$TARGET_BRANCH" ]; then
|
|
TARGET_BRANCH="${{ github.ref_name }}"
|
|
fi
|
|
echo "Target branch: $TARGET_BRANCH"
|
|
|
|
# Check if this is a fork PR
|
|
if [ "${{ inputs.is-fork-pr }}" = "true" ]; then
|
|
echo "::warning::This is a fork PR. Recordings were updated locally but cannot be pushed to the fork."
|
|
echo "::warning::Please download the workflow artifacts and commit the recordings manually."
|
|
else
|
|
echo "Committing and pushing recordings to branch: $TARGET_BRANCH"
|
|
git add tests/integration/recordings/ tests/integration/*/recordings/
|
|
|
|
git commit -m "Recordings update from CI (setup: ${{ inputs.setup }}, suite: ${{ inputs.suite }})"
|
|
|
|
git fetch origin "$TARGET_BRANCH"
|
|
git rebase "origin/$TARGET_BRANCH"
|
|
echo "Rebased successfully"
|
|
git push origin "HEAD:$TARGET_BRANCH"
|
|
echo "Pushed successfully to $TARGET_BRANCH"
|
|
fi
|
|
else
|
|
echo "No recording changes"
|
|
fi
|
|
|
|
- name: Upload recordings (for fork PRs)
|
|
if: ${{ inputs.is-fork-pr == 'true' && (inputs.inference-mode == 'record' || inputs.inference-mode == 'record-if-missing') }}
|
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
with:
|
|
name: recordings-${{ github.run_id }}-${{ github.run_attempt || '1' }}-${{ strategy.job-index || github.job }}
|
|
path: |
|
|
tests/integration/recordings/
|
|
tests/integration/*/recordings/
|
|
retention-days: 7
|
|
if-no-files-found: ignore
|
|
|
|
- name: Write docker logs to file
|
|
if: ${{ always() }}
|
|
shell: bash
|
|
run: |
|
|
# Ollama logs (if ollama container exists)
|
|
sudo docker logs ollama > ollama-${{ inputs.inference-mode }}.log 2>&1 || true
|
|
# vllm logs (if vllm container exists)
|
|
sudo docker logs vllm > vllm-${{ inputs.inference-mode }}.log 2>&1 || true
|
|
# Note: distro container logs are now dumped in integration-tests.sh before container is removed
|
|
|
|
- name: Upload logs
|
|
if: ${{ always() }}
|
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
with:
|
|
name: logs-${{ github.run_id }}-${{ github.run_attempt || '1' }}-${{ strategy.job-index || github.job }}-${{ github.action }}
|
|
path: |
|
|
*.log
|
|
retention-days: 1
|