diff --git a/ci-scripts/report-size.sh b/ci-scripts/report-size.sh index 242f5de..420f844 100755 --- a/ci-scripts/report-size.sh +++ b/ci-scripts/report-size.sh @@ -2,21 +2,67 @@ set -eu -package_size_table() { - packages=$(nix flake show --json 2>/dev/null | jq --raw-output '.packages."x86_64-linux" | ".#" + keys[]') - echo 'Building packages' >&2 - # we want to split the words as each of them is a different installable - # shellcheck disable=SC2086 - nix build $packages - # shellcheck disable=SC2086 - table=$(nix path-info --size --closure-size --human-readable \ - $packages | - sed 's/^\(\S\+\)\(\s\+\)\(\S\+\)\(\s\+\)\(\S\+\)$/| \1\2| \3 | \4\5 |/') +echo 'Retrieving Flake information' >&2 +flake_info=$(nix flake show --json 2>/dev/null) +packages=$( + jq --raw-output '.packages."x86_64-linux" | keys[]' <<-EOF + $flake_info + EOF +) +echo "Packages:" >&2 +echo "$packages" >&2 +configurations=$( + jq --raw-output '.nixosConfigurations | keys[]' <<-EOF + $flake_info + EOF +) +echo "NixOS Configurations:" >&2 +echo "$configurations" >&2 +package_size_table() { + table='| Installable | NAR Size | Closure Size | +|-------------|---------:|-------------:| +' + for package in $packages; do + echo "Building $package" >&2 + path=$(nix build --print-out-paths ".#$package" 2>/dev/null) + row=$(nix path-info --size --closure-size --human-readable "$path" 2>/dev/null | + sed "s/^\(\S\+\)\(\s\+\)\(\S\+\)\(\s\+\)\(\S\+\)$/| $package | \3 | \4\5 |/") + table="$table$row +" + done + + printf '%s' "$table" +} + +configuration_size_table() { + table='| NixOS Configuration | NAR Size | Closure Size | +|-------------|---------:|-------------:| +' + for config in $configurations; do + echo "Building $config" >&2 + path=$(nix build --print-out-paths ".#nixosConfigurations.$config.config.system.build.toplevel" 2>/dev/null) + row=$(nix path-info --size --closure-size --human-readable "$path" 2>/dev/null | + sed "s/^\(\S\+\)\(\s\+\)\(\S\+\)\(\s\+\)\(\S\+\)$/| $config | \3 | \4 |/") + table="$table$row +" + done + + printf '%s' "$table" +} + +markdown() { cat <<-EOF - | Nix Store Path | NAR Size | Closure Size | - |----------------|---------:|-------------:| - $table + ## Outputs' size + + ### NixOS Configurations sizes + + $(configuration_size_table) + + + ### Package sizes + + $(package_size_table) EOF } @@ -25,31 +71,21 @@ if [ "${CI-false}" = "true" ]; then "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/pulls?state=open&sort=recentupdate" \ -H 'accept: application/json' | jq --arg head_ref "$GITHUB_HEAD_REF" '.[] | select(.head.ref == $head_ref) | .number') - echo "Retrieved index: $pr_number" - echo "Expected PR URL: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/pulls/$pr_number" - echo 'Generating comment body' - comment=$( - cat <<-EOF - ### NixOS Configurations sizes - - TODO - - ### Package sizes - - $(package_size_table) - EOF - ) - echo 'Posting comment:' - echo "$comment" - echo 'Request data:' + echo "Retrieved index: $pr_number" >&2 + echo "Expected PR URL: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/pulls/$pr_number" >&2 + echo 'Generating comment body' >&2 + comment=$(markdown) + echo 'Posting comment:' >&2 + echo "$comment" >&2 + echo 'Request data:' >&2 data=$(echo '{}' | jq --arg comment "$comment" '.body=$comment') - echo "$data" - curl -o - -v -X 'POST' \ + echo "$data" >&2 + curl -o - -X 'POST' \ "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/issues/$pr_number/comments" \ -H 'accept: application/json' \ -H "Authorization: token $GITHUB_TOKEN" \ -H 'Content-Type: application/json' \ -d "$data" else - package_size_table + markdown fi