Skip to content

Instantly share code, notes, and snippets.

@ItsWendell
Last active November 19, 2023 17:23
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ItsWendell/dbc2cd74dc8ae2d7bfa3a50afa32f079 to your computer and use it in GitHub Desktop.
Save ItsWendell/dbc2cd74dc8ae2d7bfa3a50afa32f079 to your computer and use it in GitHub Desktop.
Turbo Summarize Github Actions Action
name: "Summarize Turborepo Output"
description: "Summarize Turborepo output for GitHub Actions"
runs:
using: "composite"
steps:
- shell: bash
name: "Summarize Turborepo Output"
run: |
latest_json=$(ls -t .turbo/runs/*.json | head -1)
if [ -z "$latest_json" ]; then
echo "No summary found, make sure you add the \`turbo-summarize\` step after your \`turbo\` step."
else
# Read the file
json_content=$(cat "$latest_json")
# Define formatting functions
formatted_duration() {
local duration_in_milliseconds=$1
local duration_in_seconds=$((duration_in_milliseconds / 1000))
local minutes=$((duration_in_seconds / 60))
local seconds=$((duration_in_seconds % 60))
local milliseconds=$((duration_in_milliseconds % 1000))
echo "${minutes}m ${seconds}.${milliseconds}s"
}
formatted_timestamp() {
local timestamp_in_milliseconds=$1
local timestamp_seconds=$((timestamp_in_milliseconds / 1000))
local milliseconds=$((timestamp_milliseconds % 1000))
local formatted_date=$(date -u -d "@$timestamp_seconds" +"%Y-%m-%d %H:%M:%S.$milliseconds")
echo "$formatted_date"
}
# Extract run details
run_command=$(echo "$json_content" | jq -r '.execution.command')
run_id=$(echo "$json_content" | jq -r '.id')
turbo_version=$(echo "$json_content" | jq -r '.turboVersion')
monorepo=$(echo "$json_content" | jq -r '.monorepo')
global_cache_enabled=$(echo "$json_content" | jq -r '.globalCacheInputs != null')
packages=$(echo "$json_content" | jq -r '.packages | join(", ")')
repository_sha=$(echo "$json_content" | jq -r '.scm.sha')
repository_branch=$(echo "$json_content" | jq -r '.scm.branch')
repository_type=$(echo "$json_content" | jq -r '.scm.type')
run_status=$(echo "$json_content" | jq -r '.execution.exitCode | if . == 0 then "Success" else "Failure" end')
total_run_duration=$((($(echo "$json_content" | jq -r '.execution.endTime') - $(echo "$json_content" | jq -r '.execution.startTime'))))
execution_attempts=$(echo "$json_content" | jq -r '.execution.attempted')
cached_count=$(echo "$json_content" | jq -r '.execution.cached')
success_count=$(echo "$json_content" | jq -r '.execution.successful')
## If full cached, is full turbo
is_full_turbo=$(if [ "$cached_count" = "$execution_attempts" ]; then echo "true"; else echo "false"; fi)
markdown_content+="# Turbo summary: \`$run_command\` - $(if [ "$run_status" = "Success" ]; then echo ":white_check_mark: Success"; else echo ":x: Failure"; fi)\n"
markdown_content+="*Id: $run_id*\n\n"
markdown_content+=" - **Tasks:** $cached_count successful / $execution_attempts total\n"
markdown_content+=" - **Cached:** $cached_count cached / $execution_attempts total\n"
markdown_content+=" - **Time:** $(formatted_duration $total_run_duration)$(if [ "$is_full_turbo" = "true" ]; then echo " **>> FULL TURBO :rocket:**"; fi)\n\n\n"
markdown_content+="\n"
markdown_content+="| Task ID | Status | Duration | Cache | Time Saved | Started At | Completed At |\n"
markdown_content+="|---------|---------|----------------|------------|------------|---------------------|---------------------|\n"
# Extract task information and format as Markdown
tasks=$(echo "$json_content" | jq -c '.tasks[]')
while IFS= read -r task; do
task_id=$(echo "$task" | jq -r '.taskId')
status=$(echo "$task" | jq -r '.execution.exitCode | if . == 0 then ":white_check_mark: Success" else ":x: Failure" end')
start_time=$(echo "$task" | jq -r '.execution.startTime')
end_time=$(echo "$task" | jq -r '.execution.endTime')
duration=$((end_time - start_time))
cache_status=$(echo "$task" | jq -r '.cache.status')
cache_type=$(echo "$task" | jq -r '.cache.remote | if . then "Remote" else "Local" end')
time_saved=$(echo "$task" | jq -r '.cache.timeSaved')
formatted_duration=$(formatted_duration "$duration")
formatted_time_saved=$(formatted_duration "$time_saved")
formatted_start_time=$(formatted_timestamp "$start_time")
formatted_end_time=$(formatted_timestamp "$end_time")
markdown_content+="| $task_id | $status | $formatted_duration | $cache_status ($cache_type) | $formatted_time_saved | $formatted_start_time | $formatted_end_time |\n"
done <<< "$tasks"
markdown_content+="\n"
markdown_content+="<details>\n<summary>\n<b>Run details</b>\n</summary>\n\n"
markdown_content+=" - **ID:** $run_id\n"
markdown_content+=" - **Packages used:** $packages\n"
markdown_content+=" - **Turbo version**: $turbo_version\n"
markdown_content+=" - **Monorepo**: $(if [ "$monorepo" = "true" ]; then echo "Yes"; else echo "No"; fi)\n"
markdown_content+=" - **Global cache enabled:** $(if [ "$global_cache_enabled" = "true" ]; then echo "Yes"; else echo "No"; fi)\n"
markdown_content+=" - **Repository:** SHA: $repository_sha, Branch: $repository_branch, Type: $repository_type\n"
markdown_content+="\n"
markdown_content+="</details>\n"
markdown_content+="\n<details>\n<summary>\n<b>Full Summary JSON Output</b>\n</summary>\n\n"
markdown_content+="\`\`\`json\n$json_content\n\`\`\`\n\n"
markdown_content+="</details>\n"
markdown_content+="\n"
fi
markdown_content+="---\n"
markdown_content+="\n"
markdown_content+="[Turbo](https://turbo.build) - The build system that makes ship happen\n"
markdown_content+="\n"
# Write markdown content to the summary file
echo -e "$markdown_content" >> $GITHUB_STEP_SUMMARY
@ItsWendell
Copy link
Author

ItsWendell commented Aug 21, 2023

How to use this action:

  1. Create a folder called actions/turbo-summarize in your root folder
  2. Put this file called action.yaml in that folder.
  3. Add the following as the final step in your workflow jobs:
  4. Make sure you use the summarize flag, example: turbo run build --summarize
my-job:
    steps:
      # your turbo run command here and other steps above.
      - name: Summarize Turbo
        uses: ./actions/turbo-summarize

This is currently only tested on Linux runners, I'll turn this into an published Javascript based runner in the near future so it could support more features and platforms. Any feedback / request is appreciated!

Disclaimer: The summary json also exposes your environment variables and values in the job summary, which might not be great to have saved in there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment