Skip to content

Release 3.0.8

Release 3.0.8 #937

Workflow file for this run

name: Test Install Script
on:
push:
branches:
- main
paths:
- 'install.sh'
- 'scripts/test-install.sh'
- 'scripts/test-bun-check.sh'
- 'packages/cli/**'
- '.github/workflows/test-install.yaml'
pull_request:
merge_group:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
CI: true
GITHUB_TOKEN: ''
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
NODE_VERSION: '24'
jobs:
detect-install-changes:
name: Detect install test changes
runs-on: ubuntu-latest
outputs:
should-run: ${{ steps.changed-files.outputs.should-run }}
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
fetch-depth: 0
persist-credentials: false
- name: Detect changed files
id: changed-files
shell: bash
env:
BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.before }}
HEAD_SHA: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha || github.sha }}
run: |
set -euo pipefail
if [ -z "${BASE_SHA}" ] || [ "${BASE_SHA}" = "0000000000000000000000000000000000000000" ]; then
echo "should-run=true" >> "$GITHUB_OUTPUT"
echo "Unable to determine a base SHA; running install tests."
exit 0
fi
git diff --name-only "$BASE_SHA" "$HEAD_SHA" > changed-files.txt
cat changed-files.txt
if grep -E '^(install\.sh|scripts/test-install\.sh|scripts/test-bun-check\.sh|packages/cli/|\.github/workflows/test-install\.yaml)' changed-files.txt > /dev/null; then
echo "should-run=true" >> "$GITHUB_OUTPUT"
echo "Install-related files changed; running install tests."
else
echo "should-run=false" >> "$GITHUB_OUTPUT"
echo "No install-related files changed; skipping install test work."
fi
test-native-linux:
name: Native install (Linux)
needs: detect-install-changes
if: always()
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Check change detection
if: ${{ needs.detect-install-changes.result != 'success' }}
run: |
echo "Install change detection failed"
exit 1
- name: Skip install test
if: ${{ needs.detect-install-changes.outputs.should-run != 'true' }}
run: echo "No install-related files changed; skipping Native install (Linux)."
- name: Checkout
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- name: Setup Node.js
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup Bun
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6
with:
bun-version: "1.3.11"
- name: Test install script
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
run: |
set -euo pipefail
tmpdir=$(mktemp -d)
export HOME="$tmpdir"
trap 'rm -rf "$tmpdir"' EXIT
mkdir -p "$HOME/.bun/bin"
ln -s "$(which bun)" "$HOME/.bun/bin/bun"
export PATH="$HOME/.bun/bin:$PATH"
./install.sh -y
if [ ! -f "$HOME/.bun/bin/agentuity" ]; then
echo "❌ CLI not installed at $HOME/.bun/bin/agentuity"
ls -la "$HOME/.bun/bin/" || true
exit 1
fi
"$HOME/.bun/bin/agentuity" --version
echo "✅ Native Linux install test passed"
test-native-macos:
name: Native install (macOS)
needs: detect-install-changes
if: always()
runs-on: macos-latest
timeout-minutes: 10
steps:
- name: Check change detection
if: ${{ needs.detect-install-changes.result != 'success' }}
run: |
echo "Install change detection failed"
exit 1
- name: Skip install test
if: ${{ needs.detect-install-changes.outputs.should-run != 'true' }}
run: echo "No install-related files changed; skipping Native install (macOS)."
- name: Checkout
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- name: Setup Node.js
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: ${{ env.NODE_VERSION }}
- name: Setup Bun
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6
with:
bun-version: "1.3.11"
- name: Test install script
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
run: |
set -euo pipefail
tmpdir=$(mktemp -d)
export HOME="$tmpdir"
trap 'rm -rf "$tmpdir"' EXIT
mkdir -p "$HOME/.bun/bin"
ln -s "$(which bun)" "$HOME/.bun/bin/bun"
export PATH="$HOME/.bun/bin:$PATH"
./install.sh -y
if [ ! -f "$HOME/.bun/bin/agentuity" ]; then
echo "❌ CLI not installed at $HOME/.bun/bin/agentuity"
ls -la "$HOME/.bun/bin/" || true
exit 1
fi
"$HOME/.bun/bin/agentuity" --version
echo "✅ Native macOS install test passed"
test-linux-distros:
name: Linux distro install smoke
needs: detect-install-changes
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 40
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: ${{ env.NODE_VERSION }}
- name: Test installer across Linux distros
shell: bash
run: |
set -euo pipefail
cat > test-container.sh << 'EOF'
set -eu
if [ -n "${SETUP:-}" ]; then
echo "Running setup commands..."
eval "$SETUP" > /dev/null 2>&1
fi
install_node() {
node_major="${NODE_VERSION:-24}"
case "$(uname -m)" in
x86_64) node_arch="x64" ;;
aarch64 | arm64) node_arch="arm64" ;;
*) echo "Unsupported Node architecture: $(uname -m)" && exit 1 ;;
esac
archive=$(curl -fsSL "https://nodejs.org/dist/latest-v${node_major}.x/SHASUMS256.txt" | awk -v arch="$node_arch" '$2 ~ "^node-v[0-9]+\\.[0-9]+\\.[0-9]+-linux-" arch "\\.tar\\.xz$" { print $2; exit }')
if [ -z "$archive" ]; then
echo "Unable to resolve Node ${node_major} archive for ${node_arch}"
exit 1
fi
curl -fsSLo "/tmp/${archive}" "https://nodejs.org/dist/latest-v${node_major}.x/${archive}"
mkdir -p /opt/node
tar -xJf "/tmp/${archive}" -C /opt/node --strip-components=1
export PATH="/opt/node/bin:$PATH"
installed_major=$(node -p 'Number(process.versions.node.split(".")[0])')
if [ "$installed_major" -lt "$node_major" ]; then
echo "Expected Node ${node_major}+ but found $(node --version)"
exit 1
fi
echo "Node version: $(node --version)"
}
install_node
echo "Installing Bun..."
curl -fsSL https://bun.sh/install | bash -s -- bun-v1.3.11 > /dev/null 2>&1
export PATH="$HOME/.bun/bin:$PATH"
bun --version
if ! ./install.sh -y > /tmp/install.log 2>&1; then
echo "❌ Install failed:"
cat /tmp/install.log
exit 1
fi
if [ ! -f "$HOME/.bun/bin/agentuity" ]; then
echo "❌ CLI not found at $HOME/.bun/bin/agentuity"
ls -la "$HOME/.bun/bin/" || true
exit 1
fi
if ! "$HOME/.bun/bin/agentuity" --version > /tmp/version.log 2>&1; then
echo "❌ CLI execution failed:"
cat /tmp/version.log
exit 1
fi
version=$("$HOME/.bun/bin/agentuity" --version)
echo "✅ SUCCESS: agentuity version $version"
EOF
chmod +x test-container.sh
run_distro() {
local name="$1"
local image="$2"
local setup="$3"
echo "::group::${name}"
echo "Testing ${name} (${image})..."
docker run --rm \
-e CI=true \
-e NODE_VERSION="$NODE_VERSION" \
-e SETUP="$setup" \
-v "$PWD:/app" \
-w /app \
"$image" \
sh -c './test-container.sh'
echo "✅ ${name} test passed"
echo "::endgroup::"
}
run_distro 'Debian 12 (Bookworm)' 'debian:12@sha256:8c181802d706019b2ee6237441b3fb8691b92b5705daf7c4294e7405576c4a0d' 'apt-get update -qq && apt-get install -y -qq curl unzip xz-utils'
run_distro 'Debian 11 (Bullseye)' 'debian:11@sha256:cd3d9e8ec611d6fb11058fbcc4dbd9c27843f09b21623c4c81fb7a1bafc335ca' 'apt-get update -qq && apt-get install -y -qq curl unzip xz-utils'
run_distro 'Ubuntu 24.04' 'ubuntu:24.04@sha256:cdb5fd928fced577cfecf12c8966e830fcdf42ee481fb0b91904eeddc2fe5eff' 'apt-get update -qq && apt-get install -y -qq curl unzip xz-utils'
run_distro 'Ubuntu 22.04' 'ubuntu:22.04@sha256:14be402d3f1eeeb5e7da73d3260322c68e7b51c88388f53e88eb21d6450bd520' 'apt-get update -qq && apt-get install -y -qq curl unzip xz-utils'
run_distro 'Ubuntu 20.04' 'ubuntu:20.04@sha256:c664f8f86ed5a386b0a340d981b8f81714e21a8b9c73f658c4bea56aa179d54a' 'apt-get update -qq && apt-get install -y -qq curl unzip xz-utils'
run_distro 'Fedora Latest' 'fedora:latest@sha256:f717d3f59ea0dc45d3c024c9477e786bab7d418d26636920d17b48016f1e69ca' 'dnf install -y -q curl unzip xz'
run_distro 'Amazon Linux 2023' 'amazonlinux:2023@sha256:41e9b88745672d658868717255dcccbe531d82b88d6dd0ce5de04530b38b35fa' 'yum install -y -q curl gzip unzip xz'
test-bun-checks:
name: Bun version checks
needs: detect-install-changes
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: ${{ env.NODE_VERSION }}
- name: Run Bun version check tests
run: |
chmod +x scripts/test-bun-check.sh
./scripts/test-bun-check.sh
test-scenarios:
name: Installer scenarios
needs: detect-install-changes
if: ${{ needs.detect-install-changes.outputs.should-run == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
with:
node-version: ${{ env.NODE_VERSION }}
- name: Run installer scenarios
shell: bash
run: |
set -euo pipefail
# The single-quoted scenario bodies are intentionally expanded inside the container.
# shellcheck disable=SC2016
run_ubuntu() {
local name="$1"
local script="$2"
echo "::group::${name}"
docker run --rm -e CI=true -e NODE_VERSION="$NODE_VERSION" -v "$PWD:/app" -w /app ubuntu:latest@sha256:d31acef2a964b6df1f2b7e20a1525c4f2378024e087a4f8a8a9a4247e6a79573 sh -c "
set -e
apt-get update -qq && apt-get install -y -qq curl unzip xz-utils > /dev/null 2>&1
node_major=\"\${NODE_VERSION:-24}\"
case \"\$(uname -m)\" in
x86_64) node_arch=\"x64\" ;;
aarch64 | arm64) node_arch=\"arm64\" ;;
*) echo \"Unsupported Node architecture: \$(uname -m)\" && exit 1 ;;
esac
archive=\$(curl -fsSL \"https://nodejs.org/dist/latest-v\${node_major}.x/SHASUMS256.txt\" | awk -v arch=\"\$node_arch\" '\$2 ~ \"^node-v[0-9]+\\\\.[0-9]+\\\\.[0-9]+-linux-\" arch \"\\\\.tar\\\\.xz$\" { print \$2; exit }')
curl -fsSLo \"/tmp/\${archive}\" \"https://nodejs.org/dist/latest-v\${node_major}.x/\${archive}\"
mkdir -p /opt/node
tar -xJf \"/tmp/\${archive}\" -C /opt/node --strip-components=1
export PATH=\"/opt/node/bin:\$PATH\"
installed_major=\$(node -p 'Number(process.versions.node.split(\".\")[0])')
if [ \"\$installed_major\" -lt \"\$node_major\" ]; then
echo \"Expected Node \${node_major}+ but found \$(node --version)\"
exit 1
fi
echo \"Node version: \$(node --version)\"
curl -fsSL https://bun.sh/install | bash -s -- bun-v1.3.11 > /dev/null 2>&1
export PATH=\"\$HOME/.bun/bin:\$PATH\"
${script}
"
echo "✅ ${name} passed"
echo "::endgroup::"
}
# shellcheck disable=SC2016
run_ubuntu 'Force reinstall' '
./install.sh -y > /dev/null 2>&1
first_version=$($HOME/.bun/bin/agentuity --version)
./install.sh -y --force > /dev/null 2>&1
second_version=$($HOME/.bun/bin/agentuity --version)
echo "First version: $first_version"
echo "Second version: $second_version"
'
# shellcheck disable=SC2016
run_ubuntu 'Non-interactive with CI env' '
./install.sh > /tmp/install.log 2>&1
if [ ! -f "$HOME/.bun/bin/agentuity" ]; then
echo "❌ CLI not installed"
cat /tmp/install.log
exit 1
fi
$HOME/.bun/bin/agentuity --version
'
# shellcheck disable=SC2016
run_ubuntu 'Upgrade command available' '
./install.sh -y > /dev/null 2>&1
$HOME/.bun/bin/agentuity --help > /tmp/help.log 2>&1 || true
if ! grep -q "upgrade" /tmp/help.log; then
echo "⚠ Upgrade command not found (expected until new version is published)"
exit 0
fi
$HOME/.bun/bin/agentuity upgrade --help > /tmp/upgrade-help.log 2>&1 || true
if ! grep -q "Upgrade the CLI to the latest version" /tmp/upgrade-help.log; then
echo "❌ Upgrade help missing expected text"
cat /tmp/upgrade-help.log
exit 1
fi
'
# shellcheck disable=SC2016
run_ubuntu 'Legacy shim creation' '
mkdir -p "$HOME/.agentuity/bin"
touch "$HOME/.agentuity/bin/agentuity"
export PATH="$HOME/.agentuity/bin:$PATH"
./install.sh -y > /dev/null 2>&1
if [ ! -f "$HOME/.agentuity/bin/agentuity" ]; then
echo "❌ Legacy shim not created"
exit 1
fi
if ! "$HOME/.agentuity/bin/agentuity" --version > /dev/null 2>&1; then
echo "❌ Legacy shim does not work"
exit 1
fi
'
# shellcheck disable=SC2016
run_ubuntu 'Legacy shim cleanup when not on PATH' '
mkdir -p "$HOME/.agentuity/bin"
touch "$HOME/.agentuity/bin/agentuity"
./install.sh -y > /dev/null 2>&1
if [ -f "$HOME/.agentuity/bin/agentuity" ]; then
echo "❌ Legacy binary should have been cleaned up (not on PATH)"
exit 1
fi
if ! "$HOME/.bun/bin/agentuity" --version > /dev/null 2>&1; then
echo "❌ Main CLI does not work"
exit 1
fi
'
test-summary:
name: Install test summary
runs-on: ubuntu-latest
needs:
- detect-install-changes
- test-native-linux
- test-native-macos
- test-linux-distros
- test-bun-checks
- test-scenarios
if: always()
steps:
- name: Check results
run: |
if [ "${{ needs.detect-install-changes.result }}" != "success" ]; then
echo "❌ Install change detection failed"
exit 1
fi
if [ "${{ needs.detect-install-changes.outputs.should-run }}" != "true" ]; then
echo "✅ No install-related files changed; install tests skipped"
exit 0
fi
if [ "${{ needs.test-native-linux.result }}" != "success" ] || \
[ "${{ needs.test-native-macos.result }}" != "success" ] || \
[ "${{ needs.test-linux-distros.result }}" != "success" ] || \
[ "${{ needs.test-bun-checks.result }}" != "success" ] || \
[ "${{ needs.test-scenarios.result }}" != "success" ]; then
echo "❌ Some tests failed"
exit 1
fi
echo "✅ All tests passed!"