Jalil David Salamé Messina
983bec568c
This should help them out to reduce the size. Also rectify misunderstanding about NAR Size.
158 lines
4.5 KiB
Bash
Executable file
158 lines
4.5 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
set -eu
|
|
|
|
util_path="${GITHUB_ACTION_PATH:-.}/utils.sh"
|
|
|
|
# shellcheck source=utils.sh
|
|
. "${util_path}"
|
|
|
|
# USAGE: json_to_md_rows <FIELD> [JSON_FILE]
|
|
#
|
|
# JSON_FILE can be piped from stdin
|
|
json_to_md_rows() {
|
|
jq --raw-output \
|
|
".$1[]"' | "| `\(.name)` | \(.size) | \(.narSize) |"' "$2" |
|
|
numfmt --to=iec-i --field=4,6
|
|
}
|
|
|
|
# USAGE: json_to_md_rows <FIELD> [JSON_FILE]
|
|
#
|
|
# JSON_FILE can be piped from stdin
|
|
json_to_md_rows_and_change() {
|
|
jq --raw-output \
|
|
".$1[]"' | "| `\(.name)` | \(.size) | \(.sizeChange) | \(.narSize) | \(.narSizeChange) |"' |
|
|
numfmt --to=iec-i --field=4,6,8,10
|
|
}
|
|
|
|
# USAGE: has_elements <FIELD> <JSON_FILE>
|
|
has_elements() {
|
|
if [ "${2+set}" = 'set' ]; then
|
|
[ "$(jq ".$1 != []" "$2")" = 'true' ]
|
|
else
|
|
[ "$(jq ".$1 != []")" = 'true' ]
|
|
fi
|
|
}
|
|
|
|
# USAGE: markdown_from_report <REPORT> [BASE_REPORT]
|
|
#
|
|
# If BASE_REPORT is provided, a comparison will be made
|
|
markdown_from_report() {
|
|
cat <<-"EOF"
|
|
# Flake output sizes
|
|
|
|
**Definitions:**
|
|
|
|
- `Name`: the name of the package/configuration.
|
|
- `Size`: the closure size (size on disk/NAR size + all transitive dependencies).
|
|
- `NAR Size`: the size of the build output (package without the dependencies).
|
|
EOF
|
|
if [ "${2+set}" = "set" ]; then
|
|
cat <<-"EOF"
|
|
- `[NAR] Size Change`: the amount changed compared to the main branch.
|
|
EOF
|
|
fi
|
|
cat <<-"EOF"
|
|
|
|
**Tips on reading this data:**
|
|
|
|
- For NixOS configurations you generally care only about the `Size` (closure size/size on disk).
|
|
- Reduce the `Size` by disabling unneeded services/default packages.
|
|
- For Packages you care about both the `Size` and the `NAR Size`.
|
|
- Reduce the `NAR Size` by reducing the size of the build outputs, e.g. don't copy unnecessary data to the $out dir, optimize binaries for size, etc.
|
|
- Reduce the `Size` by reducing the dependencies (e.g. `buildInputs`).
|
|
- Don't worry too much about size, some dependencies are deduplicated, e.g. `glibc` adds ~40MiB to the `Size`, but is generally shared by ~every binary on the system, so, chances are, you are already including it from somewhere else and statically linking with e.g. `musl` is not gonna improve things.
|
|
EOF
|
|
|
|
if [ "${2+set}" = "set" ]; then
|
|
compare=$(jq --slurp --from-file "${GITHUB_ACTION_PATH:-.}/compare.jq" "$1" "$2")
|
|
if echo "$compare" | has_elements 'nixosConfigurations'; then
|
|
cat <<-"EOF"
|
|
# NixOS Configurations
|
|
|
|
| Name | Size | Size Change | NAR Size | NAR Size Change |
|
|
|------|-----:|------------:|---------:|----------------:|
|
|
EOF
|
|
echo "$compare" | json_to_md_rows_and_change "nixosConfigurations"
|
|
echo
|
|
fi
|
|
if echo "$compare" | has_elements 'packages'; then
|
|
cat <<-"EOF"
|
|
# Packages
|
|
|
|
| Name | Size | Size Change | NAR Size | NAR Size Change |
|
|
|------|-----:|------------:|---------:|----------------:|
|
|
EOF
|
|
echo "$compare" | json_to_md_rows_and_change "packages"
|
|
echo
|
|
fi
|
|
else
|
|
if has_elements 'nixosConfigurations' "$1"; then
|
|
cat <<-"EOF"
|
|
# NixOS Configurations
|
|
|
|
| Name | Size | NAR Size |
|
|
|------|-----:|---------:|
|
|
EOF
|
|
json_to_md_rows "nixosConfigurations" "$1"
|
|
echo
|
|
fi
|
|
if has_elements 'packages' "$1"; then
|
|
cat <<-"EOF"
|
|
# Packages
|
|
|
|
| Name | Size | NAR Size |
|
|
|------|-----:|---------:|
|
|
EOF
|
|
json_to_md_rows "packages" "$1"
|
|
echo
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Test outside CI
|
|
if [ "${CI:-false}" != 'true' ]; then
|
|
markdown_from_report "$@"
|
|
exit 0
|
|
fi
|
|
|
|
log 'Determine head_ref'
|
|
# For push & tag events it'll bet GITHUB_REF_NAME, for pull_request events it'll be GITHUB_HEAD_REF
|
|
head_ref=${GITHUB_REF_NAME:-$GITHUB_HEAD_REF}
|
|
|
|
log "Get PR number for $head_ref"
|
|
prs=$(curl -X 'GET' \
|
|
"$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/pulls?state=open&sort=recentupdate" \
|
|
-H "Authorization: token $GITHUB_TOKEN" \
|
|
-H 'accept: application/json')
|
|
|
|
pr_number=$(echo "$prs" |
|
|
jq --arg head_ref "$head_ref" '.[] | select(.head.ref == $head_ref) | .number')
|
|
|
|
# Protect against running before a PR is made or if it is triggered on the main branch
|
|
if [ -z "$pr_number" ]; then
|
|
warn "No PR created for this commit"
|
|
exit 0
|
|
fi
|
|
|
|
log "Retrieved index: $pr_number"
|
|
log "Expected PR URL: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/pulls/$pr_number"
|
|
|
|
log 'Generating comment body'
|
|
comment=$(markdown_from_report "$@")
|
|
|
|
group 'Comment Data'
|
|
log "$comment"
|
|
endgroup
|
|
|
|
data=$(echo '{}' | jq --arg comment "$comment" '.body=$comment')
|
|
group 'Request data'
|
|
log "$data"
|
|
endgroup
|
|
|
|
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"
|