Skip to content

Commit a1a4f47

Browse files
committed
CICD.yml: Publish individual bins for stable tag
1 parent 562c5cc commit a1a4f47

1 file changed

Lines changed: 95 additions & 127 deletions

File tree

.github/workflows/CICD.yml

Lines changed: 95 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)