mirror of
https://github.com/masonr/yet-another-bench-script.git
synced 2026-11-07 08:22:53 +08:00
Compare commits
6 Commits
bf41ddf401
...
iperf3-3.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
14cf7fe435 | ||
|
|
316260707a | ||
|
|
ad1af039ce | ||
|
|
7d27d65cb3 | ||
|
|
e29813716c | ||
|
|
c0aa5b8870 |
148
.github/workflows/build-fio.yml
vendored
148
.github/workflows/build-fio.yml
vendored
@@ -2,23 +2,30 @@ name: Build fio Static Binaries
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
# check upstream for a new fio release once a day
|
||||||
|
- cron: '23 5 * * *'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-release:
|
check-release:
|
||||||
runs-on: self-hosted
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
latest-version: ${{ steps.get-version.outputs.version }}
|
latest-version: ${{ steps.get-version.outputs.version }}
|
||||||
should-build: ${{ steps.check-version.outputs.should-build }}
|
should-build: ${{ steps.check-version.outputs.should-build }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Get latest fio release
|
- name: Get latest fio release
|
||||||
id: get-version
|
id: get-version
|
||||||
run: |
|
run: |
|
||||||
# Get the latest release tag from GitHub API
|
# Get the latest release tag from GitHub API (e.g. "fio-3.41")
|
||||||
LATEST_VERSION=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s https://api.github.com/repos/axboe/fio/releases/latest | jq -r '.tag_name')
|
LATEST_VERSION=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s https://api.github.com/repos/axboe/fio/releases/latest | jq -r '.tag_name')
|
||||||
echo "Latest fio version: $LATEST_VERSION"
|
echo "Latest fio version: $LATEST_VERSION"
|
||||||
|
if [ -z "$LATEST_VERSION" ] || [ "$LATEST_VERSION" = "null" ]; then
|
||||||
|
echo "Failed to determine latest fio version"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
echo "version=$LATEST_VERSION" >> $GITHUB_OUTPUT
|
echo "version=$LATEST_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Check if version exists in releases
|
- name: Check if version exists in releases
|
||||||
@@ -26,8 +33,9 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
VERSION="${{ steps.get-version.outputs.version }}"
|
VERSION="${{ steps.get-version.outputs.version }}"
|
||||||
|
|
||||||
# Check if this version already exists in our releases
|
# Check if this version already exists in our releases (upstream tag is
|
||||||
if gh release view "fio-$VERSION" --repo ${{ github.repository }} >/dev/null 2>&1; then
|
# already prefixed, e.g. "fio-3.41", so it can be used as-is)
|
||||||
|
if gh release view "$VERSION" --repo ${{ github.repository }} >/dev/null 2>&1; then
|
||||||
echo "Version $VERSION already exists in releases"
|
echo "Version $VERSION already exists in releases"
|
||||||
echo "should-build=false" >> $GITHUB_OUTPUT
|
echo "should-build=false" >> $GITHUB_OUTPUT
|
||||||
else
|
else
|
||||||
@@ -40,8 +48,9 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
needs: check-release
|
needs: check-release
|
||||||
if: needs.check-release.outputs.should-build == 'true'
|
if: needs.check-release.outputs.should-build == 'true'
|
||||||
runs-on: self-hosted
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- arch: x64
|
- arch: x64
|
||||||
@@ -58,21 +67,10 @@ jobs:
|
|||||||
host: arm-linux-gnueabihf
|
host: arm-linux-gnueabihf
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Create compilation script
|
- name: Create compilation script
|
||||||
run: |
|
run: |
|
||||||
VERSION="${{ needs.check-release.outputs.latest-version }}"
|
|
||||||
ARCH="${{ matrix.arch }}"
|
|
||||||
CROSS="${{ matrix.cross }}"
|
|
||||||
HOST="${{ matrix.host }}"
|
|
||||||
|
|
||||||
# Single script for all architectures using musl cross-compilation
|
# Single script for all architectures using musl cross-compilation
|
||||||
cat > compile-fio.sh << EOF
|
cat > compile-fio.sh << 'EOF'
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
@@ -88,51 +86,53 @@ jobs:
|
|||||||
yum install -y yum-plugin-ovl # fix for docker overlay fs
|
yum install -y yum-plugin-ovl # fix for docker overlay fs
|
||||||
yum install -y xz
|
yum install -y xz
|
||||||
|
|
||||||
# download musl cross compilation toolchain
|
# download musl cross compilation toolchain - mirrored as a release asset on
|
||||||
|
# this repo since musl.cc blocks GitHub Actions IP ranges (musl.cc fallback
|
||||||
|
# kept for local runs)
|
||||||
cd ~
|
cd ~
|
||||||
curl -L -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://musl.cc/\$CROSS-cross.tgz" -o "\$CROSS-cross.tgz"
|
curl -fL -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://github.com/masonr/yet-another-bench-script/releases/download/toolchains/$CROSS-cross.tgz" -o "$CROSS-cross.tgz" \
|
||||||
tar xf "\$CROSS-cross.tgz"
|
|| curl -fL -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://musl.cc/$CROSS-cross.tgz" -o "$CROSS-cross.tgz"
|
||||||
|
tar xf "$CROSS-cross.tgz"
|
||||||
|
|
||||||
# download, compile, and install libaio as static library
|
# download, compile, and install libaio as static library
|
||||||
cd ~
|
cd ~
|
||||||
curl -L -4 --retry 5 --retry-delay 2 --connect-timeout 15 http://ftp.de.debian.org/debian/pool/main/liba/libaio/libaio_0.3.113.orig.tar.gz -o "libaio.tar.gz"
|
curl -L -4 --retry 5 --retry-delay 2 --connect-timeout 15 http://ftp.de.debian.org/debian/pool/main/liba/libaio/libaio_0.3.113.orig.tar.gz -o "libaio.tar.gz"
|
||||||
tar xf libaio.tar.gz
|
tar xf libaio.tar.gz
|
||||||
cd libaio-*/src
|
cd libaio-*/src
|
||||||
CC=/root/\$CROSS-cross/bin/\$CROSS-gcc ENABLE_SHARED=0 make prefix=/hbb_exe install
|
CC=/root/$CROSS-cross/bin/$CROSS-gcc ENABLE_SHARED=0 make prefix=/hbb_exe install
|
||||||
|
|
||||||
# Activate Holy Build Box exe compilation environment
|
# Activate Holy Build Box exe compilation environment
|
||||||
source /hbb_exe/activate
|
source /hbb_exe/activate
|
||||||
|
|
||||||
# download and compile fio
|
# download and compile fio
|
||||||
cd ~
|
cd ~
|
||||||
curl -L -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://github.com/axboe/fio/archive/\$VERSION.tar.gz" -o "fio.tar.gz"
|
curl -L -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://github.com/axboe/fio/archive/$VERSION.tar.gz" -o "fio.tar.gz"
|
||||||
tar xf fio.tar.gz
|
tar xf fio.tar.gz
|
||||||
cd fio-\${VERSION#fio-}*
|
cd fio-fio-*
|
||||||
CC=/root/\$CROSS-cross/bin/\$CROSS-gcc ./configure --disable-native --build-static
|
# fio >= 3.42 includes both linux/prctl.h and sys/prctl.h in backend.c, which
|
||||||
make
|
# redefines struct prctl_mm_map under musl; sys/prctl.h alone is sufficient
|
||||||
|
sed -i '/#include <linux\/prctl.h>/d' backend.c
|
||||||
|
CC=/root/$CROSS-cross/bin/$CROSS-gcc ./configure --disable-native --build-static
|
||||||
|
# link against libatomic for 32-bit/ARM targets that lack native 64-bit atomics
|
||||||
|
make EXTLIBS+=' -latomic'
|
||||||
|
|
||||||
# verify no external shared library links
|
# verify no external shared library links
|
||||||
libcheck fio
|
libcheck fio
|
||||||
# copy fio binary to mounted dir
|
# copy fio binary to mounted dir
|
||||||
cp fio "/io/fio_\$ARCH"
|
cp fio "/io/fio_$ARCH"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
chmod +x compile-fio.sh
|
chmod +x compile-fio.sh
|
||||||
|
|
||||||
- name: Compile fio binary
|
- name: Compile fio binary
|
||||||
run: |
|
run: |
|
||||||
ARCH="${{ matrix.arch }}"
|
|
||||||
CROSS="${{ matrix.cross }}"
|
|
||||||
HOST="${{ matrix.host }}"
|
|
||||||
|
|
||||||
# Use musl cross-compilation for all architectures
|
# Use musl cross-compilation for all architectures
|
||||||
docker run --rm -v $(pwd):/io --env ARCH=$ARCH --env CROSS=$CROSS --env HOST=$HOST --env VERSION="${{ needs.check-release.outputs.latest-version }}" phusion/holy-build-box-64:latest bash /io/compile-fio.sh
|
docker run --rm -v $(pwd):/io --env ARCH=${{ matrix.arch }} --env CROSS=${{ matrix.cross }} --env HOST=${{ matrix.host }} --env VERSION="${{ needs.check-release.outputs.latest-version }}" phusion/holy-build-box-64:latest bash /io/compile-fio.sh
|
||||||
|
|
||||||
- name: Verify binary
|
- name: Verify binary
|
||||||
run: |
|
run: |
|
||||||
ARCH="${{ matrix.arch }}"
|
ls -la fio_${{ matrix.arch }}
|
||||||
ls -la fio_$ARCH
|
file fio_${{ matrix.arch }}
|
||||||
file fio_$ARCH
|
|
||||||
|
|
||||||
- name: Upload binary as artifact
|
- name: Upload binary as artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -144,7 +144,7 @@ jobs:
|
|||||||
virustotal-scan:
|
virustotal-scan:
|
||||||
needs: [check-release, build]
|
needs: [check-release, build]
|
||||||
if: needs.check-release.outputs.should-build == 'true'
|
if: needs.check-release.outputs.should-build == 'true'
|
||||||
runs-on: self-hosted
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
scan-results: ${{ steps.scan-summary.outputs.results }}
|
scan-results: ${{ steps.scan-summary.outputs.results }}
|
||||||
all-clean: ${{ steps.scan-summary.outputs.all-clean }}
|
all-clean: ${{ steps.scan-summary.outputs.all-clean }}
|
||||||
@@ -168,7 +168,6 @@ jobs:
|
|||||||
echo "|--------|--------|-----------|------------|------------|----------------|" >> scan_results.md
|
echo "|--------|--------|-----------|------------|------------|----------------|" >> scan_results.md
|
||||||
|
|
||||||
ALL_CLEAN=true
|
ALL_CLEAN=true
|
||||||
SCAN_DATA=""
|
|
||||||
|
|
||||||
for binary in scan-binaries/fio_*; do
|
for binary in scan-binaries/fio_*; do
|
||||||
filename=$(basename "$binary")
|
filename=$(basename "$binary")
|
||||||
@@ -196,28 +195,31 @@ jobs:
|
|||||||
echo "${filename}:${analysis_id}" >> analysis_ids.txt
|
echo "${filename}:${analysis_id}" >> analysis_ids.txt
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "all_clean_upload=$ALL_CLEAN" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
# Wait 2 minutes for scans to complete
|
|
||||||
echo "Waiting 2 minutes for VirusTotal scans to complete..."
|
|
||||||
sleep 120
|
|
||||||
|
|
||||||
- name: Retrieve VirusTotal scan results
|
- name: Retrieve VirusTotal scan results
|
||||||
id: get-results
|
id: get-results
|
||||||
run: |
|
run: |
|
||||||
ALL_CLEAN=true
|
ALL_CLEAN=true
|
||||||
SCAN_SUMMARY=""
|
|
||||||
|
|
||||||
|
# Poll each analysis until it completes; VirusTotal scans can take a few
|
||||||
|
# minutes after upload, so allow up to ~5 minutes per binary (10 polls,
|
||||||
|
# 30s apart) before giving up. Files are processed sequentially, so by
|
||||||
|
# the time the first completes the rest are usually already done.
|
||||||
while IFS=':' read -r filename analysis_id; do
|
while IFS=':' read -r filename analysis_id; do
|
||||||
echo "Retrieving results for $filename (ID: $analysis_id)..."
|
echo "Retrieving results for $filename (ID: $analysis_id)..."
|
||||||
|
|
||||||
# Get scan results
|
status="queued"
|
||||||
result_response=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s --request GET \
|
for ((attempts=1; attempts<=10; attempts++)); do
|
||||||
--url "https://www.virustotal.com/api/v3/analyses/$analysis_id" \
|
# Get scan results
|
||||||
--header 'accept: application/json' \
|
result_response=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s --request GET \
|
||||||
--header "x-apikey: ${{ secrets.VIRUSTOTAL_API_KEY }}")
|
--url "https://www.virustotal.com/api/v3/analyses/$analysis_id" \
|
||||||
|
--header 'accept: application/json' \
|
||||||
|
--header "x-apikey: ${{ secrets.VIRUSTOTAL_API_KEY }}")
|
||||||
|
|
||||||
status=$(echo "$result_response" | jq -r '.data.attributes.status // "unknown"')
|
status=$(echo "$result_response" | jq -r '.data.attributes.status // "unknown"')
|
||||||
|
[ "$status" = "completed" ] && break
|
||||||
|
echo "$filename still scanning (attempt $attempts of 10), waiting 30s..."
|
||||||
|
sleep 30
|
||||||
|
done
|
||||||
|
|
||||||
if [ "$status" = "completed" ]; then
|
if [ "$status" = "completed" ]; then
|
||||||
malicious=$(echo "$result_response" | jq -r '.data.attributes.stats.malicious // 0')
|
malicious=$(echo "$result_response" | jq -r '.data.attributes.stats.malicious // 0')
|
||||||
@@ -239,7 +241,7 @@ jobs:
|
|||||||
echo "| $filename | $status_text | $malicious | $suspicious | $undetected | [$file_hash]($vt_url) |" >> scan_results.md
|
echo "| $filename | $status_text | $malicious | $suspicious | $undetected | [$file_hash]($vt_url) |" >> scan_results.md
|
||||||
|
|
||||||
else
|
else
|
||||||
echo "| $filename | ⏳ Pending | N/A | N/A | N/A | Scan not completed |" >> scan_results.md
|
echo "| $filename | ⏳ Timed out | N/A | N/A | N/A | Scan did not complete in ~5 min |" >> scan_results.md
|
||||||
ALL_CLEAN=false
|
ALL_CLEAN=false
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -253,13 +255,15 @@ jobs:
|
|||||||
- name: Create scan summary
|
- name: Create scan summary
|
||||||
id: scan-summary
|
id: scan-summary
|
||||||
run: |
|
run: |
|
||||||
RESULTS=$(cat scan_results.md)
|
|
||||||
ALL_CLEAN="${{ steps.get-results.outputs.all_clean }}"
|
ALL_CLEAN="${{ steps.get-results.outputs.all_clean }}"
|
||||||
|
|
||||||
# Escape newlines for GitHub output
|
# Pass the scan results through as a multi-line output (heredoc delimiter
|
||||||
RESULTS_ESCAPED=$(echo "$RESULTS" | sed ':a;N;$!ba;s/\n/\\n/g')
|
# syntax) so the markdown table renders correctly in the release body
|
||||||
|
{
|
||||||
echo "results=$RESULTS_ESCAPED" >> $GITHUB_OUTPUT
|
echo "results<<RESULTS_EOF"
|
||||||
|
cat scan_results.md
|
||||||
|
echo "RESULTS_EOF"
|
||||||
|
} >> $GITHUB_OUTPUT
|
||||||
echo "all-clean=$ALL_CLEAN" >> $GITHUB_OUTPUT
|
echo "all-clean=$ALL_CLEAN" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Upload scan results as artifact
|
- name: Upload scan results as artifact
|
||||||
@@ -274,11 +278,8 @@ jobs:
|
|||||||
create-release:
|
create-release:
|
||||||
needs: [check-release, build, virustotal-scan]
|
needs: [check-release, build, virustotal-scan]
|
||||||
if: needs.check-release.outputs.should-build == 'true' && needs.virustotal-scan.outputs.all-clean == 'true'
|
if: needs.check-release.outputs.should-build == 'true' && needs.virustotal-scan.outputs.all-clean == 'true'
|
||||||
runs-on: self-hosted
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Download all artifacts
|
- name: Download all artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -291,6 +292,13 @@ jobs:
|
|||||||
find artifacts -name "fio_*" -type f -exec cp {} release-assets/ \;
|
find artifacts -name "fio_*" -type f -exec cp {} release-assets/ \;
|
||||||
ls -la release-assets/
|
ls -la release-assets/
|
||||||
|
|
||||||
|
- name: Download upstream source tarball
|
||||||
|
run: |
|
||||||
|
# Attach the exact upstream source these binaries were built from
|
||||||
|
# (fio is GPL-2.0; distributing binaries requires offering the source)
|
||||||
|
curl -L --retry 5 --retry-delay 2 --connect-timeout 15 "https://github.com/axboe/fio/archive/${{ needs.check-release.outputs.latest-version }}.tar.gz" -o "release-assets/${{ needs.check-release.outputs.latest-version }}.tar.gz"
|
||||||
|
ls -la release-assets/
|
||||||
|
|
||||||
- name: Generate SHA256 checksums
|
- name: Generate SHA256 checksums
|
||||||
run: |
|
run: |
|
||||||
cd release-assets
|
cd release-assets
|
||||||
@@ -304,12 +312,12 @@ jobs:
|
|||||||
path: vt-results
|
path: vt-results
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
tag_name: fio-${{ needs.check-release.outputs.latest-version }}
|
tag_name: ${{ needs.check-release.outputs.latest-version }}
|
||||||
name: fio ${{ needs.check-release.outputs.latest-version }} Static Binaries
|
name: ${{ needs.check-release.outputs.latest-version }} Static Binaries
|
||||||
body: |
|
body: |
|
||||||
Static binaries for fio ${{ needs.check-release.outputs.latest-version }}
|
Static binaries for ${{ needs.check-release.outputs.latest-version }}
|
||||||
|
|
||||||
Built using musl toolchains for maximum compatibility.
|
Built using musl toolchains for maximum compatibility.
|
||||||
|
|
||||||
@@ -330,10 +338,14 @@ jobs:
|
|||||||
sha256sum -c fio-checksums.sha256
|
sha256sum -c fio-checksums.sha256
|
||||||
```
|
```
|
||||||
|
|
||||||
For usage in YABS script, place these binaries in the `bin/fio/` directory.
|
**License & Source:**
|
||||||
|
fio is licensed under [GPL-2.0](https://github.com/axboe/fio/blob/master/COPYING) (© Jens Axboe).
|
||||||
|
These are unofficial static builds produced by CI for use by [YABS](https://github.com/masonr/yet-another-bench-script);
|
||||||
|
the exact upstream source is attached as `${{ needs.check-release.outputs.latest-version }}.tar.gz`.
|
||||||
files: |
|
files: |
|
||||||
release-assets/fio_*
|
release-assets/fio_*
|
||||||
release-assets/fio-checksums.sha256
|
release-assets/fio-checksums.sha256
|
||||||
|
release-assets/*.tar.gz
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
env:
|
env:
|
||||||
@@ -342,7 +354,7 @@ jobs:
|
|||||||
notify-failure:
|
notify-failure:
|
||||||
needs: [check-release, build, virustotal-scan]
|
needs: [check-release, build, virustotal-scan]
|
||||||
if: always() && needs.check-release.outputs.should-build == 'true' && (failure() || needs.virustotal-scan.outputs.all-clean == 'false')
|
if: always() && needs.check-release.outputs.should-build == 'true' && (failure() || needs.virustotal-scan.outputs.all-clean == 'false')
|
||||||
runs-on: self-hosted
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Send failure notification
|
- name: Send failure notification
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
131
.github/workflows/build-iperf3.yml
vendored
131
.github/workflows/build-iperf3.yml
vendored
@@ -2,6 +2,12 @@ name: Build iperf3 Static Binaries
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
# check upstream for a new iperf3 release once a day
|
||||||
|
- cron: '47 5 * * *'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-release:
|
check-release:
|
||||||
@@ -10,15 +16,16 @@ jobs:
|
|||||||
latest-version: ${{ steps.get-version.outputs.version }}
|
latest-version: ${{ steps.get-version.outputs.version }}
|
||||||
should-build: ${{ steps.check-version.outputs.should-build }}
|
should-build: ${{ steps.check-version.outputs.should-build }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Get latest iperf3 release
|
- name: Get latest iperf3 release
|
||||||
id: get-version
|
id: get-version
|
||||||
run: |
|
run: |
|
||||||
# Get the latest release tag from GitHub API
|
# Get the latest release tag from GitHub API (e.g. "3.19")
|
||||||
LATEST_VERSION=$(curl -s https://api.github.com/repos/esnet/iperf/releases/latest | jq -r '.tag_name')
|
LATEST_VERSION=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s https://api.github.com/repos/esnet/iperf/releases/latest | jq -r '.tag_name')
|
||||||
echo "Latest iperf3 version: $LATEST_VERSION"
|
echo "Latest iperf3 version: $LATEST_VERSION"
|
||||||
|
if [ -z "$LATEST_VERSION" ] || [ "$LATEST_VERSION" = "null" ]; then
|
||||||
|
echo "Failed to determine latest iperf3 version"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
echo "version=$LATEST_VERSION" >> $GITHUB_OUTPUT
|
echo "version=$LATEST_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Check if version exists in releases
|
- name: Check if version exists in releases
|
||||||
@@ -41,7 +48,11 @@ jobs:
|
|||||||
needs: check-release
|
needs: check-release
|
||||||
if: needs.check-release.outputs.should-build == 'true'
|
if: needs.check-release.outputs.should-build == 'true'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
# allow the ARM 32-bit leg to fail without failing the workflow (iperf3 arm32
|
||||||
|
# builds are historically flaky; kept as a safety net for future versions)
|
||||||
|
continue-on-error: ${{ matrix.arch == 'arm' }}
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- arch: x64
|
- arch: x64
|
||||||
@@ -53,28 +64,15 @@ jobs:
|
|||||||
- arch: aarch64
|
- arch: aarch64
|
||||||
cross: aarch64-linux-musl
|
cross: aarch64-linux-musl
|
||||||
host: aarch64-linux-gnu
|
host: aarch64-linux-gnu
|
||||||
# Note: ARM 32-bit compilation of iperf3 >3.15 has known issues
|
|
||||||
# We'll still attempt it but expect potential failures
|
|
||||||
- arch: arm
|
- arch: arm
|
||||||
cross: arm-linux-musleabihf
|
cross: arm-linux-musleabihf
|
||||||
host: arm-linux-gnueabihf
|
host: arm-linux-gnueabihf
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Create compilation script
|
- name: Create compilation script
|
||||||
run: |
|
run: |
|
||||||
VERSION="${{ needs.check-release.outputs.latest-version }}"
|
|
||||||
ARCH="${{ matrix.arch }}"
|
|
||||||
CROSS="${{ matrix.cross }}"
|
|
||||||
HOST="${{ matrix.host }}"
|
|
||||||
|
|
||||||
# Single script for all architectures using musl cross-compilation
|
# Single script for all architectures using musl cross-compilation
|
||||||
cat > compile-iperf3.sh << EOF
|
cat > compile-iperf3.sh << 'EOF'
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
@@ -90,44 +88,45 @@ jobs:
|
|||||||
yum install -y yum-plugin-ovl # fix for docker overlay fs
|
yum install -y yum-plugin-ovl # fix for docker overlay fs
|
||||||
yum install -y xz
|
yum install -y xz
|
||||||
|
|
||||||
# download musl cross compilation toolchain
|
# download musl cross compilation toolchain - mirrored as a release asset on
|
||||||
|
# this repo since musl.cc blocks GitHub Actions IP ranges (musl.cc fallback
|
||||||
|
# kept for local runs)
|
||||||
cd ~
|
cd ~
|
||||||
curl -L "https://musl.cc/\$CROSS-cross.tgz" -o "\$CROSS-cross.tgz"
|
curl -fL -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://github.com/masonr/yet-another-bench-script/releases/download/toolchains/$CROSS-cross.tgz" -o "$CROSS-cross.tgz" \
|
||||||
tar xf "\$CROSS-cross.tgz"
|
|| curl -fL -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://musl.cc/$CROSS-cross.tgz" -o "$CROSS-cross.tgz"
|
||||||
|
tar xf "$CROSS-cross.tgz"
|
||||||
|
|
||||||
# Activate Holy Build Box exe compilation environment
|
# Activate Holy Build Box exe compilation environment
|
||||||
source /hbb_exe/activate
|
source /hbb_exe/activate
|
||||||
|
|
||||||
# download and compile iperf3
|
# download and compile iperf3
|
||||||
cd ~
|
cd ~
|
||||||
curl -L "https://github.com/esnet/iperf/archive/\$VERSION.tar.gz" -o "iperf.tar.gz"
|
curl -L -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://github.com/esnet/iperf/archive/$VERSION.tar.gz" -o "iperf.tar.gz"
|
||||||
tar xf iperf.tar.gz
|
tar xf iperf.tar.gz
|
||||||
cd iperf-*
|
cd iperf-*
|
||||||
CC=/root/\$CROSS-cross/bin/\$CROSS-gcc ./configure --disable-shared --disable-profiling --build x86_64-pc-linux-gnu --host "\$HOST" --with-openssl=no --enable-static-bin
|
CC=/root/$CROSS-cross/bin/$CROSS-gcc ./configure --disable-shared --disable-profiling --build x86_64-pc-linux-gnu --host "$HOST" --with-openssl=no --enable-static-bin
|
||||||
|
# remove libatomic.la so libtool links the static libatomic.a rather than
|
||||||
|
# attempting to link libatomic.so into the static binary (breaks arm32 builds)
|
||||||
|
rm -f /root/$CROSS-cross/$CROSS/lib/libatomic.la
|
||||||
make
|
make
|
||||||
|
|
||||||
# verify no external shared library links
|
# verify no external shared library links
|
||||||
libcheck src/iperf3
|
libcheck src/iperf3
|
||||||
# copy iperf3 binary to mounted dir
|
# copy iperf3 binary to mounted dir
|
||||||
cp src/iperf3 "/io/iperf3_\$ARCH"
|
cp src/iperf3 "/io/iperf3_$ARCH"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
chmod +x compile-iperf3.sh
|
chmod +x compile-iperf3.sh
|
||||||
|
|
||||||
- name: Compile iperf3 binary
|
- name: Compile iperf3 binary
|
||||||
run: |
|
run: |
|
||||||
ARCH="${{ matrix.arch }}"
|
|
||||||
CROSS="${{ matrix.cross }}"
|
|
||||||
HOST="${{ matrix.host }}"
|
|
||||||
|
|
||||||
# Use musl cross-compilation for all architectures
|
# Use musl cross-compilation for all architectures
|
||||||
docker run --rm -v $(pwd):/io --env ARCH=$ARCH --env CROSS=$CROSS --env HOST=$HOST --env VERSION="${{ needs.check-release.outputs.latest-version }}" phusion/holy-build-box-64:latest bash /io/compile-iperf3.sh
|
docker run --rm -v $(pwd):/io --env ARCH=${{ matrix.arch }} --env CROSS=${{ matrix.cross }} --env HOST=${{ matrix.host }} --env VERSION="${{ needs.check-release.outputs.latest-version }}" phusion/holy-build-box-64:latest bash /io/compile-iperf3.sh
|
||||||
|
|
||||||
- name: Verify binary
|
- name: Verify binary
|
||||||
run: |
|
run: |
|
||||||
ARCH="${{ matrix.arch }}"
|
ls -la iperf3_${{ matrix.arch }}
|
||||||
ls -la iperf3_$ARCH
|
file iperf3_${{ matrix.arch }}
|
||||||
file iperf3_$ARCH
|
|
||||||
|
|
||||||
- name: Upload binary as artifact
|
- name: Upload binary as artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -135,8 +134,6 @@ jobs:
|
|||||||
name: iperf3_${{ matrix.arch }}
|
name: iperf3_${{ matrix.arch }}
|
||||||
path: iperf3_${{ matrix.arch }}
|
path: iperf3_${{ matrix.arch }}
|
||||||
retention-days: 1
|
retention-days: 1
|
||||||
# Allow arm builds to fail as ARM 32-bit has known compilation issues with newer versions
|
|
||||||
continue-on-error: ${{ matrix.arch == 'arm' }}
|
|
||||||
|
|
||||||
virustotal-scan:
|
virustotal-scan:
|
||||||
needs: [check-release, build]
|
needs: [check-release, build]
|
||||||
@@ -172,14 +169,13 @@ jobs:
|
|||||||
echo "|--------|--------|-----------|------------|------------|----------------|" >> scan_results.md
|
echo "|--------|--------|-----------|------------|------------|----------------|" >> scan_results.md
|
||||||
|
|
||||||
ALL_CLEAN=true
|
ALL_CLEAN=true
|
||||||
SCAN_DATA=""
|
|
||||||
|
|
||||||
for binary in scan-binaries/iperf3_*; do
|
for binary in scan-binaries/iperf3_*; do
|
||||||
filename=$(basename "$binary")
|
filename=$(basename "$binary")
|
||||||
echo "Uploading $filename to VirusTotal..."
|
echo "Uploading $filename to VirusTotal..."
|
||||||
|
|
||||||
# Upload to VirusTotal
|
# Upload to VirusTotal
|
||||||
upload_response=$(curl -s --request POST \
|
upload_response=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s --request POST \
|
||||||
--url https://www.virustotal.com/api/v3/files \
|
--url https://www.virustotal.com/api/v3/files \
|
||||||
--header 'accept: application/json' \
|
--header 'accept: application/json' \
|
||||||
--header 'content-type: multipart/form-data' \
|
--header 'content-type: multipart/form-data' \
|
||||||
@@ -200,28 +196,31 @@ jobs:
|
|||||||
echo "${filename}:${analysis_id}" >> analysis_ids.txt
|
echo "${filename}:${analysis_id}" >> analysis_ids.txt
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "all_clean_upload=$ALL_CLEAN" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
# Wait 2 minutes for scans to complete
|
|
||||||
echo "Waiting 2 minutes for VirusTotal scans to complete..."
|
|
||||||
sleep 120
|
|
||||||
|
|
||||||
- name: Retrieve VirusTotal scan results
|
- name: Retrieve VirusTotal scan results
|
||||||
id: get-results
|
id: get-results
|
||||||
run: |
|
run: |
|
||||||
ALL_CLEAN=true
|
ALL_CLEAN=true
|
||||||
SCAN_SUMMARY=""
|
|
||||||
|
|
||||||
|
# Poll each analysis until it completes; VirusTotal scans can take a few
|
||||||
|
# minutes after upload, so allow up to ~5 minutes per binary (10 polls,
|
||||||
|
# 30s apart) before giving up. Files are processed sequentially, so by
|
||||||
|
# the time the first completes the rest are usually already done.
|
||||||
while IFS=':' read -r filename analysis_id; do
|
while IFS=':' read -r filename analysis_id; do
|
||||||
echo "Retrieving results for $filename (ID: $analysis_id)..."
|
echo "Retrieving results for $filename (ID: $analysis_id)..."
|
||||||
|
|
||||||
# Get scan results
|
status="queued"
|
||||||
result_response=$(curl -s --request GET \
|
for ((attempts=1; attempts<=10; attempts++)); do
|
||||||
--url "https://www.virustotal.com/api/v3/analyses/$analysis_id" \
|
# Get scan results
|
||||||
--header 'accept: application/json' \
|
result_response=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s --request GET \
|
||||||
--header "x-apikey: ${{ secrets.VIRUSTOTAL_API_KEY }}")
|
--url "https://www.virustotal.com/api/v3/analyses/$analysis_id" \
|
||||||
|
--header 'accept: application/json' \
|
||||||
|
--header "x-apikey: ${{ secrets.VIRUSTOTAL_API_KEY }}")
|
||||||
|
|
||||||
status=$(echo "$result_response" | jq -r '.data.attributes.status // "unknown"')
|
status=$(echo "$result_response" | jq -r '.data.attributes.status // "unknown"')
|
||||||
|
[ "$status" = "completed" ] && break
|
||||||
|
echo "$filename still scanning (attempt $attempts of 10), waiting 30s..."
|
||||||
|
sleep 30
|
||||||
|
done
|
||||||
|
|
||||||
if [ "$status" = "completed" ]; then
|
if [ "$status" = "completed" ]; then
|
||||||
malicious=$(echo "$result_response" | jq -r '.data.attributes.stats.malicious // 0')
|
malicious=$(echo "$result_response" | jq -r '.data.attributes.stats.malicious // 0')
|
||||||
@@ -243,7 +242,7 @@ jobs:
|
|||||||
echo "| $filename | $status_text | $malicious | $suspicious | $undetected | [$file_hash]($vt_url) |" >> scan_results.md
|
echo "| $filename | $status_text | $malicious | $suspicious | $undetected | [$file_hash]($vt_url) |" >> scan_results.md
|
||||||
|
|
||||||
else
|
else
|
||||||
echo "| $filename | ⏳ Pending | N/A | N/A | N/A | Scan not completed |" >> scan_results.md
|
echo "| $filename | ⏳ Timed out | N/A | N/A | N/A | Scan did not complete in ~5 min |" >> scan_results.md
|
||||||
ALL_CLEAN=false
|
ALL_CLEAN=false
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -257,13 +256,15 @@ jobs:
|
|||||||
- name: Create scan summary
|
- name: Create scan summary
|
||||||
id: scan-summary
|
id: scan-summary
|
||||||
run: |
|
run: |
|
||||||
RESULTS=$(cat scan_results.md)
|
|
||||||
ALL_CLEAN="${{ steps.get-results.outputs.all_clean }}"
|
ALL_CLEAN="${{ steps.get-results.outputs.all_clean }}"
|
||||||
|
|
||||||
# Escape newlines for GitHub output
|
# Pass the scan results through as a multi-line output (heredoc delimiter
|
||||||
RESULTS_ESCAPED=$(echo "$RESULTS" | sed ':a;N;$!ba;s/\n/\\n/g')
|
# syntax) so the markdown table renders correctly in the release body
|
||||||
|
{
|
||||||
echo "results=$RESULTS_ESCAPED" >> $GITHUB_OUTPUT
|
echo "results<<RESULTS_EOF"
|
||||||
|
cat scan_results.md
|
||||||
|
echo "RESULTS_EOF"
|
||||||
|
} >> $GITHUB_OUTPUT
|
||||||
echo "all-clean=$ALL_CLEAN" >> $GITHUB_OUTPUT
|
echo "all-clean=$ALL_CLEAN" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Upload scan results as artifact
|
- name: Upload scan results as artifact
|
||||||
@@ -280,9 +281,6 @@ jobs:
|
|||||||
if: needs.check-release.outputs.should-build == 'true' && needs.virustotal-scan.outputs.all-clean == 'true'
|
if: needs.check-release.outputs.should-build == 'true' && needs.virustotal-scan.outputs.all-clean == 'true'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Download all artifacts
|
- name: Download all artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -303,6 +301,13 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
- name: Download upstream source tarball
|
||||||
|
run: |
|
||||||
|
# Attach the exact upstream source these binaries were built from
|
||||||
|
# (iperf3 is BSD-3-Clause; retain the copyright notice with distribution)
|
||||||
|
curl -L --retry 5 --retry-delay 2 --connect-timeout 15 "https://github.com/esnet/iperf/archive/${{ needs.check-release.outputs.latest-version }}.tar.gz" -o "release-assets/iperf-${{ needs.check-release.outputs.latest-version }}.tar.gz"
|
||||||
|
ls -la release-assets/
|
||||||
|
|
||||||
- name: Generate SHA256 checksums
|
- name: Generate SHA256 checksums
|
||||||
run: |
|
run: |
|
||||||
cd release-assets
|
cd release-assets
|
||||||
@@ -330,7 +335,7 @@ jobs:
|
|||||||
path: vt-results
|
path: vt-results
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
tag_name: iperf3-${{ needs.check-release.outputs.latest-version }}
|
tag_name: iperf3-${{ needs.check-release.outputs.latest-version }}
|
||||||
name: iperf3 ${{ needs.check-release.outputs.latest-version }} Static Binaries
|
name: iperf3 ${{ needs.check-release.outputs.latest-version }} Static Binaries
|
||||||
@@ -358,10 +363,14 @@ jobs:
|
|||||||
sha256sum -c iperf3-checksums.sha256
|
sha256sum -c iperf3-checksums.sha256
|
||||||
```
|
```
|
||||||
|
|
||||||
For usage in YABS script, place these binaries in the `bin/iperf/` directory.
|
**License & Source:**
|
||||||
|
iperf3 is licensed under [BSD-3-Clause](https://github.com/esnet/iperf/blob/master/LICENSE) (© ESnet / LBL).
|
||||||
|
These are unofficial static builds produced by CI for use by [YABS](https://github.com/masonr/yet-another-bench-script);
|
||||||
|
the exact upstream source is attached as `iperf-${{ needs.check-release.outputs.latest-version }}.tar.gz`.
|
||||||
files: |
|
files: |
|
||||||
release-assets/iperf3_*
|
release-assets/iperf3_*
|
||||||
release-assets/iperf3-checksums.sha256
|
release-assets/iperf3-checksums.sha256
|
||||||
|
release-assets/*.tar.gz
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
env:
|
env:
|
||||||
|
|||||||
74
.github/workflows/monitor-releases.yml
vendored
74
.github/workflows/monitor-releases.yml
vendored
@@ -1,74 +0,0 @@
|
|||||||
name: Monitor External Releases for Updates
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
# Check every hour for new releases
|
|
||||||
- cron: '0 * * * *'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
monitor-releases:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Check fio releases
|
|
||||||
id: check-fio
|
|
||||||
run: |
|
|
||||||
# Get latest fio release
|
|
||||||
LATEST_FIO=$(curl -s https://api.github.com/repos/axboe/fio/releases/latest | jq -r '.tag_name')
|
|
||||||
echo "Latest fio: $LATEST_FIO"
|
|
||||||
|
|
||||||
# Check if we already have this version
|
|
||||||
if ! gh release view "fio-$LATEST_FIO" --repo ${{ github.repository }} >/dev/null 2>&1; then
|
|
||||||
echo "New fio version found: $LATEST_FIO"
|
|
||||||
echo "trigger-fio=true" >> $GITHUB_OUTPUT
|
|
||||||
echo "fio-version=$LATEST_FIO" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "fio $LATEST_FIO already exists"
|
|
||||||
echo "trigger-fio=false" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ github.token }}
|
|
||||||
|
|
||||||
- name: Check iperf3 releases
|
|
||||||
id: check-iperf3
|
|
||||||
run: |
|
|
||||||
# Get latest iperf3 release
|
|
||||||
LATEST_IPERF3=$(curl -s https://api.github.com/repos/esnet/iperf/releases/latest | jq -r '.tag_name')
|
|
||||||
echo "Latest iperf3: $LATEST_IPERF3"
|
|
||||||
|
|
||||||
# Check if we already have this version
|
|
||||||
if ! gh release view "iperf3-$LATEST_IPERF3" --repo ${{ github.repository }} >/dev/null 2>&1; then
|
|
||||||
echo "New iperf3 version found: $LATEST_IPERF3"
|
|
||||||
echo "trigger-iperf3=true" >> $GITHUB_OUTPUT
|
|
||||||
echo "iperf3-version=$LATEST_IPERF3" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "iperf3 $LATEST_IPERF3 already exists"
|
|
||||||
echo "trigger-iperf3=false" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ github.token }}
|
|
||||||
|
|
||||||
- name: Trigger fio build workflow
|
|
||||||
if: steps.check-fio.outputs.trigger-fio == 'true'
|
|
||||||
run: |
|
|
||||||
echo "Triggering fio build for version ${{ steps.check-fio.outputs.fio-version }}"
|
|
||||||
gh workflow run build-fio.yml --repo ${{ github.repository }}
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ github.token }}
|
|
||||||
|
|
||||||
- name: Trigger iperf3 build workflow
|
|
||||||
if: steps.check-iperf3.outputs.trigger-iperf3 == 'true'
|
|
||||||
run: |
|
|
||||||
echo "Triggering iperf3 build for version ${{ steps.check-iperf3.outputs.iperf3-version }}"
|
|
||||||
gh workflow run build-iperf3.yml --repo ${{ github.repository }}
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ github.token }}
|
|
||||||
|
|
||||||
- name: Summary
|
|
||||||
run: |
|
|
||||||
echo "## Release Monitoring Summary" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "- fio: ${{ steps.check-fio.outputs.trigger-fio == 'true' && 'New version triggered build' || 'No new version' }}" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "- iperf3: ${{ steps.check-iperf3.outputs.trigger-iperf3 == 'true' && 'New version triggered build' || 'No new version' }}" >> $GITHUB_STEP_SUMMARY
|
|
||||||
@@ -10,10 +10,9 @@ This script automates the execution of the best benchmarking tools in the indust
|
|||||||
View Daily and Historical 📊 **[YABS Usage Stats Here](https://stats.yabs.sh/)** 📈 ([source](https://github.com/masonr/yabs-stats)).
|
View Daily and Historical 📊 **[YABS Usage Stats Here](https://stats.yabs.sh/)** 📈 ([source](https://github.com/masonr/yabs-stats)).
|
||||||
|
|
||||||
### **What's New With YABS?**
|
### **What's New With YABS?**
|
||||||
|
* [19 Sep 2026](https://github.com/masonr/yet-another-bench-script/actions) - fio/iperf3 portable binary builds now automated via GitHub workflows.
|
||||||
* [24 Jul 2026](https://github.com/masonr/yet-another-bench-script) - [Geekbench 7](https://www.geekbench.com/) is now available via the `-7` flag (Geekbench 6 remains the default).
|
* [24 Jul 2026](https://github.com/masonr/yet-another-bench-script) - [Geekbench 7](https://www.geekbench.com/) is now available via the `-7` flag (Geekbench 6 remains the default).
|
||||||
* [04 Jul 2026](https://stats.yabs.sh/) - Check out YABS usage stats here -> https://stats.yabs.sh/
|
* [04 Jul 2026](https://stats.yabs.sh/) - Check out YABS usage stats here -> https://stats.yabs.sh/
|
||||||
* [27 Feb 2023](https://github.com/masonr/yet-another-bench-script/commit/06eaa2ab3b32355bec8278c51c4be93b3662a96d) - Newly released [Geekbench 6](https://www.geekbench.com/) is added as the default Geekbench test.
|
|
||||||
* [26 Feb 2023](https://github.com/masonr/yet-another-bench-script/commit/f075baf59c3057983fff0a30ea0c746b5ea88d91) - Network information added to YABS output using [ip-api](https://ip-api.com/).
|
|
||||||
|
|
||||||
## How to Run
|
## How to Run
|
||||||
|
|
||||||
@@ -79,7 +78,9 @@ Sites supporting submission of YABS JSON results:
|
|||||||
| --- | --- |
|
| --- | --- |
|
||||||
| [YABSdb](https://yabsdb.com/) | `curl -sL yabs.sh \| bash -s -- -s "https://yabsdb.com/add"` |
|
| [YABSdb](https://yabsdb.com/) | `curl -sL yabs.sh \| bash -s -- -s "https://yabsdb.com/add"` |
|
||||||
| [VPSBenchmarks](https://www.vpsbenchmarks.com/yabs/get_started) | `curl -sL yabs.sh \| bash -s -- -s https://www.vpsbenchmarks.com/yabs/upload` |
|
| [VPSBenchmarks](https://www.vpsbenchmarks.com/yabs/get_started) | `curl -sL yabs.sh \| bash -s -- -s https://www.vpsbenchmarks.com/yabs/upload` |
|
||||||
|
| [serverlist.dev](https://serverlist.dev/) | `curl -sL yabs.sh \| bash -s -- -s "https://serverlist.dev/api/v1/yabs/submit"` |
|
||||||
| [ServerVerify](https://serververify.com/benchmarks) | (sign up for account) |
|
| [ServerVerify](https://serververify.com/benchmarks) | (sign up for account) |
|
||||||
|
| [VPS Host Review](https://vpshostreview.com/yabs) | `curl -sL yabs.sh \| bash -s -- -s "https://vpshostreview.com/yabs"` |
|
||||||
|
|
||||||
Example JSON output: [example.json](bin/example.json).
|
Example JSON output: [example.json](bin/example.json).
|
||||||
|
|
||||||
@@ -91,7 +92,7 @@ Example JSON output: [example.json](bin/example.json).
|
|||||||
|
|
||||||
### Security Notice
|
### Security Notice
|
||||||
|
|
||||||
This script relies on external binaries in order to complete the performance tests. The network (iperf3) and disk (fio) tests use binaries that are compiled by myself utilizing a [Holy Build Box](https://github.com/phusion/holy-build-box) compilation environment to ensure binary portability. The reasons for doing this include ensuring standardized (parsable) output, allowing support of both 32-bit and 64-bit architectures, bypassing the need for prerequisites to be compiled and/or installed, among other reasons. For the system test, a Geekbench tarball is downloaded, extracted, and the resulting binary is run. Use this script at your own risk as you would with any script publicly available on the net. Additional information regarding the binaries, including compilation notes and steps, can be found in the bin directory's [README page](bin/README.md).
|
This script relies on external binaries in order to complete the performance tests. The network (iperf3) and disk (fio) tests use binaries that are built by GitHub Actions workflows in a [Holy Build Box](https://github.com/phusion/holy-build-box) compilation environment to ensure binary portability, and are published as release assets on this repository (scanned via VirusTotal with SHA-256 checksums included). The reasons for using pre-compiled binaries include ensuring standardized (parsable) output, allowing support of both 32-bit and 64-bit architectures, bypassing the need for prerequisites to be compiled and/or installed, among other reasons. For the system test, a Geekbench tarball is downloaded, extracted, and the resulting binary is run. Use this script at your own risk as you would with any script publicly available on the net. Additional information regarding the binaries, including compilation notes and steps, can be found in the bin directory's [README page](bin/README.md).
|
||||||
|
|
||||||
## Example Output
|
## Example Output
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +1,49 @@
|
|||||||
## YABS Pre-Compiled Binaries
|
## YABS Pre-Compiled Binaries
|
||||||
|
|
||||||
This directory contains all of the binaries required to run the benchmarking tests. Naturally, there is a security risk to your machine and its contents by running this script since, after all, this is just a script on the internet. You'll simply have to have confidence that I don't have malicious intent and am semi-competent at writing a bash script. The script is made public so you can look at the code yourself. The binaries were compiled using a [Holy Build Box](https://github.com/phusion/holy-build-box) compilation environment in order to ensure the most portability. The compiled binary version numbers and compilations steps are noted below. Please open an issue if the compiled version is out of date and lacking any security-related and/or performance updates.
|
This directory contains the compilation scripts used to build the fio and iperf3
|
||||||
|
binaries that YABS uses. **The binaries themselves are no longer committed to the
|
||||||
|
repository** - they are built automatically by GitHub Actions workflows
|
||||||
|
([build-fio.yml](../.github/workflows/build-fio.yml) and
|
||||||
|
[build-iperf3.yml](../.github/workflows/build-iperf3.yml)) on GitHub-hosted
|
||||||
|
runners and published as release assets on this repository:
|
||||||
|
|
||||||
### Binaries
|
* `fio-*` releases (e.g. `fio-3.42`) - contain `fio_x64`, `fio_x86`, `fio_aarch64`, `fio_arm`
|
||||||
|
* `iperf3-*` releases (e.g. `iperf3-3.21`) - contain `iperf3_x64`, `iperf3_x86`, `iperf3_aarch64`, `iperf3_arm`
|
||||||
|
* `toolchains` release - musl cross-compilation toolchains mirrored from
|
||||||
|
[musl.cc](https://musl.cc/) (which blocks GitHub Actions IP ranges); see the
|
||||||
|
NOTICE.txt asset for licensing/source info
|
||||||
|
|
||||||
| Binary Name | Version | Compile Date | Architecture | OS | SHA-256 Hash<br>(VirusTotal Scan) |
|
Each binary release includes SHA-256 checksums (`*-checksums.sha256`), a
|
||||||
|:-:|:-:|:-:|:-:|:-:|:-:|
|
VirusTotal scan summary in the release notes, and the exact upstream source
|
||||||
| fio_x64 | 3.39 | 20-APR-2025 | x86_64 | 64-bit | [b511bda](https://www.virustotal.com/gui/file/b511bda3b26b6d840698f543d63e956d7466b8512c10ff0ada8292d556c33fb1) |
|
tarball the binaries were built from. Binaries are cross-compiled with musl
|
||||||
| fio_x86 | 3.39 | 20-APR-2025 | i686 | 32-bit | [42e2e0b](https://www.virustotal.com/gui/file/42e2e0b0370faeb8e53dcf48dfff15daa9baaadfd196d9bdda57af196bedf0b3) |
|
toolchains for maximum portability.
|
||||||
| fio_aarch64 | 3.39 | 20-APR-2025 | ARM (aarch64) | 64-bit | [e2942a2](https://www.virustotal.com/gui/file/e2942a26d4b249076486677c9c12cd7f1a572854a5e136597d1391e8ad75ffb0) |
|
|
||||||
| fio_arm | 3.39 | 20-APR-2025 | ARM | 32-bit | [3a96b1c](https://www.virustotal.com/gui/file/3a96b1cadfb51501b7fd54dc47a4dad666dc4382d4fe152116c62ae6a07485ea) |
|
|
||||||
| iperf3_x64 | 3.18 | 14-DEC-2024 | x86_64 | 64-bit | [ef787ab](https://www.virustotal.com/gui/file/ef787abbe4b09c7958ed592df52dfe3a2848cbdee5b76738c757d7c51c348053) |
|
|
||||||
| iperf3_x86 | 3.18 | 14-DEC-2024 | i686 | 32-bit | [655eb51](https://www.virustotal.com/gui/file/655eb51abc36ddaa624c1d0e98c6930e8b1e9d91c85e5a3443624355656be9b9) |
|
|
||||||
| iperf3_aarch64 | 3.18 | 14-DEC-2024 | ARM (aarch64) | 64-bit | [92e5821](https://www.virustotal.com/gui/file/92e5821cfbaa1f8faf123b4d6773dc0f6efef221b9308668a21ddabc04a1de20) |
|
|
||||||
| iperf3_arm | 3.15* | 20-OCT-2023 | ARM | 32-bit | [310e80f](https://www.virustotal.com/gui/file/310e80f442dda47fa0fe41225af85e8b91e75116dce5187f123380fd3c3c85a8) |
|
|
||||||
|
|
||||||
Note: ARM compatibility is considered experimental. Static binaries for 32-bit and ARM-based machines are cross-compiled within a Holy Build Box container using the [musl toolchain](https://musl.cc/).
|
At runtime, yabs.sh auto-detects the latest `fio-*`/`iperf3-*` release via the
|
||||||
|
repository's releases feed and downloads the appropriate binary for the host
|
||||||
|
architecture. If the lookup fails, it falls back to a pinned release tag.
|
||||||
|
|
||||||
### Compile Notes
|
Naturally, there is a security risk to your machine and its contents by running
|
||||||
|
this script since, after all, this is just a script on the internet. You'll
|
||||||
|
simply have to have confidence that I don't have malicious intent and am
|
||||||
|
semi-competent at writing a bash script. The script and the workflows that build
|
||||||
|
the binaries are public so you can look at the code yourself. The binaries are
|
||||||
|
compiled using a [Holy Build Box](https://github.com/phusion/holy-build-box)
|
||||||
|
compilation environment in order to ensure the most portability. Please open an
|
||||||
|
issue if the binaries are out of date and lacking any security-related and/or
|
||||||
|
performance updates - the daily scheduled workflows should pick up new upstream
|
||||||
|
releases automatically.
|
||||||
|
|
||||||
|
Note: ARM compatibility is considered experimental.
|
||||||
|
|
||||||
|
### Compile Notes (manual builds)
|
||||||
|
|
||||||
|
The workflows above are the canonical build path. To build manually, the same
|
||||||
|
scripts can be run inside a Holy Build Box container:
|
||||||
|
|
||||||
**Pre-reqs**:
|
**Pre-reqs**:
|
||||||
* Docker - https://www.docker.com/
|
* Docker - https://www.docker.com/
|
||||||
|
|
||||||
**Compiling 64-bit binaries**:
|
**Compiling 64-bit (x86_64) binaries**:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker run -t -i --rm -v `pwd`:/io phusion/holy-build-box-64:latest bash /io/compile.sh
|
docker run -t -i --rm -v `pwd`:/io phusion/holy-build-box-64:latest bash /io/compile.sh
|
||||||
@@ -32,9 +53,11 @@ docker run -t -i --rm -v `pwd`:/io phusion/holy-build-box-64:latest bash /io/com
|
|||||||
|
|
||||||
### Cross-compiling Notes
|
### Cross-compiling Notes
|
||||||
|
|
||||||
Compilation of ARM-compatible binaries requires additional environment variables to identify the proper musl toolchain and architecture to target for cross-compilation.
|
Compilation of 32-bit and ARM-compatible binaries requires additional
|
||||||
|
environment variables to identify the proper musl toolchain and architecture to
|
||||||
|
target for cross-compilation.
|
||||||
|
|
||||||
**Compiling 32-bit binaries**:
|
**Compiling 32-bit x86 binaries**:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker run -t -i --rm -v `pwd`:/io --env ARCH=x86 --env CROSS=i686-linux-musl --env HOST=i686-linux-musl phusion/holy-build-box-64:latest bash /io/cross-compile.sh
|
docker run -t -i --rm -v `pwd`:/io --env ARCH=x86 --env CROSS=i686-linux-musl --env HOST=i686-linux-musl phusion/holy-build-box-64:latest bash /io/cross-compile.sh
|
||||||
@@ -46,12 +69,8 @@ docker run -t -i --rm -v `pwd`:/io --env ARCH=x86 --env CROSS=i686-linux-musl --
|
|||||||
docker run -t -i --rm -v `pwd`:/io --env ARCH=aarch64 --env CROSS=aarch64-linux-musl --env HOST=aarch64-linux-gnu phusion/holy-build-box-64:latest bash /io/cross-compile.sh
|
docker run -t -i --rm -v `pwd`:/io --env ARCH=aarch64 --env CROSS=aarch64-linux-musl --env HOST=aarch64-linux-gnu phusion/holy-build-box-64:latest bash /io/cross-compile.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
**Compiling ARM 32-bit binaries\***:
|
**Compiling ARM 32-bit binaries**:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker run -t -i --rm -v `pwd`:/io --env ARCH=arm --env CROSS=arm-linux-musleabihf --env HOST=arm-linux-gnueabihf phusion/holy-build-box-64:latest bash /io/cross-compile.sh
|
docker run -t -i --rm -v `pwd`:/io --env ARCH=arm --env CROSS=arm-linux-musleabihf --env HOST=arm-linux-gnueabihf phusion/holy-build-box-64:latest bash /io/cross-compile.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
64-bit (aarch64) and 32-bit (x86, arm) binaries will be placed in the current directory.
|
|
||||||
|
|
||||||
\* ARM 32-bit: Last sucessful compiliation of ARM 32-bit binary for iperf3 is v3.15. All later versions fail to compile.
|
|
||||||
|
|||||||
@@ -36,9 +36,12 @@ source /hbb_exe/activate
|
|||||||
|
|
||||||
# download and compile fio
|
# download and compile fio
|
||||||
cd ~
|
cd ~
|
||||||
curl -L https://github.com/axboe/fio/archive/fio-3.39.tar.gz -o "fio.tar.gz"
|
curl -L https://github.com/axboe/fio/archive/fio-3.42.tar.gz -o "fio.tar.gz"
|
||||||
tar xf fio.tar.gz
|
tar xf fio.tar.gz
|
||||||
cd fio-fio*
|
cd fio-fio-*
|
||||||
|
# fio >= 3.42 includes both linux/prctl.h and sys/prctl.h in backend.c, which
|
||||||
|
# conflicts under musl; sys/prctl.h alone is sufficient (harmless on glibc too)
|
||||||
|
sed -i '/#include <linux\/prctl.h>/d' backend.c
|
||||||
./configure --disable-native
|
./configure --disable-native
|
||||||
make
|
make
|
||||||
|
|
||||||
@@ -49,9 +52,9 @@ cp fio "/io/fio_$ARCH"
|
|||||||
|
|
||||||
# download and compile iperf
|
# download and compile iperf
|
||||||
cd ~
|
cd ~
|
||||||
curl -L https://github.com/esnet/iperf/archive/3.18.tar.gz -o "iperf.tar.gz"
|
curl -L https://github.com/esnet/iperf/archive/3.21.tar.gz -o "iperf.tar.gz"
|
||||||
tar xf iperf.tar.gz
|
tar xf iperf.tar.gz
|
||||||
cd iperf*
|
cd iperf-*
|
||||||
./configure --disable-shared --disable-profiling
|
./configure --disable-shared --disable-profiling
|
||||||
make
|
make
|
||||||
|
|
||||||
|
|||||||
@@ -8,14 +8,16 @@ set -x
|
|||||||
|
|
||||||
# remove obsolete CentOS repos
|
# remove obsolete CentOS repos
|
||||||
cd /etc/yum.repos.d/
|
cd /etc/yum.repos.d/
|
||||||
rm CentOS-Base.repo CentOS-SCLo-scl-rh.repo CentOS-SCLo-scl.repo CentOS-fasttrack.repo CentOS-x86_64-kernel.repo
|
rm -f CentOS-Base.repo CentOS-SCLo-scl-rh.repo CentOS-SCLo-scl.repo CentOS-fasttrack.repo CentOS-x86_64-kernel.repo
|
||||||
|
|
||||||
yum install -y yum-plugin-ovl # fix for docker overlay fs
|
yum install -y yum-plugin-ovl # fix for docker overlay fs
|
||||||
yum install -y xz
|
yum install -y xz
|
||||||
|
|
||||||
# download musl cross compilation toolchain
|
# download musl cross compilation toolchain - mirrored as a release asset on the
|
||||||
|
# repo since musl.cc blocks GitHub Actions IP ranges (musl.cc fallback kept)
|
||||||
cd ~
|
cd ~
|
||||||
curl -L "https://musl.cc/${CROSS}-cross.tgz" -o "${CROSS}-cross.tgz"
|
curl -fL -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://github.com/masonr/yet-another-bench-script/releases/download/toolchains/${CROSS}-cross.tgz" -o "${CROSS}-cross.tgz" \
|
||||||
|
|| curl -fL -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://musl.cc/${CROSS}-cross.tgz" -o "${CROSS}-cross.tgz"
|
||||||
tar xf "${CROSS}-cross.tgz"
|
tar xf "${CROSS}-cross.tgz"
|
||||||
|
|
||||||
# download, compile, and install libaio as static library
|
# download, compile, and install libaio as static library
|
||||||
@@ -30,11 +32,15 @@ source /hbb_exe/activate
|
|||||||
|
|
||||||
# download and compile fio
|
# download and compile fio
|
||||||
cd ~
|
cd ~
|
||||||
curl -L https://github.com/axboe/fio/archive/fio-3.39.tar.gz -o "fio.tar.gz"
|
curl -L https://github.com/axboe/fio/archive/fio-3.42.tar.gz -o "fio.tar.gz"
|
||||||
tar xf fio.tar.gz
|
tar xf fio.tar.gz
|
||||||
cd fio-fio*
|
cd fio-fio-*
|
||||||
|
# fio >= 3.42 includes both linux/prctl.h and sys/prctl.h in backend.c, which
|
||||||
|
# conflicts under musl; sys/prctl.h alone is sufficient
|
||||||
|
sed -i '/#include <linux\/prctl.h>/d' backend.c
|
||||||
CC=/root/${CROSS}-cross/bin/${CROSS}-gcc ./configure --disable-native --build-static
|
CC=/root/${CROSS}-cross/bin/${CROSS}-gcc ./configure --disable-native --build-static
|
||||||
make
|
# link against libatomic for 32-bit/ARM targets that lack native 64-bit atomics
|
||||||
|
make EXTLIBS+=' -latomic'
|
||||||
|
|
||||||
# verify no external shared library links
|
# verify no external shared library links
|
||||||
libcheck fio
|
libcheck fio
|
||||||
@@ -43,10 +49,13 @@ cp fio "/io/fio_$ARCH"
|
|||||||
|
|
||||||
# download and compile iperf
|
# download and compile iperf
|
||||||
cd ~
|
cd ~
|
||||||
curl -L https://github.com/esnet/iperf/archive/3.18.tar.gz -o "iperf.tar.gz"
|
curl -L https://github.com/esnet/iperf/archive/3.21.tar.gz -o "iperf.tar.gz"
|
||||||
tar xf iperf.tar.gz
|
tar xf iperf.tar.gz
|
||||||
cd iperf*
|
cd iperf-*
|
||||||
CC=/root/${CROSS}-cross/bin/${CROSS}-gcc ./configure --disable-shared --disable-profiling --build x86_64-pc-linux-gnu --host "${HOST}" --with-openssl=no --enable-static-bin
|
CC=/root/${CROSS}-cross/bin/${CROSS}-gcc ./configure --disable-shared --disable-profiling --build x86_64-pc-linux-gnu --host "${HOST}" --with-openssl=no --enable-static-bin
|
||||||
|
# remove libatomic.la so libtool links the static libatomic.a rather than
|
||||||
|
# attempting to link libatomic.so into the static binary (breaks arm32 builds)
|
||||||
|
rm -f "/root/${CROSS}-cross/${CROSS}/lib/libatomic.la"
|
||||||
make
|
make
|
||||||
|
|
||||||
# verify no external shared library links
|
# verify no external shared library links
|
||||||
|
|||||||
Binary file not shown.
BIN
bin/fio/fio_arm
BIN
bin/fio/fio_arm
Binary file not shown.
BIN
bin/fio/fio_x64
BIN
bin/fio/fio_x64
Binary file not shown.
BIN
bin/fio/fio_x86
BIN
bin/fio/fio_x86
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
32
yabs.sh
32
yabs.sh
@@ -12,7 +12,7 @@
|
|||||||
# performance via fio. The script is designed to not require any dependencies
|
# performance via fio. The script is designed to not require any dependencies
|
||||||
# - either compiled or installed - nor admin privileges to run.
|
# - either compiled or installed - nor admin privileges to run.
|
||||||
|
|
||||||
YABS_VERSION="v2026-09-17"
|
YABS_VERSION="v2026-09-20"
|
||||||
|
|
||||||
echo -e '# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #'
|
echo -e '# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #'
|
||||||
echo -e '# Yet-Another-Bench-Script #'
|
echo -e '# Yet-Another-Bench-Script #'
|
||||||
@@ -195,6 +195,20 @@ if [ -n "$PRINT_HELP" ]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# determine which repo release tags to pull the precompiled fio/iperf3 binaries from:
|
||||||
|
# auto-detect the latest matching releases from the repo's releases feed and fall
|
||||||
|
# back to the pinned tags below if the lookup fails
|
||||||
|
FIO_BIN_TAG="fio-3.42" # pinned fallback fio release
|
||||||
|
IPERF_BIN_TAG="iperf3-3.21" # pinned fallback iperf3 release
|
||||||
|
if [[ -z $SKIP_FIO || -z $SKIP_IPERF ]]; then
|
||||||
|
BIN_RELEASES_FEED=$($IP_CHECK_CMD https://github.com/masonr/yet-another-bench-script/releases.atom 2>/dev/null)
|
||||||
|
FIO_BIN_TAG_LATEST=$(echo "$BIN_RELEASES_FEED" | grep -oE 'fio-[0-9]+\.[0-9]+' | head -n 1)
|
||||||
|
IPERF_BIN_TAG_LATEST=$(echo "$BIN_RELEASES_FEED" | grep -oE 'iperf3-[0-9]+\.[0-9]+' | head -n 1)
|
||||||
|
[[ -n $FIO_BIN_TAG_LATEST ]] && FIO_BIN_TAG=$FIO_BIN_TAG_LATEST
|
||||||
|
[[ -n $IPERF_BIN_TAG_LATEST ]] && IPERF_BIN_TAG=$IPERF_BIN_TAG_LATEST
|
||||||
|
unset FIO_BIN_TAG_LATEST IPERF_BIN_TAG_LATEST BIN_RELEASES_FEED
|
||||||
|
fi
|
||||||
|
|
||||||
# format_size
|
# format_size
|
||||||
# Purpose: Formats raw disk and memory sizes from kibibytes (KiB) to largest unit
|
# Purpose: Formats raw disk and memory sizes from kibibytes (KiB) to largest unit
|
||||||
# Parameters:
|
# Parameters:
|
||||||
@@ -646,14 +660,14 @@ fi
|
|||||||
if [[ -z "$PREFER_BIN" && -n "$LOCAL_FIO" ]]; then # local fio has been detected, use instead of pre-compiled binary
|
if [[ -z "$PREFER_BIN" && -n "$LOCAL_FIO" ]]; then # local fio has been detected, use instead of pre-compiled binary
|
||||||
FIO_CMD=fio
|
FIO_CMD=fio
|
||||||
else
|
else
|
||||||
# download fio binary
|
# download fio binary from the binary release on the repo
|
||||||
if [[ -n $LOCAL_CURL ]]; then
|
if [[ -n $LOCAL_CURL ]]; then
|
||||||
curl -s --connect-timeout 5 --retry 5 --retry-delay 0 https://raw.githubusercontent.com/masonr/yet-another-bench-script/master/bin/fio/fio_$ARCH -o "$DISK_PATH/fio"
|
curl -sfL --connect-timeout 5 --retry 5 --retry-delay 0 "https://github.com/masonr/yet-another-bench-script/releases/download/$FIO_BIN_TAG/fio_$ARCH" -o "$DISK_PATH/fio"
|
||||||
else
|
else
|
||||||
wget -q -T 5 -t 5 -w 0 https://raw.githubusercontent.com/masonr/yet-another-bench-script/master/bin/fio/fio_$ARCH -O "$DISK_PATH/fio"
|
wget -q -T 5 -t 5 -w 0 "https://github.com/masonr/yet-another-bench-script/releases/download/$FIO_BIN_TAG/fio_$ARCH" -O "$DISK_PATH/fio"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -f "$DISK_PATH/fio" ]; then # ensure fio binary download successfully
|
if [ ! -s "$DISK_PATH/fio" ]; then # ensure fio binary download successfully
|
||||||
echo -en "\r\033[0K"
|
echo -en "\r\033[0K"
|
||||||
echo -e "Fio binary download failed. Running dd test as fallback...."
|
echo -e "Fio binary download failed. Running dd test as fallback...."
|
||||||
DD_FALLBACK=True
|
DD_FALLBACK=True
|
||||||
@@ -864,14 +878,14 @@ if [ -z "$SKIP_IPERF" ]; then
|
|||||||
IPERF_PATH=$YABS_PATH/iperf
|
IPERF_PATH=$YABS_PATH/iperf
|
||||||
mkdir -p "$IPERF_PATH"
|
mkdir -p "$IPERF_PATH"
|
||||||
|
|
||||||
# download iperf3 binary
|
# download iperf3 binary from the binary release on the repo
|
||||||
if [[ -n $LOCAL_CURL ]]; then
|
if [[ -n $LOCAL_CURL ]]; then
|
||||||
curl -s --connect-timeout 5 --retry 5 --retry-delay 0 https://raw.githubusercontent.com/masonr/yet-another-bench-script/master/bin/iperf/iperf3_$ARCH -o "$IPERF_PATH/iperf3"
|
curl -sfL --connect-timeout 5 --retry 5 --retry-delay 0 "https://github.com/masonr/yet-another-bench-script/releases/download/$IPERF_BIN_TAG/iperf3_$ARCH" -o "$IPERF_PATH/iperf3"
|
||||||
else
|
else
|
||||||
wget -q -T 5 -t 5 -w 0 https://raw.githubusercontent.com/masonr/yet-another-bench-script/master/bin/iperf/iperf3_$ARCH -O "$IPERF_PATH/iperf3"
|
wget -q -T 5 -t 5 -w 0 "https://github.com/masonr/yet-another-bench-script/releases/download/$IPERF_BIN_TAG/iperf3_$ARCH" -O "$IPERF_PATH/iperf3"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -f "$IPERF_PATH/iperf3" ]; then # ensure iperf3 binary downloaded successfully
|
if [ ! -s "$IPERF_PATH/iperf3" ]; then # ensure iperf3 binary downloaded successfully
|
||||||
IPERF_DL_FAIL=True
|
IPERF_DL_FAIL=True
|
||||||
else
|
else
|
||||||
chmod +x "$IPERF_PATH/iperf3"
|
chmod +x "$IPERF_PATH/iperf3"
|
||||||
|
|||||||
Reference in New Issue
Block a user