@@ -478,130 +478,6 @@ jobs:
478478 flags : nightly,${{ matrix.job.os }}
479479 fail_ci_if_error : false
480480
481- compute_size :
482- name : Binary sizes
483- needs : [ min_version, deps ]
484- runs-on : ${{ matrix.job.os }}
485- permissions :
486- contents : write
487- env :
488- SCCACHE_GHA_ENABLED : " true"
489- RUSTC_WRAPPER : " sccache"
490- CARGO_INCREMENTAL : 0
491- strategy :
492- fail-fast : false
493- matrix :
494- job :
495- - { os: ubuntu-latest , features: feat_os_unix }
496- steps :
497- - uses : actions/checkout@v6
498- with :
499- persist-credentials : false
500- - uses : dtolnay/rust-toolchain@stable
501- - uses : Swatinem/rust-cache@v2
502- - name : Run sccache-cache
503- uses : mozilla-actions/sccache-action@v0.0.9
504- - name : " `make install PROFILE=release-fast`"
505- shell : bash
506- run : |
507- export CARGO_TARGET_DIR=cargo-target RUSTFLAGS="${RUSTFLAGS} -C strip=symbols" PROFILE=release-fast MANPAGES=n COMPLETIONS=n LOCALES=n
508- mkdir -p "${CARGO_TARGET_DIR}" && sudo mount -t tmpfs -o noatime,size=16G tmpfs "${CARGO_TARGET_DIR}"
509- make install DESTDIR=target/size-release/
510- make install COMPLETIONS=n MULTICALL=y LN="ln -vf" DESTDIR=target/size-multi-release/
511- ZSTD_CLEVEL=19 tar --zstd -caf individual-x86_64-unknown-linux-gnu.tar.zst -C target/size-release/usr/local bin
512- - name : Publish
513- uses : softprops/action-gh-release@v2
514- if : github.event_name == 'push' && github.ref == 'refs/heads/main'
515- with :
516- tag_name : latest-commit
517- draft : false
518- prerelease : true
519- files : |
520- individual-x86_64-unknown-linux-gnu.tar.zst
521- env :
522- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
523- - name : Test for hardlinks
524- shell : bash
525- run : |
526- [ $(stat -c %i target/size-multi-release/usr/local/bin/cp) = $(stat -c %i target/size-multi-release/usr/local/bin/coreutils) ]
527- - name : Compute uutil release sizes
528- shell : bash
529- run : |
530- ## Compute uutil release sizes
531- DATE=$(date --rfc-email)
532- find target/size-release/usr/local/bin -type f -printf '%f\0' | sort -z |
533- while IFS= read -r -d '' name; do
534- size=$(du -s target/size-release/usr/local/bin/$name | awk '{print $1}')
535- echo "\"$name\""
536- echo "$size"
537- done | \
538- jq -n \
539- --arg date "$DATE" \
540- --arg sha "$GITHUB_SHA" \
541- 'reduce inputs as $name ({}; . + { ($name): input }) | { ($date): {sha: $sha, sizes: map_values(.)} }' > individual-size-result.json
542- SIZE=$(cat individual-size-result.json | jq '[.[] | .sizes | .[]] | reduce .[] as $num (0; . + $num)')
543- SIZE_MULTI=$(du -s target/size-multi-release/usr/local/bin/coreutils | awk '{print $1}')
544- jq -n \
545- --arg date "$DATE" \
546- --arg sha "$GITHUB_SHA" \
547- --arg size "$SIZE" \
548- --arg multisize "$SIZE_MULTI" \
549- '{($date): { sha: $sha, size: $size, multisize: $multisize, }}' > size-result.json
550- - name : Download the previous individual size result
551- uses : dawidd6/action-download-artifact@v13
552- with :
553- workflow : CICD.yml
554- name : individual-size-result
555- repo : uutils/coreutils
556- path : dl
557- - name : Download the previous size result
558- uses : dawidd6/action-download-artifact@v13
559- with :
560- workflow : CICD.yml
561- name : size-result
562- repo : uutils/coreutils
563- path : dl
564- - name : Check uutil release sizes
565- shell : bash
566- run : |
567- check() {
568- # Warn if the size increases by more than 5%
569- threshold='1.05'
570-
571- if [[ "$2" -eq 0 || "$3" -eq 0 ]]; then
572- echo "::warning file=$4::Invalid size for $1. Sizes cannot be 0."
573- return
574- fi
575-
576- ratio=$(jq -n "$2 / $3")
577- echo "$1: size=$2, previous_size=$3, ratio=$ratio, threshold=$threshold"
578- if [[ "$(jq -n "$ratio > $threshold")" == 'true' ]]; then
579- echo "::warning file=$4::Size of $1 increases by more than 5%"
580- fi
581- }
582- ## Check individual size result
583- while read -r name previous_size; do
584- size=$(cat individual-size-result.json | jq -r ".[] | .sizes | .\"$name\"")
585- check "\`$name\` binary" "$size" "$previous_size" 'individual-size-result.json'
586- done < <(cat dl/individual-size-result.json | jq -r '.[] | .sizes | to_entries[] | "\(.key) \(.value)"')
587- ## Check size result
588- size=$(cat size-result.json | jq -r '.[] | .size')
589- previous_size=$(cat dl/size-result.json | jq -r '.[] | .size')
590- check 'multiple binaries' "$size" "$previous_size" 'size-result.json'
591- multisize=$(cat size-result.json | jq -r '.[] | .multisize')
592- previous_multisize=$(cat dl/size-result.json | jq -r '.[] | .multisize')
593- check 'multicall binary' "$multisize" "$previous_multisize" 'size-result.json'
594- - name : Upload the individual size result
595- uses : actions/upload-artifact@v6
596- with :
597- name : individual-size-result
598- path : individual-size-result.json
599- - name : Upload the size result
600- uses : actions/upload-artifact@v6
601- with :
602- name : size-result
603- path : size-result.json
604-
605481 build :
606482 permissions :
607483 contents : write # to create GitHub release (softprops/action-gh-release)
@@ -628,7 +504,7 @@ jobs:
628504 - { os: ubuntu-latest , target: i686-unknown-linux-gnu , features: "feat_os_unix,test_risky_names", use-cross: use-cross }
629505 - { os: ubuntu-latest , target: i686-unknown-linux-musl , features: feat_os_unix_musl , use-cross: use-cross }
630506 - { os: ubuntu-latest , target: x86_64-unknown-linux-gnu , features: "feat_os_unix,test_risky_names", use-cross: use-cross, skip-publish: true }
631- - { os: ubuntu-latest , target: x86_64-unknown-linux-gnu , features: "feat_os_unix,uudoc" , use-cross: no, workspace-tests: true }
507+ - { os: ubuntu-latest, target: x86_64-unknown-linux-gnu, features: "feat_os_unix,uudoc", use-cross: no, workspace-tests: true, individual: "--workspace --bins --config=profile.release.codegen-units=1 --exclude uu_runcon --exclude uu_chcon" }
632508 - { os: ubuntu-latest , target: x86_64-unknown-linux-musl , features: feat_os_unix_musl , use-cross: use-cross }
633509 - { os: ubuntu-latest , target: x86_64-unknown-redox , features: feat_os_unix_redox , use-cross: redoxer , skip-tests: true }
634510 - { os: ubuntu-latest , target: wasm32-unknown-unknown , default-features: false, features: uucore/format, skip-tests: true, skip-package: true, skip-publish: true }
@@ -844,8 +720,8 @@ jobs:
844720 - name : Build
845721 shell : bash
846722 run : |
847- ## Build
848- ${{ steps.vars.outputs.CARGO_CMD }} ${{ steps.vars.outputs.CARGO_CMD_OPTIONS }} build --release --config=profile.release.strip=true \
723+ # libstdbuf is not stripped by cargo's config
724+ RUSTFLAGS="-C strip=symbols" ${{ steps.vars.outputs.CARGO_CMD }} ${{ steps.vars.outputs.CARGO_CMD_OPTIONS }} build --release ${{ matrix.job.individual }} \
849725 --target=${{ matrix.job.target }} ${{ matrix.job.cargo-options }} ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} ${{ steps.vars.outputs.CARGO_DEFAULT_FEATURES_OPTION }}
850726 - name : Test
851727 if : matrix.job.skip-tests != true
@@ -881,6 +757,13 @@ jobs:
881757 *) tar czf '${{ steps.vars.outputs.PKG_NAME }}' '${{ steps.vars.outputs.PKG_BASENAME }}'/* ;;
882758 esac
883759 popd >/dev/null
760+ - name : Package individual binaries
761+ if : matrix.job.individual != ''
762+ run : |
763+ mkdir -p individual
764+ (cd target/${{ matrix.job.target }}/release && mv $(./coreutils --list) -t ../../../individual ||:)
765+ individual/true --version
766+ ZSTD_CLEVEL=19 tar --zstd -caf individual-${{ matrix.job.target }}.tar.zst individual
884767 - name : Package manpages and completions
885768 if : matrix.job.target == 'x86_64-unknown-linux-gnu' && matrix.job.features == 'feat_os_unix,uudoc'
886769 run : |
@@ -903,6 +786,7 @@ jobs:
903786 files : |
904787 ${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_NAME }}
905788 docs.tar.zst
789+ individual-${{ matrix.job.target }}.tar.zst
906790 env :
907791 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
908792 - name : Publish latest commit
@@ -915,8 +799,92 @@ jobs:
915799 files : |
916800 ${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_NAME }}
917801 docs.tar.zst
802+ individual-${{ matrix.job.target }}.tar.zst
918803 env :
919804 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
805+ - name : Compute uutil release sizes
806+ if : matrix.job.individual != '' # todo: support all platforms
807+ shell : bash
808+ run : |
809+ ## Compute uutil release sizes
810+ DATE=$(date --rfc-email)
811+ find individual -type f -printf '%f\0' | sort -z |
812+ while IFS= read -r -d '' name; do
813+ size=$(du -s individual/$name | awk '{print $1}')
814+ echo "\"$name\""
815+ echo "$size"
816+ done | \
817+ jq -n \
818+ --arg date "$DATE" \
819+ --arg sha "$GITHUB_SHA" \
820+ 'reduce inputs as $name ({}; . + { ($name): input }) | { ($date): {sha: $sha, sizes: map_values(.)} }' > individual-size-result.json
821+ SIZE=$(cat individual-size-result.json | jq '[.[] | .sizes | .[]] | reduce .[] as $num (0; . + $num)')
822+ SIZE_MULTI=$(du -s target/${{ matrix.job.target }}/release/coreutils | awk '{print $1}')
823+ jq -n \
824+ --arg date "$DATE" \
825+ --arg sha "$GITHUB_SHA" \
826+ --arg size "$SIZE" \
827+ --arg multisize "$SIZE_MULTI" \
828+ '{($date): { sha: $sha, size: $size, multisize: $multisize, }}' > size-result.json
829+ - name : Download the previous individual size result
830+ if : matrix.job.individual != ''
831+ uses : dawidd6/action-download-artifact@v12
832+ with :
833+ workflow : CICD.yml
834+ name : individual-size-result
835+ repo : uutils/coreutils
836+ path : dl
837+ - name : Download the previous size result
838+ if : matrix.job.individual != ''
839+ uses : dawidd6/action-download-artifact@v12
840+ with :
841+ workflow : CICD.yml
842+ name : size-result
843+ repo : uutils/coreutils
844+ path : dl
845+ - name : Check uutil release sizes
846+ if : matrix.job.individual != ''
847+ shell : bash
848+ run : |
849+ check() {
850+ # Warn if the size increases by more than 5%
851+ threshold='1.05'
852+
853+ if [[ "$2" -eq 0 || "$3" -eq 0 ]]; then
854+ echo "::warning file=$4::Invalid size for $1. Sizes cannot be 0."
855+ return
856+ fi
857+
858+ ratio=$(jq -n "$2 / $3")
859+ echo "$1: size=$2, previous_size=$3, ratio=$ratio, threshold=$threshold"
860+ if [[ "$(jq -n "$ratio > $threshold")" == 'true' ]]; then
861+ echo "::warning file=$4::Size of $1 increases by more than 5%"
862+ fi
863+ }
864+ ## Check individual size result
865+ while read -r name previous_size; do
866+ size=$(cat individual-size-result.json | jq -r ".[] | .sizes | .\"$name\"")
867+ check "\`$name\` binary" "$size" "$previous_size" 'individual-size-result.json'
868+ done < <(cat dl/individual-size-result.json | jq -r '.[] | .sizes | to_entries[] | "\(.key) \(.value)"')
869+ ## Check size result
870+ size=$(cat size-result.json | jq -r '.[] | .size')
871+ previous_size=$(cat dl/size-result.json | jq -r '.[] | .size')
872+ check 'multiple binaries' "$size" "$previous_size" 'size-result.json'
873+ multisize=$(cat size-result.json | jq -r '.[] | .multisize')
874+ previous_multisize=$(cat dl/size-result.json | jq -r '.[] | .multisize')
875+ check 'multicall binary' "$multisize" "$previous_multisize" 'size-result.json'
876+ - name : Upload the individual size result
877+ if : matrix.job.individual != ''
878+ uses : actions/upload-artifact@v6
879+ with :
880+ name : individual-size-result
881+ path : individual-size-result.json
882+ - name : Upload the size result
883+ if : matrix.job.individual != ''
884+ uses : actions/upload-artifact@v6
885+ with :
886+ name : size-result
887+ path : size-result.json
920888
921889 test_busybox :
922890 name : Tests/BusyBox test suite
0 commit comments