Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
159 changes: 159 additions & 0 deletions .github/workflows/single_branch_test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
name: GLuaTest Single Branch Runner

on:
workflow_dispatch:
inputs:
branch:
description: 'Run all branches regardless of the last build version'
required: false
type: string
default: "public"

permissions:
actions: read
contents: write

jobs:
run_tests:
name: Run Tests on ${{ inputs.branch }}
uses: CFC-Servers/GLuaTest/.github/workflows/run_tests.yml@main
with:
collection: 3460542547
map: gm_glua_tests
branch: ${{ inputs.branch }}
logs-as-artifact: true
extra-startup-args: "-maxplayers 64"

summarize_failures:
name: Summarize Failures
needs: run_tests
if: always() && (needs.run_tests.result == 'failure')
runs-on: ubuntu-latest
outputs:
failure_summary: ${{ steps.process_logs.outputs.failure_summary }}
failed_branches_count: ${{ steps.process_logs.outputs.failed_branches_count }}

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Get Failed Job Info
id: get_failed_jobs
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
run: |
failed_jobs_info=$(gh api /repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/jobs -q '.jobs[] | select(.name | startswith("Run Tests on ")) | select(.conclusion=="failure" or .conclusion=="cancelled") | {name: .name, conclusion: .conclusion}' | jq -s .)
echo "Failed jobs info: $failed_jobs_info"

echo "failed_jobs_json<<EOF" >> $GITHUB_OUTPUT
echo "$failed_jobs_info" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT

- name: Get all GLuaTest artifacts
uses: actions/download-artifact@v4
with:
path: ./downloaded_logs

- name: Download Logs and Process Failures
id: process_logs
shell: bash
run: |
failed_jobs_json='${{ steps.get_failed_jobs.outputs.failed_jobs_json }}'

echo "Raw failed jobs JSON from output: $failed_jobs_json"

summary_output=""
count=0
failed_branches_list="" # Keep track for count output

mkdir -p ./downloaded_logs

echo "Processing failed jobs:"

while IFS= read -r job_json; do
job_name=$(echo "$job_json" | jq -r '.name')
echo "job_name: $job_name"
job_conclusion=$(echo "$job_json" | jq -r '.conclusion')
echo "job_conclusion: $job_conclusion"

branch_name=$(echo "$job_name" | sed 's/Run Tests on //g')
branch_name=$(echo "$branch_name" | sed 's/ \/ Run tests//g')
echo "branch_name: $branch_name"

artifact_name="gluatest-log-${branch_name}"
echo "artifact_name: $artifact_name"

log_file_path="./downloaded_logs/${artifact_name}/${artifact_name}.log"
echo "log_file_path: $log_file_path"

if [[ -f "$log_file_path" ]]; then
echo "Parsing log file: $log_file_path"
filtered_failures=$(cat "$log_file_path" | python .github/tools/parse_test_failures.py)
echo "Parsed:"
echo "$filtered_failures"

summary_output+="\n## Branch: \`$branch_name\` _(${job_conclusion})_\n"
echo "Summary output:"
echo "$summary_output"

if [[ -n "$filtered_failures" ]]; then
echo "has filtered failures"
summary_output+=" \`\`\`\n${filtered_failures}\n\`\`\`"
else
echo "does not have filtered failures"
summary_output+=" \`\`\`\nJob finished with status '${job_conclusion}', but no specific test failure summary found matching pattern in log.\n\`\`\`"
fi

echo "new summary output:"
echo "$summary_output"
else
echo "Warning: Log file '$log_file_path' not found"
summary_output+="\n## Branch: \`$branch_name\` _(${job_conclusion})_\n \`\`\`\nLog file '$log_file_path' not found\n\`\`\`"
fi

echo "done with the parsing"

if [[ $count -gt 0 ]]; then
failed_branches_list="$failed_branches_list,"
fi
failed_branches_list="$failed_branches_list$branch_name"
count=$((count + 1))

echo "failed branches list: $failed_branches_list"
echo "new count: $count"

done < <(echo "$failed_jobs_json" | jq -c '.[]')

echo "failure_summary<<EOF" >> $GITHUB_OUTPUT
printf "%b" "$summary_output" >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT

echo "failed_branches_count=$count" >> $GITHUB_OUTPUT

echo "--- Start Content of GITHUB_OUTPUT ---"
cat -A $GITHUB_OUTPUT || echo "GITHUB_OUTPUT not found or cat failed"
echo "--- End Content of GITHUB_OUTPUT ---"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


report_failure:
name: Report Failure to Discord
needs: [run_tests, summarize_failures]
if: always() && needs.run_tests.result == 'failure' && needs.summarize_failures.outputs.failed_branches_count > 0
runs-on: ubuntu-latest

steps:
- name: Send Discord Notification
uses: tsickert/discord-webhook@v7.0.0
with:
webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
wait: true
embed-title: "❌ GLuaTest Branch Runner Failed"
embed-color: 15548997 # Red
embed-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
embed-description: |
## One or more tests failed or were cancelled.
${{ needs.summarize_failures.outputs.failure_summary }}