Add macOS, oksh, osh, nsh, and gosh
#9
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Check Update Default Stack Size | |
| on: | |
| push: | |
| paths: | |
| - "orchestration/increase_default_stack_size.sh" | |
| pull_request: | |
| workflow_dispatch: | |
| # Also run weekly to ensure this doesn't inadvertently decay | |
| schedule: | |
| - cron: "0 0 * * 1" | |
| jobs: | |
| stack_size: | |
| strategy: | |
| matrix: | |
| os: [ubuntu-latest, ubuntu-24.04, ubuntu-22.04, macos-15-intel, macos-latest] | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 6.0.0 | |
| - name: Monero Daemon Cache | |
| id: cache-monerod | |
| uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # 4.2.4 | |
| with: | |
| path: monerod | |
| key: stack-size-monerod | |
| - name: Download the Monero Daemon | |
| if: steps.cache-monerod.outputs.cache-hit != 'true' | |
| run: | | |
| # We explicitly download the Linux binary as this script executes over an ELF binary | |
| wget https://downloads.getmonero.org/cli/monero-linux-x64-v0.18.4.4.tar.bz2 | |
| tar -xvf monero-linux-x64-v0.18.4.4.tar.bz2 | |
| mv $(find . -name monerod) . | |
| - name: Verify expected behavior | |
| shell: bash | |
| run: | | |
| STACK=$((8 * 1024 * 1024)) | |
| OS=${{ runner.os }} | |
| if [ "$OS" = "Linux" ]; then | |
| sudo apt update -y | |
| sudo apt install -y ksh bash dash zsh busybox posh mksh yash | |
| sudo ln -s "$(which busybox)" /usr/bin/ash | |
| sudo ln -s "$(which busybox)" /usr/bin/hush | |
| wget http://ftp.us.debian.org/debian/pool/main/g/gash/gash_0.3.1-1_amd64.deb | |
| sudo apt install ./gash_0.3.1-1_amd64.deb | |
| SHELLS="sh ksh bash dash zsh ash hush posh mksh lksh gash yash" | |
| fi | |
| # macOS has the benefit of packaging `oksh`, `osh`, and having distinct core tools | |
| if [ "$OS" = "macOS" ]; then | |
| brew install elfutils # Install `elfutils` for `chelf` has `elf.h` available | |
| brew install ksh93 bash dash-shell zsh posh mksh oksh yash oils-for-unix | |
| SHELLS="sh ksh bash dash zsh posh mksh oksh yash osh" | |
| fi | |
| # Install shells available via `cargo` | |
| cargo install brush-shell | |
| SHELLS="$SHELLS brush" | |
| # Install shells available via `go` | |
| GOBIN=$(pwd) go install github.com/u-root/u-root/cmds/core/gosh@latest | |
| SHELLS="$SHELLS gosh" | |
| cp monerod monerod-chelf | |
| git clone https://github.com/Gottox/chelf | |
| cd chelf | |
| git checkout b2994186cea7b7d61a588fd06c1cc1ae75bcc21a | |
| make | |
| ./chelf -s "$STACK" ../monerod-chelf | |
| cd .. | |
| cp monerod monerod-muslstack | |
| GOBIN=$(pwd) go install github.com/yaegashi/muslstack@d19cc5866abce3ca59dfc1666df7cc97097d0933 | |
| ./muslstack -s "$STACK" ./monerod-muslstack | |
| # Run our script with all installed shells | |
| for shell in $SHELLS; do | |
| cp monerod monerod-idss-$shell | |
| ln -s "$(which $shell)" sh | |
| ./sh ./orchestration/increase_default_stack_size.sh monerod-idss-$shell | |
| rm ./sh | |
| done | |
| # Verify they all had the same result | |
| sha256() { | |
| sha256sum "$1" | cut -d' ' -f1 | |
| } | |
| CHELF=$(sha256 monerod-chelf) | |
| find . -iname "monerod-*" | while read -r bin; do | |
| BIN=$(sha256 "$bin") | |
| if [ ! "$CHELF" = "$BIN" ]; then | |
| echo "Different artifact between monerod-chelf ($CHELF) and $bin ($BIN)" | |
| exit 1 | |
| fi | |
| done | |
| # Verify the integrity of the result | |
| read_stack() { | |
| STACK_INFO=$(readelf "$1" -l | grep STACK -A1) | |
| MEMSZ=$(printf "%s\n" "$STACK_INFO" | tail -n1 | sed -E s/^[[:space:]]*//g | cut -f2 -d' ') | |
| printf "%i" $((MEMSZ)) | |
| } | |
| INITIAL_STACK=$(read_stack monerod) | |
| if [ "$INITIAL_STACK" -ne "0" ]; then | |
| echo "Initial \`PT_GNU_STACK\` wasn't 0" | |
| exit 2 | |
| fi | |
| UPDATED_STACK=$(read_stack monerod-chelf) | |
| if [ "$UPDATED_STACK" -ne "$STACK" ]; then | |
| echo "Updated \`PT_GNU_STACK\` ($UPDATED_STACK) wasn't 8 MB ($STACK)" | |
| exit 3 | |
| fi | |
| # Only one byte should be different due to the bit pattern of 8 MB | |
| BYTES_DIFFERENT=$(cmp -l monerod monerod-chelf | wc -l || true) | |
| if [ "$BYTES_DIFFERENT" -ne 1 ]; then | |
| echo "More than one byte was different between the two binaries" | |
| exit 4 | |
| fi |