API Changes: - Return errorMessages array in sync response (first 5 errors) Workflow Changes: - Display error messages in GitHub Actions logs with formatting - Include error details in Discord notifications (first 3 errors) - Shows errors in both console output and Discord embed Example output: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ⚠️ SYNC ERRORS (4 total): ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Failed to process pkg1: Invalid tpmjs field • Failed to process pkg2: Network timeout ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
131 lines
4.9 KiB
YAML
131 lines
4.9 KiB
YAML
name: Sync NPM Keyword Search
|
|
|
|
on:
|
|
schedule:
|
|
# Run every 15 minutes
|
|
- cron: '*/15 * * * *'
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
sync-keyword:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Trigger keyword search sync
|
|
id: sync
|
|
run: |
|
|
# Call the sync API and capture response
|
|
response=$(curl -X POST "${{ secrets.VERCEL_PRODUCTION_URL }}/api/sync/keyword" \
|
|
-H "Authorization: Bearer ${{ secrets.CRON_SECRET }}" \
|
|
-H "Content-Type: application/json" \
|
|
-f -s -S)
|
|
|
|
echo "Response: $response"
|
|
|
|
# Extract data using jq
|
|
processed=$(echo "$response" | jq -r '.data.processed')
|
|
skipped=$(echo "$response" | jq -r '.data.skipped')
|
|
errors=$(echo "$response" | jq -r '.data.errors')
|
|
packagesFound=$(echo "$response" | jq -r '.data.packagesFound')
|
|
durationMs=$(echo "$response" | jq -r '.data.durationMs')
|
|
|
|
# Extract and display error messages
|
|
errorMessages=$(echo "$response" | jq -r '.data.errorMessages[]?' 2>/dev/null || echo "")
|
|
|
|
if [ -n "$errorMessages" ]; then
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "⚠️ SYNC ERRORS ($errors total):"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "$response" | jq -r '.data.errorMessages[]?' | while IFS= read -r error; do
|
|
echo " • $error"
|
|
done
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
fi
|
|
|
|
# Set outputs for Discord notification
|
|
echo "processed=$processed" >> $GITHUB_OUTPUT
|
|
echo "skipped=$skipped" >> $GITHUB_OUTPUT
|
|
echo "errors=$errors" >> $GITHUB_OUTPUT
|
|
echo "packagesFound=$packagesFound" >> $GITHUB_OUTPUT
|
|
echo "durationMs=$durationMs" >> $GITHUB_OUTPUT
|
|
|
|
# Store error messages for Discord (first 3, truncated)
|
|
if [ "$errors" -gt 0 ]; then
|
|
errorSummary=$(echo "$response" | jq -r '.data.errorMessages[0:3]? | join("\n• ")' 2>/dev/null || echo "")
|
|
if [ -n "$errorSummary" ]; then
|
|
# Save to file to preserve newlines
|
|
echo "• $errorSummary" > /tmp/error_summary.txt
|
|
fi
|
|
fi
|
|
|
|
# Determine status emoji
|
|
if [ "$errors" -gt 0 ]; then
|
|
echo "status_emoji=⚠️" >> $GITHUB_OUTPUT
|
|
echo "status_color=16776960" >> $GITHUB_OUTPUT # Yellow
|
|
else
|
|
echo "status_emoji=✅" >> $GITHUB_OUTPUT
|
|
echo "status_color=5763719" >> $GITHUB_OUTPUT # Green
|
|
fi
|
|
|
|
- name: Send Discord notification
|
|
if: always()
|
|
run: |
|
|
# Format duration
|
|
duration_sec=$(echo "scale=2; ${{ steps.sync.outputs.durationMs }} / 1000" | bc)
|
|
|
|
# Build base fields
|
|
fields='[
|
|
{
|
|
"name": "📦 Packages Found",
|
|
"value": "${{ steps.sync.outputs.packagesFound }}",
|
|
"inline": true
|
|
},
|
|
{
|
|
"name": "✨ Processed",
|
|
"value": "${{ steps.sync.outputs.processed }}",
|
|
"inline": true
|
|
},
|
|
{
|
|
"name": "⏭️ Skipped",
|
|
"value": "${{ steps.sync.outputs.skipped }}",
|
|
"inline": true
|
|
},
|
|
{
|
|
"name": "❌ Errors",
|
|
"value": "${{ steps.sync.outputs.errors }}",
|
|
"inline": true
|
|
},
|
|
{
|
|
"name": "⏱️ Duration",
|
|
"value": "'"$duration_sec"'s",
|
|
"inline": true
|
|
},
|
|
{
|
|
"name": "🔗 Run",
|
|
"value": "[View Logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})",
|
|
"inline": true
|
|
}'
|
|
|
|
# Add error details if errors exist
|
|
if [ -f /tmp/error_summary.txt ] && [ ${{ steps.sync.outputs.errors }} -gt 0 ]; then
|
|
error_text=$(cat /tmp/error_summary.txt | head -c 900)
|
|
fields="$fields"',
|
|
{
|
|
"name": "🔍 Error Details",
|
|
"value": "```\n'"$error_text"'\n```",
|
|
"inline": false
|
|
}'
|
|
fi
|
|
|
|
fields="$fields"']'
|
|
|
|
# Create Discord embed
|
|
curl -X POST "${{ secrets.DISCORD_WEBHOOK }}" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"embeds": [{
|
|
"title": "${{ steps.sync.outputs.status_emoji }} NPM Keyword Search Sync",
|
|
"color": ${{ steps.sync.outputs.status_color }},
|
|
"fields": '"$fields"',
|
|
"timestamp": "'"$(date -u +%Y-%m-%dT%H:%M:%S.000Z)"'"
|
|
}]
|
|
}'
|