Skip to content

Check npm packument size #42

Check npm packument size

Check npm packument size #42

# See https://github.com/renovatebot/renovate/discussions/42965 and related issues in the past
name: 'Check npm packument size'
on:
# run daily
schedule:
- cron: '0 6 * * *'
# allow manual trigger
workflow_dispatch: {}
permissions: {}
jobs:
check-npm-packument-size:
runs-on: ubuntu-latest
if: github.repository == 'renovatebot/renovate'
steps:
- name: Check npm packument size
id: check
env:
PACKAGE_NAME: renovate
# npm rejects publishes once the packument exceeds 100 MB
WARNING_THRESHOLD_MB: 85
CRITICAL_THRESHOLD_MB: 90
run: |
set -euo pipefail
packument_file="$(mktemp)"
curl -fsS -o "$packument_file" "https://registry.npmjs.org/$PACKAGE_NAME"
size_bytes="$(wc -c < "$packument_file")"
size_mb="$(awk -v bytes="$size_bytes" 'BEGIN { printf "%.2f", bytes / 1024 / 1024 }')"
version_count="$(jq '.versions | length' "$packument_file")"
rm -f "$packument_file"
status="$(awk -v size="$size_mb" -v warn="$WARNING_THRESHOLD_MB" -v crit="$CRITICAL_THRESHOLD_MB" \
'BEGIN { if (size >= crit) print "critical"; else if (size >= warn) print "warning"; else print "ok" }')"
echo "::notice title=npm packument size::npm packument size for '$PACKAGE_NAME': ${size_mb} MB across ${version_count} versions (status: $status)"
{
echo "size-mb=$size_mb"
echo "version-count=$version_count"
echo "status=$status"
} >> "$GITHUB_OUTPUT"
{
echo "### npm packument size"
echo "\`$PACKAGE_NAME\` packument is **${size_mb} MB** across **${version_count} versions** (status: \`$status\`, warning: ${WARNING_THRESHOLD_MB} MB, critical: ${CRITICAL_THRESHOLD_MB} MB, npm hard limit: 100 MB)."
} >> "$GITHUB_STEP_SUMMARY"
- name: Post warning to Slack
if: steps.check.outputs.status == 'warning'
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
with:
webhook: ${{ secrets.RENOVATEBOT_SLACK_WEBHOOK_MAIN_FAILURES }}
webhook-type: incoming-webhook
payload: |
text: ":warning: *npm packument for `renovate` is getting large*: ${{ steps.check.outputs.size-mb }} MB across ${{ steps.check.outputs.version-count }} versions. Warning threshold is 85 MB, npm rejects publishes at 100 MB.\nhttps://registry.npmjs.org/renovate"
blocks:
- type: "section"
text:
type: "mrkdwn"
text: ":warning: *npm packument for `renovate` is getting large*: ${{ steps.check.outputs.size-mb }} MB across ${{ steps.check.outputs.version-count }} versions. Warning threshold is 85 MB, npm rejects publishes at 100 MB.\nhttps://registry.npmjs.org/renovate"
- name: Post critical warning to Slack
if: steps.check.outputs.status == 'critical'
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
with:
webhook: ${{ secrets.RENOVATEBOT_SLACK_WEBHOOK_MAIN_FAILURES }}
webhook-type: incoming-webhook
payload: |
text: ":rotating_light: *npm packument for `renovate` is close to the 100 MB publish limit*: ${{ steps.check.outputs.size-mb }} MB across ${{ steps.check.outputs.version-count }} versions. Publishing will start failing soon - action needed.\nhttps://registry.npmjs.org/renovate"
blocks:
- type: "section"
text:
type: "mrkdwn"
text: ":rotating_light: *npm packument for `renovate` is close to the 100 MB publish limit*: ${{ steps.check.outputs.size-mb }} MB across ${{ steps.check.outputs.version-count }} versions. Publishing will start failing soon - action needed.\nhttps://registry.npmjs.org/renovate"
- name: Fail job if size is critical
if: steps.check.outputs.status == 'critical'
run: exit 50