diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index f826af84..8e115339 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -87,11 +87,118 @@ jobs: run: npx playwright install --with-deps - name: turbo - run: pnpm turbo:all --force $FORCE_TURBO_ALL + run: pnpm turbo:all --force $FORCE_TURBO_ALL --summarize env: FORCE_TURBO_ALL: ${{ inputs.forceTurboAll || 'false' }} NODE_OPTIONS: '--max_old_space_size=8192' # https://github.com/actions/runner-images/issues/70 + - shell: bash + name: 'Summarize Turborepo Output' + if: always() + 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+="
\n\nRun details\n\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+="
\n" + + markdown_content+="\n
\n\nFull Summary JSON Output\n\n\n" + markdown_content+="\`\`\`json\n$json_content\n\`\`\`\n\n" + markdown_content+="
\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 + echo "$markdown_content" + - name: Upload App Playwright report uses: actions/upload-artifact@v4 if: always()