Skip to content

Truss Examples CI

Truss Examples CI #492

Workflow file for this run

name: Truss Examples CI
on:
schedule:
# Runs daily at 6am UTC
- cron: '0 6 * * *'
workflow_dispatch:
jobs:
generate_tests:
runs-on: ubuntu-latest
outputs:
tests: ${{ steps.generate-matrix.outputs.tests }}
steps:
- uses: actions/checkout@v4
- name: yq - portable yaml processor
uses: mikefarah/[email protected]
- name: Generate all tests that need to be run
id: generate-matrix
run: |
TESTS=$(cat ci.yaml | yq e ".tests" | yq eval -o=json | jq -c .)
echo "tests=$TESTS" >> $GITHUB_OUTPUT
ci:
runs-on: ubuntu-latest
needs:
- generate_tests
strategy:
fail-fast: false
max-parallel: 3
matrix:
test: ${{ fromJSON(needs.generate_tests.outputs.tests) }}
steps:
- uses: actions/checkout@v4
- name: Set up Python environment
uses: actions/setup-python@v5
with:
python-version: '3.11.4'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install git+https://github.com/basetenlabs/truss.git requests tenacity --upgrade
- name: Sanitize test name
id: sanitize_test_name
run: |
SANITIZED_TEST_NAME=$(echo "${{ matrix.test }}" | tr -c '[:alnum:]_.-' '_')
echo "SANITIZED_TEST_NAME=$SANITIZED_TEST_NAME" >> $GITHUB_ENV
- name: Test => ${{ matrix.test }}
id: test_step
run: |
set -e
python ./bin/test_example.py ${{ secrets.BASETEN_API_KEY }} "${{ matrix.test }}"
- name: Record test result
if: always()
run: |
echo "${{ matrix.test }}: ${{ steps.test_step.outcome }}" > "${SANITIZED_TEST_NAME}_result.txt"
- name: Upload test result
if: always()
uses: actions/upload-artifact@v4
with:
name: test-result-${{ env.SANITIZED_TEST_NAME }}
path: "${SANITIZED_TEST_NAME}_result.txt"
report_to_slack:
runs-on: ubuntu-latest
if: always() #&& github.ref == 'refs/heads/main'
needs:
- ci
steps:
- name: Download test results
uses: actions/download-artifact@v4
with:
path: results
- name: Process test results
id: process_results
shell: bash
run: |
# Enable recursive globbing
shopt -s globstar
echo "Listing results directory:"
ls -R results
SUCCESS_COUNT=0
FAILURE_COUNT=0
FAILED_TESTS=""
for f in results/**/**/*.txt; do
if [ -f "$f" ]; then
echo "Processing file: $f"
RESULT=$(cat "$f")
TEST_NAME=$(echo "$RESULT" | cut -d':' -f1)
# Sanitize the test name for safety
TEST_NAME_SAFE=$(echo "$TEST_NAME" | tr -cd '[:alnum:]_./-')
STATUS=$(echo "$RESULT" | cut -d':' -f2 | tr -d '[:space:]')
if [ "$STATUS" == "success" ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
else
FAILURE_COUNT=$((FAILURE_COUNT + 1))
FAILED_TESTS="$FAILED_TESTS\\n$TEST_NAME_SAFE"
fi
fi
done
echo "success_count=$SUCCESS_COUNT" >> $GITHUB_OUTPUT
echo "failure_count=$FAILURE_COUNT" >> $GITHUB_OUTPUT
echo "failed_tests=${FAILED_TESTS#\\n}" >> $GITHUB_OUTPUT
- name: Generate Slack payload
id: generate_payload
shell: bash
run: |
COLOR="${{ needs.ci.result == 'failure' && 'danger' || 'good' }}"
TEXT="Truss Examples CI Result: ${{ needs.ci.result }}: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
TEXT="$TEXT\nSuccesses: ${{ steps.process_results.outputs.success_count }}\nFailures: ${{ steps.process_results.outputs.failure_count }}"
if [ "${{ steps.process_results.outputs.failure_count }}" -ne 0 ]; then
TEXT="$TEXT\nFailed tests:${{ steps.process_results.outputs.failed_tests }}"
fi
PAYLOAD=$(jq -n --arg color "$COLOR" --arg text "$TEXT" '{attachments: [{color: $color, text: $text}]}')
echo "payload=$PAYLOAD" >> $GITHUB_OUTPUT
- name: Show Slack status
uses: 8398a7/action-slack@v3
with:
status: custom
custom_payload: ${{ steps.generate_payload.outputs.payload }}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}