Truss Examples CI #492
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }} |