# Nix Flake outputs size

Use `nix path-info` to query the size of flake outputs and produce a report.

This repost can be posted to a PR (as formatted markdown) and/or uploaded as a
workflow artifact.

Requires `nix`, `jq`, `curl`, `sed`, `gunzip`, `tar` and `coreutils` to be in
the runner's path.

## Example

```yaml
- name: Generate size report
  uses: https://git.salame.cl/jalil/nix-flake-outputs-size@main
  with: # Default values
    comment-on-pr: 'true'
    generate-artifact: 'false'
    artifact-name: 'size-report.md'
    # If you want to enable comparisons set this to true
    do-comparison: 'false'
    job-name: '' # required if do-comparison is true
    # This is the branch that will be compared against
    base-branch: ${{ github.base_ref }} # or default branch if missing
```

For more details see the [action.yaml](./action.yml) file.

**How it looks:**

<details><summary>Example comment screenshot:</summary>

![example comment generated by this action](./example-comment.png)

</details>

<details><summary>Example output as text:</summary>

# 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).
- `[NAR] Size Change`: the amount changed compared to the main branch.

**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.

# NixOS Configurations

| Name     |  Size | Size Change | NAR Size | NAR Size Change |
| -------- | ----: | ----------: | -------: | --------------: |
| `gemini` |  11Gi |      -2.4Mi |     28Ki |               0 |
| `leo`    | 1.6Gi |           0 |     25Ki |               0 |
| `libra`  | 9.4Gi |      -2.4Mi |     28Ki |               0 |
| `taurus` | 7.6Gi |           0 |     34Ki |               0 |

</details>
