API Test #33
Workflow file for this run
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: API Test | |
on: | |
workflow_call: | |
inputs: | |
environment: | |
type: string | |
required: true | |
description: "where to test" | |
workflow_dispatch: | |
inputs: | |
environment: | |
type: choice | |
required: true | |
description: "where to test" | |
default: "tools" | |
options: | |
- tools | |
- production | |
repository_dispatch: | |
types: | |
- webhook | |
jobs: | |
define-test-matrix: | |
runs-on: ubuntu-latest | |
environment: ${{ inputs.environment }} | |
outputs: | |
tests: ${{ steps.tests.outputs.tests }} | |
steps: | |
- uses: actions/checkout@v4 | |
- id: tests | |
working-directory: bin/si-api-test/tests | |
run: | | |
# Find .ts files, remove ./ prefix, and format as JSON array | |
files=$(find "." -mindepth 1 -maxdepth 1 -type f -name "*.ts" | sed -r "s/\.\/(.*)\.ts/\1/" | sort) | |
# Get the number of tests | |
test_count=$(echo "$files" | wc -l) | |
# Get the list of workspace IDs from the environment variable | |
workspace_ids="${{ vars.API_TEST_WORKSPACE_IDS }}" | |
echo "workspace_ids found to be $workspace_ids" | |
workspace_count=$(echo "$workspace_ids" | tr ',' '\n' | wc -l) | |
# Validate that the number of workspace IDs matches the number of tests | |
if [ "$test_count" -ne "$workspace_count" ]; then | |
echo "Error: The number of workspace IDs ($workspace_count) does not match the number of tests ($test_count)." | |
exit 1 | |
fi | |
# Format files as JSON array with correct numbering and sorted order | |
indexed_files=$(echo "$files" | awk '{print "{\"name\": \"" $0 "\", \"index\": " NR-1 "}"}' | jq -s .) | |
# Ensure indexed_files are formatted correctly | |
test_output=$(echo "$indexed_files" | jq -c '.') | |
echo "tests=$test_output" >> "$GITHUB_OUTPUT" | |
echo "$test_output" | |
api-test: | |
name: API Test SDF | |
environment: ${{ inputs.environment }} | |
runs-on: ubuntu-latest | |
needs: define-test-matrix | |
strategy: | |
fail-fast: false | |
matrix: | |
tests: ${{ fromJSON(needs.define-test-matrix.outputs.tests) }} | |
env: | |
SDF_API_URL: ${{ vars.SDF_API_URL }} | |
AUTH_API_URL: ${{ vars.AUTH_API_URL }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Install Deno | |
uses: denoland/setup-deno@v1 | |
with: | |
deno-version: v1.x | |
- name: Run the deno exec with retry | |
run: | | |
cd bin/si-api-test | |
echo "Running test ${{ matrix.tests.name }} with index: ${{ matrix.tests.index }}" | |
# Split the workspace IDs into an array | |
workspace_ids="${{ vars.API_TEST_WORKSPACE_IDS }}" | |
IFS=',' read -r -a workspace_array <<< "$workspace_ids" | |
# Pick the correct workspace ID based on the index | |
workspace_id=${workspace_array[${{ matrix.tests.index }}]} | |
echo "Using workspace ID: $workspace_id" | |
# Retry loop with 3 attempts | |
n=0 | |
max_retries=3 | |
until [ $n -ge $max_retries ] | |
do | |
unset exit_code || echo "exit_code not set" | |
# Run the deno task and store exit code in a variable | |
deno task run \ | |
--workspaceId "$workspace_id" \ | |
--userId ${{ secrets.API_TEST_EMAIL }} \ | |
--password ${{ secrets.API_TEST_PASSWORD }} \ | |
--tests ${{ matrix.tests.name }} || exit_code=$? | |
# Check the exit code | |
if [ -z "$exit_code" ]; then | |
echo "Deno task succeeded!" | |
break | |
fi | |
n=$((n+1)) | |
echo "Attempt $n/$max_retries failed with exit code $exit_code! Retrying..." | |
done | |
if [ $n -ge $max_retries ]; then | |
echo "All $max_retries attempts failed." | |
exit 1 | |
fi | |
on-failure: | |
runs-on: ubuntu-latest | |
needs: api-test | |
if: ${{ failure() && github.ref == 'refs/heads/main' }} | |
steps: | |
- run: | | |
curl --location "${{ secrets.FIREHYDRANT_WEBHOOK_URL }}" \ | |
--header "Content-Type: application/json" \ | |
--data "{ | |
\"summary\": \"API ${{ inputs.environment }} Tests Fail\", | |
\"body\": \"API Tests have failed for ${{ inputs.environment }}.\", | |
\"links\": [ | |
{ | |
\"href\": \"https://github.com/systeminit/si/actions/runs/$GITHUB_RUN_ID\", | |
\"text\": \"E2E Test Run ${{ inputs.environment }}\" | |
} | |
], | |
\"tags\": [ | |
\"service:github\" | |
] | |
}" | |
- run: | | |
curl -X POST \ | |
--header 'Content-type: application/json' \ | |
--data "{\"text\": \":si: Failed API Tests for ${{ inputs.environment }}: <https://github.com/systeminit/si/actions/runs/$GITHUB_RUN_ID|:test_tube: Link>\"}" \ | |
${{ secrets.SLACK_WEBHOOK_URL }} |