Skip to content

Commit 4e64092

Browse files
committed
CICD.yml: Publish individual bins for stable tag
1 parent 221a987 commit 4e64092

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@v14
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@v14
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 }
@@ -855,8 +731,8 @@ jobs:
855731
shell: bash
856732
if: matrix.job.skip-publish != true
857733
run: |
858-
## Build
859-
${{ steps.vars.outputs.CARGO_CMD }} ${{ steps.vars.outputs.CARGO_CMD_OPTIONS }} build --release --config=profile.release.strip=true \
734+
# libstdbuf is not stripped by cargo's config
735+
RUSTFLAGS="-C strip=symbols" ${{ steps.vars.outputs.CARGO_CMD }} ${{ steps.vars.outputs.CARGO_CMD_OPTIONS }} build --release ${{ matrix.job.individual }} \
860736
--target=${{ matrix.job.target }} ${{ matrix.job.cargo-options }} ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} ${{ steps.vars.outputs.CARGO_DEFAULT_FEATURES_OPTION }}
861737
- name: Package
862738
if: matrix.job.skip-publish != true
@@ -877,6 +753,13 @@ jobs:
877753
*) tar czf '${{ steps.vars.outputs.PKG_NAME }}' '${{ steps.vars.outputs.PKG_BASENAME }}'/* ;;
878754
esac
879755
popd >/dev/null
756+
- name: Package individual binaries
757+
if: matrix.job.individual != ''
758+
run: |
759+
mkdir -p individual
760+
(cd target/${{ matrix.job.target }}/release && mv $(./coreutils --list) -t ../../../individual ||:)
761+
individual/true --version
762+
ZSTD_CLEVEL=19 tar --zstd -caf individual-${{ matrix.job.target }}.tar.zst individual
880763
- name: Package manpages and completions
881764
if: matrix.job.target == 'x86_64-unknown-linux-gnu' && matrix.job.features == 'feat_os_unix,uudoc'
882765
run: |
@@ -899,6 +782,7 @@ jobs:
899782
files: |
900783
${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_NAME }}
901784
docs.tar.zst
785+
individual-${{ matrix.job.target }}.tar.zst
902786
env:
903787
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
904788
- name: Publish latest commit
@@ -911,8 +795,92 @@ jobs:
911795
files: |
912796
${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_NAME }}
913797
docs.tar.zst
798+
individual-${{ matrix.job.target }}.tar.zst
914799
env:
915800
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
801+
- name: Compute uutil release sizes
802+
if: matrix.job.individual != '' # todo: support all platforms
803+
shell: bash
804+
run: |
805+
## Compute uutil release sizes
806+
DATE=$(date --rfc-email)
807+
find individual -type f -printf '%f\0' | sort -z |
808+
while IFS= read -r -d '' name; do
809+
size=$(du -s individual/$name | awk '{print $1}')
810+
echo "\"$name\""
811+
echo "$size"
812+
done | \
813+
jq -n \
814+
--arg date "$DATE" \
815+
--arg sha "$GITHUB_SHA" \
816+
'reduce inputs as $name ({}; . + { ($name): input }) | { ($date): {sha: $sha, sizes: map_values(.)} }' > individual-size-result.json
817+
SIZE=$(cat individual-size-result.json | jq '[.[] | .sizes | .[]] | reduce .[] as $num (0; . + $num)')
818+
SIZE_MULTI=$(du -s target/${{ matrix.job.target }}/release/coreutils | awk '{print $1}')
819+
jq -n \
820+
--arg date "$DATE" \
821+
--arg sha "$GITHUB_SHA" \
822+
--arg size "$SIZE" \
823+
--arg multisize "$SIZE_MULTI" \
824+
'{($date): { sha: $sha, size: $size, multisize: $multisize, }}' > size-result.json
825+
- name: Download the previous individual size result
826+
if: matrix.job.individual != ''
827+
uses: dawidd6/action-download-artifact@v12
828+
with:
829+
workflow: CICD.yml
830+
name: individual-size-result
831+
repo: uutils/coreutils
832+
path: dl
833+
- name: Download the previous size result
834+
if: matrix.job.individual != ''
835+
uses: dawidd6/action-download-artifact@v12
836+
with:
837+
workflow: CICD.yml
838+
name: size-result
839+
repo: uutils/coreutils
840+
path: dl
841+
- name: Check uutil release sizes
842+
if: matrix.job.individual != ''
843+
shell: bash
844+
run: |
845+
check() {
846+
# Warn if the size increases by more than 5%
847+
threshold='1.05'
848+
849+
if [[ "$2" -eq 0 || "$3" -eq 0 ]]; then
850+
echo "::warning file=$4::Invalid size for $1. Sizes cannot be 0."
851+
return
852+
fi
853+
854+
ratio=$(jq -n "$2 / $3")
855+
echo "$1: size=$2, previous_size=$3, ratio=$ratio, threshold=$threshold"
856+
if [[ "$(jq -n "$ratio > $threshold")" == 'true' ]]; then
857+
echo "::warning file=$4::Size of $1 increases by more than 5%"
858+
fi
859+
}
860+
## Check individual size result
861+
while read -r name previous_size; do
862+
size=$(cat individual-size-result.json | jq -r ".[] | .sizes | .\"$name\"")
863+
check "\`$name\` binary" "$size" "$previous_size" 'individual-size-result.json'
864+
done < <(cat dl/individual-size-result.json | jq -r '.[] | .sizes | to_entries[] | "\(.key) \(.value)"')
865+
## Check size result
866+
size=$(cat size-result.json | jq -r '.[] | .size')
867+
previous_size=$(cat dl/size-result.json | jq -r '.[] | .size')
868+
check 'multiple binaries' "$size" "$previous_size" 'size-result.json'
869+
multisize=$(cat size-result.json | jq -r '.[] | .multisize')
870+
previous_multisize=$(cat dl/size-result.json | jq -r '.[] | .multisize')
871+
check 'multicall binary' "$multisize" "$previous_multisize" 'size-result.json'
872+
- name: Upload the individual size result
873+
if: matrix.job.individual != ''
874+
uses: actions/upload-artifact@v6
875+
with:
876+
name: individual-size-result
877+
path: individual-size-result.json
878+
- name: Upload the size result
879+
if: matrix.job.individual != ''
880+
uses: actions/upload-artifact@v6
881+
with:
882+
name: size-result
883+
path: size-result.json
916884

917885
test_busybox:
918886
name: Tests/BusyBox test suite

0 commit comments

Comments
 (0)