# Copyright 2024 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

# Checks the result status of each job provided by 'jobs-json' and sends an
# alert if at least one job failed.
#
# Usage:
#   ```yml
#   jobs:
#      job_1:
#          ...
#      job_2:
#          ...
#      my_summary:
#        if: always()
#        needs:
#          - job_1
#          - job_2
#        uses: ./.github/workflows/workflow_summary.yml
#        secrets: inherit
#        with:
#          jobs-json: ${{ toJson(needs) }}
#   ```

name: Workflow Summary

on:
  workflow_call:
    inputs:
        jobs-json:
          type: string
          description: The output of `toJson(needs)`

permissions:
  contents: read

jobs:
  summary:
    runs-on: ubuntu-24.04
    steps:
      - name: Getting failed jobs
        id: failed_jobs
        run: |
          echo '${{ inputs.jobs-json }}'
          FAILED_JOBS="$(echo '${{ inputs.jobs-json }}' \
            | jq --raw-output \
            'map_values(select(.result!="success" and .result!="skipped")) | keys | join(",")' \
          )"
          echo "failed-jobs=${FAILED_JOBS}" >> $GITHUB_OUTPUT
          if [[ "${FAILED_JOBS}" != "" ]]; then
            echo "The following jobs failed: ${FAILED_JOBS}"
            exit 1
          fi
      - name: Post to Discord on Failure
        uses: sarisia/actions-status-discord@ce8cc68e4e626000136b3c702d049a154243e490 # v1.14.7
        if: failure() && github.ref_name == 'main' && github.repository_owner == 'iree-org'
        with:
          webhook: ${{ secrets.DISCORD_WEBHOOK }}
          description: "The following jobs failed: ${{ steps.failed_jobs.outputs.failed-jobs }}"
          url: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }}"
