Skip to content

Spinlock detection and fastforwarding for accel-sim #55

Spinlock detection and fastforwarding for accel-sim

Spinlock detection and fastforwarding for accel-sim #55

Workflow file for this run

# This is a basic workflow to help you get started with Actions
#Turing commands are commented out , we regress QV100,RTX3070,A100
name: CI Runs
# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the mydev branch
push:
pull_request:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
env:
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
jobs:
check-format:
runs-on: tgrogers-raid
steps:
- uses: actions/checkout@v4
- name: Check code formatting
run: |
# Run the formatter to see if it would make any changes
/bin/bash ./gpu-simulator/format-code.sh
/bin/bash ./util/tracer_nvbit/tracer_tool/format-code.sh
# Check if there are any uncommitted changes
if git diff --quiet; then
echo "✅ Code is properly formatted"
else
echo "❌ Code formatting check failed. The following files need formatting:"
git diff --name-only
echo ""
echo "Please run the formatter locally and commit the changes:"
echo "/bin/bash ./format-code.sh"
exit 1
fi
SASS-Simulation:
runs-on: tgrogers-raid
needs: [check-format]
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
- name: Setup Environment
run: |
rm -rf env-setup
git clone --quiet [email protected]:purdue-aalp/env-setup.git
cd env-setup
git checkout cluster-ubuntu
- name: Build Accel-Sim
run: |
source ./env-setup/12.8_env_setup.sh
rm -rf ./gpu-simulator/gpgpu-sim
# Clone gpgpu-sim with fork-aware branch selection
echo "Cloning gpgpu-sim with fork-aware branch selection..."
git clone --quiet https://github.com/accel-sim/gpgpu-sim_distribution.git ./gpu-simulator/gpgpu-sim
# Try to checkout the same branch from the same owner's fork first
current_owner=$(echo ${{ github.repository }} | cut -d'/' -f1)
current_repo=$(echo ${{ github.repository }} | cut -d'/' -f2)
gpgpusim_repo=$(echo $current_repo | sed 's/accel-sim-framework/gpgpu-sim_distribution/')
echo "Attempting to checkout branch '$BRANCH_NAME' from '$current_owner/$gpgpusim_repo'"
# First, try to add the fork owner's repository as a remote and check if the branch exists
if git -C ./gpu-simulator/gpgpu-sim/ remote add fork-owner https://github.com/$current_owner/$gpgpusim_repo.git 2>/dev/null; then
# Check if the branch exists in the fork owner's repository
if git -C ./gpu-simulator/gpgpu-sim/ ls-remote fork-owner | grep -q "refs/heads/$BRANCH_NAME"; then
echo "Found branch '$BRANCH_NAME' in '$current_owner/$gpgpusim_repo' repository, checking it out"
git -C ./gpu-simulator/gpgpu-sim/ fetch fork-owner
git -C ./gpu-simulator/gpgpu-sim/ checkout -b $BRANCH_NAME fork-owner/$BRANCH_NAME
else
echo "Branch '$BRANCH_NAME' not found in '$current_owner/$gpgpusim_repo' repository, falling back to upstream dev branch"
git -C ./gpu-simulator/gpgpu-sim/ checkout dev
fi
# Remove the temporary remote
git -C ./gpu-simulator/gpgpu-sim/ remote remove fork-owner
else
echo "Could not add '$current_owner/$gpgpusim_repo' remote, falling back to upstream dev branch"
git -C ./gpu-simulator/gpgpu-sim/ checkout dev
fi
source ./gpu-simulator/setup_environment.sh
make clean -C gpu-simulator
srun --time=8:00:00 -c20 make -j20 -C gpu-simulator
- name: Run SASS
run: |
source ./env-setup/12.8_env_setup.sh
source ./gpu-simulator/setup_environment.sh
./util/job_launching/run_simulations.py -B GPU_Microbenchmark -C QV100-SASS -T /scratch/tgrogers-disk01/a/common/for-sharing/accel-sim/QV100//hw_run/traces/device-0/12.8/ -N sass-short-${{ github.run_number }}"_"${{ github.run_attempt}}
./util/job_launching/run_simulations.py -B rodinia_2.0-ft -C QV100-SASS -T /scratch/tgrogers-disk01/a/common/for-sharing/accel-sim/QV100/hw_run/traces/device-0/12.8/ -N sass-short-${{ github.run_number }}"_"${{ github.run_attempt}}
./util/job_launching/run_simulations.py -B GPU_Microbenchmark -C RTX3070-SASS -T /scratch/tgrogers-disk01/a/common/for-sharing/accel-sim/RTX3070/hw_run/traces/device-0/12.8/ -N sass-short-${{ github.run_number }}"_"${{ github.run_attempt}}
./util/job_launching/run_simulations.py -B rodinia_2.0-ft -C RTX3070-SASS -T /scratch/tgrogers-disk01/a/common/for-sharing/accel-sim/RTX3070/hw_run/traces/device-0/12.8/ -N sass-short-${{ github.run_number }}"_"${{ github.run_attempt}}
./util/job_launching/run_simulations.py -B GPU_Microbenchmark -C A100-SASS -T /scratch/tgrogers-disk01/a/common/for-sharing/accel-sim/A100/hw_run/traces/device-0/12.8/ -N sass-short-${{ github.run_number }}"_"${{ github.run_attempt}}
./util/job_launching/run_simulations.py -B rodinia_2.0-ft -C A100-SASS -T /scratch/tgrogers-disk01/a/common/for-sharing/accel-sim/A100/hw_run/traces/device-0/12.8/ -N sass-short-${{ github.run_number }}"_"${{ github.run_attempt}}
./util/job_launching/run_simulations.py -B mlperf_inference -C RTX3070-SASS -T /scratch/tgrogers-disk01/a/common/for-sharing/accel-sim/mlperf_rtx3070/traces/device-0/12.8/ -N sass-short-${{ github.run_number }}"_"${{ github.run_attempt}}
./util/job_launching/monitor_func_test.py -v --sleep_time 300 -s stats-per-app-sass.csv -N sass-short-${{ github.run_number }}"_"${{ github.run_attempt}}
- name: Archive Stats
run: |
source ./env-setup/12.8_env_setup.sh
rm -rf ./statistics-archive
git clone --quiet [email protected]:accel-sim/statistics-archive.git
BRANCH_NAME=${{ github.repository }}/$BRANCH_NAME
# either create a new branch or check it out if it already exists
git -C ./statistics-archive checkout $BRANCH_NAME 2>/dev/null || git -C ./statistics-archive checkout -b $BRANCH_NAME
./util/job_launching/get_stats.py -k -K -R -B GPU_Microbenchmark -C QV100-SASS -A | tee v100-ubench-sass-local.csv
./util/job_launching/get_stats.py -k -K -R -B GPU_Microbenchmark -C RTX3070-SASS -A | tee ampere-ubench-sass-local.csv
./util/job_launching/get_stats.py -k -K -R -B GPU_Microbenchmark -C A100-SASS -A | tee ampere-a100-ubench-sass-local.csv
mkdir -p statistics-archive/ubench/
# First we merge and archive this run to the main csv that contains all previous runs
./util/plotting/merge-stats.py -R -c ./statistics-archive/ubench/v100-ubench-sass.csv,v100-ubench-sass-local.csv \
| tee v100-ubench-sass.csv && mv v100-ubench-sass.csv ./statistics-archive/ubench/
# ./util/plotting/merge-stats.py -R -c ./statistics-archive/ubench/turing-ubench-sass.csv,turing-ubench-sass-local.csv \
# | tee turing-ubench-sass.csv && mv turing-ubench-sass.csv ./statistics-archive/ubench/
./util/plotting/merge-stats.py -R -c ./statistics-archive/ubench/ampere-ubench-sass.csv,ampere-ubench-sass-local.csv \
| tee ampere-ubench-sass.csv && mv ampere-ubench-sass.csv ./statistics-archive/ubench/
./util/plotting/merge-stats.py -R -c ./statistics-archive/ubench/ampere-a100-ubench-sass.csv,ampere-ubench-sass-local.csv \
| tee ampere-a100-ubench-sass.csv && mv ampere-a100-ubench-sass.csv ./statistics-archive/ubench/
# Next we merge the latest run with the current run (used for correlation plots) then archive the current run as the new latest for the next time this action occurs
./util/plotting/merge-stats.py -R -c ./statistics-archive/ubench/v100-ubench-sass-latest.csv,v100-ubench-sass-local.csv \
| tee v100-ubench-sass-latest2.csv && mv v100-ubench-sass-local.csv ./statistics-archive/ubench/v100-ubench-sass-latest.csv
# ./util/plotting/merge-stats.py -R -c ./statistics-archive/ubench/turing-ubench-sass-latest.csv,turing-ubench-sass-local.csv \
# | tee turing-ubench-sass-latest2.csv && mv turing-ubench-sass-local.csv ./statistics-archive/ubench/turing-ubench-sass-latest.csv
./util/plotting/merge-stats.py -R -c ./statistics-archive/ubench/ampere-ubench-sass-latest.csv,ampere-ubench-sass-local.csv \
| tee ampere-ubench-sass-latest2.csv && mv ampere-ubench-sass-local.csv ./statistics-archive/ubench/ampere-ubench-sass-latest.csv
./util/plotting/merge-stats.py -R -c ./statistics-archive/ubench/ampere-a100-ubench-sass-latest.csv,ampere-a100-ubench-sass-local.csv \
| tee ampere-a100-ubench-sass-latest2.csv && mv ampere-a100-ubench-sass-local.csv ./statistics-archive/ubench/ampere-a100-ubench-sass-latest.csv
if [[ $GITHUB_EVENT_NAME == 'push' ]]; then
git -C ./statistics-archive add --all
git -C ./statistics-archive commit \
-m "CI automated checkin $BRANCH_NAME Build:${{ github.run_number }}"_"${{ github.run_attempt}}" || echo "No Changes."
git -C ./statistics-archive push -u origin $BRANCH_NAME
fi
- name: Correlate Ubench
run: |
source ./env-setup/12.8_env_setup.sh
./util/hw_stats/get_hw_data.sh > /dev/null 2>&1
rm -rf ./util/plotting/correl-html/
./util/plotting/plot-correlation.py -c ./v100-ubench-sass-latest2.csv -H /scratch/tgrogers-disk01/a/common/for-sharing/accel-sim/QV100/hw_run/device-0/12.8/ | tee v100-ubench-correl.txt
mv ./util/plotting/correl-html/combined_per_kernel.html ./statistics-archive/ubench/v100-combined_per_kernel.html
mv ./util/plotting/correl-html/combined_per_app.html ./statistics-archive/ubench/v100-combined_per_app.html
./util/plotting/plot-correlation.py -c ./ampere-ubench-sass-latest2.csv -H /scratch/tgrogers-disk01/a/common/for-sharing/accel-sim/RTX3070/hw_run/device-0/12.8/ | tee ampere-ubench-correl.txt
./util/plotting/plot-correlation.py -c ./ampere-a100-ubench-sass-latest2.csv -H /scratch/tgrogers-disk01/a/common/for-sharing/accel-sim/A100/hw_run/device-0/12.8/ | tee ampere-a100-ubench-correl.txt
mv ./util/plotting/correl-html/combined_per_kernel.html ./statistics-archive/ubench/ampere-a100-combined_per_kernel.html
mv ./util/plotting/correl-html/combined_per_app.html ./statistics-archive/ubench/ampere-a100-combined_per_app.html
ssh ghci@tgrogers-pc01 mkdir -p /home/ghci/accel-sim/correl/git_$BRANCH_NAME"_"${{ github.run_number }}"_"${{ github.run_attempt}}/
rsync --delete -r ./util/plotting/correl-html/ ghci@tgrogers-pc01:/home/ghci/accel-sim/correl/git_$BRANCH_NAME"_"${{ github.run_number }}"_"${{ github.run_attempt}}/
if [[ ${{ github.event_name }} == 'push' ]]; then
git -C ./statistics-archive reset --soft HEAD~1
git -C ./statistics-archive add --all
git -C ./statistics-archive commit \
-m "CI automated checkin ${{ github.repository }}/$BRANCH_NAME Build:${{ github.run_number }}"_"${{ github.run_attempt}}" || echo "No Changes."
git -C ./statistics-archive push -f -u origin ${{ github.repository }}/$BRANCH_NAME
rm -rf /scratch/tgrogers-disk01/a/tgrghci/ci/lastSuccess/${{ github.repository }}/$BRANCH_NAME
mkdir -p /scratch/tgrogers-disk01/a/tgrghci/ci/lastSuccess/${{ github.repository }}/$BRANCH_NAME
mv $PWD/* /scratch/tgrogers-disk01/a/tgrghci/ci/lastSuccess/${{ github.repository }}/$BRANCH_NAME/
chmod -R 777 /scratch/tgrogers-disk01/a/tgrghci/ci/lastSuccess/${{ github.repository }}/$BRANCH_NAME/
fi
PTX-Simulation:
needs: [check-format]
runs-on: tgrogers-raid
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
- name: Setup Environment
run: |
rm -rf env-setup
git clone --quiet [email protected]:purdue-aalp/env-setup.git
cd env-setup
git checkout cluster-ubuntu
- name: Build Accel-Sim
run: |
source ./env-setup/12.8_env_setup.sh
rm -rf ./gpu-simulator/gpgpu-sim
# Clone gpgpu-sim with fork-aware branch selection
echo "Cloning gpgpu-sim with fork-aware branch selection..."
git clone --quiet https://github.com/accel-sim/gpgpu-sim_distribution.git ./gpu-simulator/gpgpu-sim
# Try to checkout the same branch from the same owner's fork first
current_owner=$(echo $GITHUB_REPOSITORY | cut -d'/' -f1)
current_branch=$BRANCH_NAME
current_repo=$(echo $GITHUB_REPOSITORY | cut -d'/' -f2)
gpgpusim_repo=$(echo $current_repo | sed 's/accel-sim-framework/gpgpu-sim_distribution/')
echo "Attempting to checkout branch '$BRANCH_NAME' from '$current_owner/$gpgpusim_repo'"
# First, try to add the fork owner's repository as a remote and check if the branch exists
if git -C ./gpu-simulator/gpgpu-sim/ remote add fork-owner https://github.com/$current_owner/$gpgpusim_repo.git 2>/dev/null; then
# Check if the branch exists in the fork owner's repository
if git -C ./gpu-simulator/gpgpu-sim/ ls-remote fork-owner | grep -q "refs/heads/$BRANCH_NAME"; then
echo "Found branch '$BRANCH_NAME' in '$current_owner/$gpgpusim_repo' repository, checking it out"
git -C ./gpu-simulator/gpgpu-sim/ fetch fork-owner
git -C ./gpu-simulator/gpgpu-sim/ checkout -b $BRANCH_NAME fork-owner/$BRANCH_NAME
else
echo "Branch '$BRANCH_NAME' not found in '$current_owner/$gpgpusim_repo' repository, falling back to accel-sim dev branch"
git -C ./gpu-simulator/gpgpu-sim/ checkout dev
fi
# Remove the temporary remote
git -C ./gpu-simulator/gpgpu-sim/ remote remove fork-owner
else
echo "Could not add '$current_owner/$gpgpusim_repo' remote, falling back to upstream dev branch"
git -C ./gpu-simulator/gpgpu-sim/ checkout dev
fi
source ./gpu-simulator/setup_environment.sh
make clean -C gpu-simulator
srun --time=8:00:00 -c20 make -j20 -C gpu-simulator
- name: Run PTX
run: |
source ./env-setup/12.8_env_setup.sh
source ./gpu-simulator/setup_environment.sh
rm -rf ./gpu-app-collection
git clone --quiet --recurse-submodules -b dev [email protected]:accel-sim/gpu-app-collection.git
source ./gpu-app-collection/src/setup_environment > /dev/null 2>&1
srun --time=8:00:00 -c20 make rodinia_2.0-ft GPU_Microbenchmark -j20 -C ./gpu-app-collection/src
./gpu-app-collection/get_regression_data.sh
#./util/job_launching/run_simulations.py -B rodinia_2.0-ft,GPU_Microbenchmark -C QV100-PTX,RTX2060-PTX,RTX3070-PTX,A100-PTX -N short-ptx-${{ github.run_number }}_${{ github.run_attempt}}
./util/job_launching/run_simulations.py -B rodinia_2.0-ft,GPU_Microbenchmark -C QV100-PTX,RTX3070-PTX,A100-PTX -N short-ptx-${{ github.run_number }}_${{ github.run_attempt}}
./util/job_launching/monitor_func_test.py -v --sleep_time 300 -s stats-per-app-ptx.csv -N short-ptx-${{ github.run_number }}_${{ github.run_attempt}}
Tracer-Tool:
needs: [check-format]
runs-on: tgrogers-gpu01
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
- name: Setup Environment
run: |
rm -rf env-setup
git clone --quiet [email protected]:purdue-aalp/env-setup.git
cd env-setup
git checkout cluster-ubuntu
- name: Build Accel-Sim
run: |
source ./env-setup/12.8_env_setup.sh
rm -rf ./gpu-simulator/gpgpu-sim
source ./gpu-simulator/setup_environment.sh
make clean -C gpu-simulator
make -j20 -C gpu-simulator
- name: test-prebuilt-traces
run: |
source ./env-setup/12.8_env_setup.sh
source ./gpu-simulator/setup_environment.sh
./get-accel-sim-traces.py -a tesla-v100/rodinia_2.0-ft
cd hw_run; tar -xzvf rodinia_2.0-ft.tgz; cd -
./util/job_launching/run_simulations.py -B rodinia_2.0-ft -C QV100-SASS -T ./hw_run/ -N rodinia_2.0-ft-online-$$
./util/job_launching/monitor_func_test.py -N rodinia_2.0-ft-online-$$ -v
rm -rf hw_run
rm -rf sim_run_11.0
- name: Build Tracer
run: |
source ./env-setup/12.8_env_setup.sh
./util/tracer_nvbit/install_nvbit.sh
make clean -C ./util/tracer_nvbit/
make -C ./util/tracer_nvbit/
- name: rodinia_2.0-ft-build
run: |
source ./env-setup/12.8_env_setup.sh
rm -rf ./gpu-app-collection/
git clone --quiet [email protected]:accel-sim/gpu-app-collection.git
source ./gpu-app-collection/src/setup_environment > /dev/null 2>&1
ln -s /home/tgrogers-raid/a/common/data_dirs ./gpu-app-collection/
make -C ./gpu-app-collection/src rodinia_2.0-ft
- name: generate-rodinia_2.0-ft-traces
run: |
source ./env-setup/12.8_env_setup.sh
source ./gpu-app-collection/src/setup_environment
rm -rf ./hw_run/
./util/tracer_nvbit/run_hw_trace.py -B rodinia_2.0-ft -D 7 --spinlock_handling none
- name: generate-rodinia_2.0-ft-hw_stats
run: |
source ./env-setup/12.8_env_setup.sh
source ./gpu-app-collection/src/setup_environment
./util/hw_stats/run_hw.py -B rodinia_2.0-ft -D 7
- name: test-new-traces
run: |
source ./env-setup/12.8_env_setup.sh
source ./gpu-simulator/setup_environment.sh
./util/job_launching/run_simulations.py -B rodinia_2.0-ft -C QV100-SASS -T ./hw_run/traces/device-7/ -N rodinia_2.0-ft-$$
./util/job_launching/monitor_func_test.py -I -v -s rodinia-stats-per-app.csv -N rodinia_2.0-ft-$$
- name: generate-rodinia_2.0-ft-traces-spinlock_handling
run: |
source ./env-setup/12.8_env_setup.sh
source ./gpu-app-collection/src/setup_environment
rm -rf ./hw_run/
./util/tracer_nvbit/run_hw_trace.py -B Spinlock -D 7 --spinlock_handling fast_forward
mv ./hw_run ./hw_run_fast_forward
./util/tracer_nvbit/run_hw_trace.py -B Spinlock -D 7 --spinlock_handling none
mv ./hw_run ./hw_run_none
- name: test-new-traces-spinlock_handling
# Test the different spinlock handling modes and compare if the simulated cycles are reduced
run: |
source ./env-setup/12.8_env_setup.sh
source ./gpu-simulator/setup_environment.sh
./util/job_launching/run_simulations.py -B Spinlock -C QV100-SASS -T ./hw_run_fast_forward/traces/device-7/ -N rodinia_2.0-ft-$$-fast_forward
./util/job_launching/monitor_func_test.py -I -v -s rodinia-stats-per-app.csv -N rodinia_2.0-ft-$$-fast_forward
./util/job_launching/run_simulations.py -B Spinlock -C QV100-SASS -T ./hw_run_none/traces/device-7/ -N rodinia_2.0-ft-$$-none
./util/job_launching/monitor_func_test.py -I -v -s rodinia-stats-per-app.csv -N rodinia_2.0-ft-$$-none
./util/job_launching/get_stats.py -N rodinia_2.0-ft-$$-fast_forward | tee stats-fast_forward.csv
./util/job_launching/get_stats.py -N rodinia_2.0-ft-$$-none | tee stats-none.csv
# Extract the simulated instruction count only
awk '/gpu_tot_sim_insn/,/^----/{if(/^----/)exit; print}' stats-fast_forward.csv > stats-fast_forward.csv
awk '/gpu_tot_sim_insn/,/^----/{if(/^----/)exit; print}' stats-none.csv > stats-none.csv
# Compare the simulated instruction count, for fast forward, it should be less than 1% of not fast forward one for this workload
awk -F',' 'NR==2{for(i=2;i<NF;i++)cfg[i]=$i} NR==3 && FNR==3{for(i=2;i<NF;i++)a[i]=$i} NR>3 && FNR==3{for(i=2;i<NF;i++){ratio=a[i]/$i * 100; if(ratio>1){print cfg[i]": "a[i]" vs "$i" (ratio: "sprintf("%.4f",ratio)"%, threshold: 1%)"; e=1}}} END{if(e)exit 1}' stats-fast_forward.csv stats-none.csv
# If last command is not 0, exit with error
if [[ $? -ne 0 ]]; then
echo "Fast forward is not less than 1% of not fast forward instruction counts"
exit 1
fi
SASS-Simulation-Docker:
needs: [check-format]
runs-on: ubuntu-latest
container:
image: ghcr.io/accel-sim/accel-sim-framework:ubuntu-24.04-cuda-12.8-minimal
# env:
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v4
- name: Run Simulation
run: /bin/bash $GITHUB_WORKSPACE/short-tests.sh
CI-Success:
env:
ACTION_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
runs-on: tgrogers-raid
needs: [check-format, SASS-Simulation, PTX-Simulation, Tracer-Tool, SASS-Simulation-Docker]
steps:
- uses: actions/checkout@v4
- run: |
echo "✅ All CI tests completed successfully!"
echo "check-format: ✅"
echo "SASS-Simulation: ✅"
echo "PTX-Simulation: ✅"
echo "Tracer-Tool: ✅"
echo "SASS-Simulation-Docker: ✅"
# Setup envs
git clone --quiet --branch cluster-ubuntu [email protected]:purdue-aalp/env-setup.git
source ./env-setup/common/common_inc.sh
if [[ ${{ github.event_name }} == 'pull_request' ]]; then
# stats are only archived on pushes. So the repo in the report url needs to be the head repo of the PR
# The stats htmls are generated by CI triggered by pushes to the head repo.
# Not so clean. But works for now. The htmls are not that important anyway.
export REPORT_URL="https://rawcdn.githack.com/accel-sim/statistics-archive/${{ github.event.pull_request.head.repo.full_name }}/$BRANCH_NAME/ubench/"
python3 .github/scripts/send_ci_email.py -t success
fi
failures:
if: failure()
env:
ACTION_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
REPORT_URL: ""
runs-on: tgrogers-raid
needs: [check-format, SASS-Simulation, PTX-Simulation, Tracer-Tool, SASS-Simulation-Docker]
steps:
- uses: actions/checkout@v4
- name: Notify Failure
run: |
# Setup envs
git clone --quiet --branch cluster-ubuntu [email protected]:purdue-aalp/env-setup.git
source ./env-setup/common/common_inc.sh
if [[ ${{ github.event_name }} == 'pull_request' ]]; then
python3 .github/scripts/send_ci_email.py -t failure
elif [[ ${{ github.event_name }} == 'push' && ${{ github.ref_name }} == 'dev' ]]; then
# if the push is to the dev branch, send an urgent failure email
python3 .github/scripts/send_ci_email.py -t failure -u
fi