From e7cf864c2937113de6441bbde9be107069ff8fb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jalil=20David=20Salam=C3=A9=20Messina?= Date: Sat, 14 Dec 2024 23:49:23 +0100 Subject: [PATCH] feat(ci): report package sizes Added as a comment to the current pull request --- .forgejo/workflows/check.yml | 16 +++++- .gitignore | 1 + ci-scripts/report-size.sh | 102 +++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 2 deletions(-) create mode 100755 ci-scripts/report-size.sh diff --git a/.forgejo/workflows/check.yml b/.forgejo/workflows/check.yml index f736669..f8cb7d6 100644 --- a/.forgejo/workflows/check.yml +++ b/.forgejo/workflows/check.yml @@ -3,12 +3,15 @@ on: jobs: check: runs-on: nixos + needs: build steps: - uses: "https://code.forgejo.org/actions/checkout@v4" - run: nix --version - - run: nix flake check --keep-going --verbose + - name: Run Checks + run: nix flake check --keep-going --verbose build: runs-on: nixos + if: github.event_name == 'push' strategy: matrix: target: @@ -20,4 +23,13 @@ jobs: steps: - uses: "https://code.forgejo.org/actions/checkout@v4" - run: nix --version - - run: nix build --print-build-logs '.#${{ matrix.target }}' + - name: Build target + run: nix build --print-build-logs '.#${{ matrix.target }}' + report-size: + runs-on: nixos + needs: build + steps: + - uses: "https://git.salame.cl/actions/checkout@v4" + - run: nix --version + - name: Report Size + run: ci-scripts/report-size.sh diff --git a/.gitignore b/.gitignore index 880066b..040b2e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ result +result-* .direnv/ .pre-commit-config.yaml # ignore vm images diff --git a/ci-scripts/report-size.sh b/ci-scripts/report-size.sh new file mode 100755 index 0000000..0c9d038 --- /dev/null +++ b/ci-scripts/report-size.sh @@ -0,0 +1,102 @@ +#!/bin/sh + +set -eu + +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) + echo "Calculating size of $package" >&2 + row=$(nix path-info --size --closure-size --human-readable "$path" 2>/dev/null | + sed "s/^\(\S\+\)\(\s\+\)\(\S\+\)\(\s\+\)\(\S\+\)$/| \`$package\` | \3 | \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) + echo "Calculating size of $config" >&2 + row=$(nix path-info --size --closure-size --human-readable "$path" 2>/dev/null | + sed "s/^\(\S\+\)\(\s\+\)\(\S\+\)\(\s\+\)\(\S\+\)$/| \`$config\` | \3 | \5 |/") + table="$table$row +" + done + + printf '%s' "$table" +} + +markdown() { + cat <<-EOF + ## Outputs' size + + ### NixOS Configurations sizes + + $(configuration_size_table) + + + ### Package sizes + + $(package_size_table) + EOF +} + +if [ "${CI-false}" = "true" ]; then + pr_number=$(curl -X 'GET' \ + "$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/pulls?state=open&sort=recentupdate" \ + -H 'accept: application/json' | + jq --arg head_ref "$GITHUB_REF_NAME" '.[] | select(.head.ref == $head_ref) | .number') + + if [ -z "$pr_number" ]; then + echo "No PR created for this commit" + exit 0 + fi + + 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" >&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 + markdown +fi