Skip to content

refactor: eliminate shell scripts across toolchains for Bazel-native implementation #132

refactor: eliminate shell scripts across toolchains for Bazel-native implementation

refactor: eliminate shell scripts across toolchains for Bazel-native implementation #132

Workflow file for this run

name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
env:
BAZEL_VERSION: 8.3.1
CI: true
jobs:
lint:
name: Lint and Format Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Bazelisk
run: |
curl -LO https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64
chmod +x bazelisk-linux-amd64
sudo mv bazelisk-linux-amd64 /usr/local/bin/bazel
- name: Check Buildifier Formatting
run: |
echo "Checking Bazel file formatting..."
# Check only formatting, not lint warnings
bazel run //:buildifier -- --lint=off --mode=check -r .
- name: Show Lint Warnings (Informational)
run: |
echo "Showing lint warnings (informational only - won't fail the build)..."
# Show warnings but don't fail the CI
bazel run //:buildifier -- --lint=warn --mode=check -r . || true
test-linux:
name: Test on ubuntu-latest
runs-on: ubuntu-latest
needs: lint # Run tests only after lint passes
services:
registry:
image: registry:2
ports:
- 5001:5000
options: >-
--health-cmd "wget --no-verbose --tries=1 --spider http://localhost:5000/v2/ || exit 1"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
with:
submodules: false
- name: Cache Bazel
uses: actions/cache@v4
with:
path: |
~/.cache/bazel
~/.cache/bazelisk
key: ${{ runner.os }}-bazel-${{ hashFiles('MODULE.bazel', 'WORKSPACE.bazel', '**/*.bzl') }}
restore-keys: |
${{ runner.os }}-bazel-
- name: Install Bazelisk
run: |
curl -LO https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64
chmod +x bazelisk-linux-amd64
sudo mv bazelisk-linux-amd64 /usr/local/bin/bazel
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-wasip1,wasm32-wasip2,wasm32-unknown-unknown
components: clippy
- name: Verify Bazel Installation
run: bazel version
- name: Setup OCI Registry with Test Components
run: |
# Build and publish test components to local registry for OCI tests
echo "Publishing test components to localhost:5001 registry..."
bazel run //examples/simple_oci_test:publish_greeting
bazel run //examples/simple_oci_test:publish_calculator
# Verify components are available
echo "Verifying registry contents..."
curl -s http://localhost:5001/v2/_catalog || echo "Registry catalog request failed"
curl -s http://localhost:5001/v2/test/simple/greeting/tags/list || echo "Greeting tags request failed"
- name: Build All Targets
run: |
# Build core working targets, exclude incomplete/problematic examples
bazel build -- //... \
-//examples/world_export/... \
-//examples/multi_profile/... \
-//examples/cpp_component/... \
-//examples/js_component/... \
-//examples/wac_remote_compose/... \
-//examples/wac_oci_composition/... \
-//examples/wkg_integration/... \
-//examples/wizer_example/... \
-//examples/simple_oci_test/... \
-//examples/microservices_architecture/... \
-//test_wac/... \
-//test/wkg/... \
-//test/production/... \
-//tools-builder/... \
-//examples/wasm_signing/... \
-//test_examples/... \
-//test_wit_deps/... \
-//examples/oci_publishing:secure_publish_enterprise \
-//test/integration:multi_service_system \
-//test/integration:composition_build_test \
-//test/integration:integration_tests \
-//test/export_macro:test_component_wasm_lib_release_host \
-//test/integration:basic_component_wasm_lib_debug_host \
-//test/integration:basic_component_wasm_lib_release_host \
-//test/integration:consumer_component_wasm_lib_release_host \
-//test/integration:service_a_component_wasm_lib_release_host \
-//test/integration:service_b_component_wasm_lib_release_host \
-//test/integration:wasi_component_wasm_lib_release_host \
-//test/unit:test_component_simple_wasm_lib_release_host \
-//test/unit:test_component_with_deps_wasm_lib_release_host \
-//examples/basic:hello_component_wasm_lib_release_host \
-//tools/checksum_updater_wasm:checksum_updater_wasm_wizer_component_release_wasm_lib_release_host
- name: Run Tests
run: bazel test --test_output=errors -- //test/integration:basic_component_build_test //test/integration:basic_component_validation //test/unit:unit_tests
- name: Run Clippy
run: echo "Skipping clippy for now due to target triple issues"
- name: Validate Toolchain Download Fix
run: echo "Skipping toolchain download validation test due to network dependency"
- name: Build Examples
run: |
bazel build //examples/basic:hello_component
- name: Validate Generated Files
run: |
# Check that WASM files are valid
bazel build //examples/basic:hello_component
wasm-tools validate bazel-bin/examples/basic/hello_component.wasm || true
test-macos:
name: Test on macos-latest
runs-on: macos-latest
needs: lint # Run tests only after lint passes
steps:
- uses: actions/checkout@v4
with:
submodules: false
- name: Cache Bazel
uses: actions/cache@v4
with:
path: |
~/.cache/bazel
~/.cache/bazelisk
key: ${{ runner.os }}-bazel-${{ hashFiles('MODULE.bazel', 'WORKSPACE.bazel', '**/*.bzl') }}
restore-keys: |
${{ runner.os }}-bazel-
- name: Install Bazelisk
run: |
curl -LO https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-darwin-amd64
chmod +x bazelisk-darwin-amd64
sudo mv bazelisk-darwin-amd64 /usr/local/bin/bazel
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-wasip1,wasm32-wasip2,wasm32-unknown-unknown
components: clippy
- name: Verify Bazel Installation
run: bazel version
- name: Build All Targets
run: |
# Build core working targets, exclude incomplete/problematic examples
# Additional exclusions for macOS where Docker services aren't available
# and where some tools have configuration issues
if [[ "$RUNNER_OS" == "macOS" ]]; then
EXTRA_EXCLUDES="-//examples/simple_oci_test/... -//examples/microservices_architecture/... -//test/integration:validate_consumer_deps -//test_wit_deps/consumer:check_deps"
else
EXTRA_EXCLUDES=""
fi
bazel build -- //... \
-//examples/world_export/... \
-//examples/multi_profile/... \
-//examples/cpp_component/... \
-//examples/js_component/... \
-//examples/wac_remote_compose/... \
-//examples/wac_oci_composition/... \
-//examples/wkg_integration/... \
-//examples/wizer_example/... \
-//test_wac/... \
-//test/wkg/... \
-//test/production/... \
-//tools-builder/... \
$EXTRA_EXCLUDES \
-//examples/wasm_signing/... \
-//test_examples/... \
-//test_wit_deps/... \
-//examples/oci_publishing:secure_publish_enterprise \
-//test/integration:multi_service_system \
-//test/integration:composition_build_test \
-//test/integration:integration_tests \
-//test/export_macro:test_component_wasm_lib_release_host \
-//test/integration:basic_component_wasm_lib_debug_host \
-//test/integration:basic_component_wasm_lib_release_host \
-//test/integration:consumer_component_wasm_lib_release_host \
-//test/integration:service_a_component_wasm_lib_release_host \
-//test/integration:service_b_component_wasm_lib_release_host \
-//test/integration:wasi_component_wasm_lib_release_host \
-//test/unit:test_component_simple_wasm_lib_release_host \
-//test/unit:test_component_with_deps_wasm_lib_release_host \
-//examples/basic:hello_component_wasm_lib_release_host \
-//tools/checksum_updater_wasm:checksum_updater_wasm_wizer_component_release_wasm_lib_release_host
- name: Run Tests
run: bazel test --test_output=errors -- //test/integration:basic_component_build_test //test/integration:basic_component_validation //test/unit:unit_tests
- name: Run Clippy
run: echo "Skipping clippy for now due to target triple issues"
- name: Validate Toolchain Download Fix
run: echo "Skipping toolchain download validation test due to network dependency"
- name: Build Examples
run: |
bazel build //examples/basic:hello_component
- name: Validate Generated Files
run: |
# Check that WASM files are valid
bazel build //examples/basic:hello_component
wasm-tools validate bazel-bin/examples/basic/hello_component.wasm || true
bcr-docker-test:
name: BCR Docker Environment Test
runs-on: ubuntu-latest
needs: lint # Run in parallel with regular tests
steps:
- uses: actions/checkout@v4
with:
submodules: false
- name: Test Hermetic Build in BCR Docker Environment
run: |
echo "🐳 Testing in BCR (Bazel Central Registry) Docker environment"
echo "This simulates the exact environment used for BCR acceptance testing"
# Test the primary build target that was failing in BCR testing
docker run --rm -v "$(pwd):/workspace" -w /workspace \
gcr.io/bazel-public/ubuntu2204 bash -c "
echo '=== BCR Environment Information ==='
uname -a
cat /etc/os-release
echo
echo '=== Testing Hermetic Build ==='
echo 'Building: //examples/basic:hello_component'
echo 'This verifies all toolchains work without system dependencies'
echo
# Set up proper Bazel cache with permissions
mkdir -p /tmp/bazel_cache
chmod 755 /tmp/bazel_cache
# Test the build with timeout to prevent hanging
timeout 600 bazel --output_base=/tmp/bazel_cache build //examples/basic:hello_component
BUILD_EXIT_CODE=\$?
echo
if [ \$BUILD_EXIT_CODE -eq 0 ]; then
echo '✅ BCR Docker build SUCCESSFUL!'
echo 'Verifying component file...'
# Verify the built component
if [ -f bazel-bin/examples/basic/hello_component.wasm ]; then
file bazel-bin/examples/basic/hello_component.wasm
ls -la bazel-bin/examples/basic/hello_component.wasm
echo '✅ WebAssembly component successfully created'
else
echo '⚠️ Component file not found but build succeeded'
fi
elif [ \$BUILD_EXIT_CODE -eq 124 ]; then
echo '❌ BCR Docker build TIMED OUT (600s)'
exit 1
else
echo '❌ BCR Docker build FAILED'
exit 1
fi
"
- name: Test Additional BCR Scenarios
run: |
echo "🧪 Testing additional BCR scenarios"
# Test that toolchain setup works without failures
docker run --rm -v "$(pwd):/workspace" -w /workspace \
gcr.io/bazel-public/ubuntu2204 bash -c "
echo '=== Testing Toolchain Configuration ==='
mkdir -p /tmp/bazel_cache
# Just query to verify toolchain setup
timeout 300 bazel --output_base=/tmp/bazel_cache query --output=label //examples/basic:hello_component
if [ \$? -eq 0 ]; then
echo '✅ Toolchain analysis successful in BCR environment'
else
echo '❌ Toolchain analysis failed'
exit 1
fi
"
integration:
name: Integration Tests
runs-on: ubuntu-latest
needs: [test-linux, test-macos]
steps:
- uses: actions/checkout@v4
with:
submodules: false
- name: Install Dependencies
run: |
curl -LO https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64
chmod +x bazelisk-linux-amd64
sudo mv bazelisk-linux-amd64 /usr/local/bin/bazel
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source ~/.cargo/env
rustup target add wasm32-wasip2 wasm32-wasip1
- name: Test Core Component Build
run: |
# Test basic component functionality
bazel build //examples/basic:hello_component_release
# Verify component was created using bazel-bin symlink if available
if [ -d "bazel-bin/examples/basic" ]; then
ls -la bazel-bin/examples/basic/
else
echo "Using bazel info to find output location..."
BAZEL_BIN=$(bazel info bazel-bin)
if [ -d "$BAZEL_BIN/examples/basic" ]; then
ls -la "$BAZEL_BIN/examples/basic/"
else
echo "Directory not found, checking build outputs..."
bazel outputs //examples/basic:hello_component_release || echo "bazel outputs not available"
fi
fi
- name: Test Component Validation
run: |
# Build and validate basic component
bazel build //examples/basic:hello_component_release
# Find WASM file using different methods
WASM_FILE=""
if [ -d "bazel-bin/examples/basic" ]; then
WASM_FILE=$(find bazel-bin/examples/basic/ -name "*.wasm" | head -1)
else
BAZEL_BIN=$(bazel info bazel-bin)
if [ -d "$BAZEL_BIN/examples/basic" ]; then
WASM_FILE=$(find "$BAZEL_BIN/examples/basic/" -name "*.wasm" | head -1)
fi
fi
if [ -n "$WASM_FILE" ]; then
echo "Found WASM file: $WASM_FILE"
wasm-tools validate "$WASM_FILE" || echo "Validation failed but continuing"
else
echo "No WASM file found, checking if build completed successfully..."
echo "Build targets:"
bazel query "//examples/basic:hello_component_release" || echo "Query failed"
fi
- name: Test Component Output Structure
run: |
# Check component output structure using multiple methods
echo "Checking for WASM component outputs..."
WASM_COUNT=0
if [ -d "bazel-bin/examples/basic" ]; then
echo "Using bazel-bin symlink:"
find bazel-bin/examples/basic/ -name "*.wasm" || echo "No .wasm files found via symlink"
WASM_COUNT=$(find bazel-bin/examples/basic/ -name "*.wasm" 2>/dev/null | wc -l)
else
echo "Using bazel info:"
BAZEL_BIN=$(bazel info bazel-bin)
if [ -d "$BAZEL_BIN/examples/basic" ]; then
find "$BAZEL_BIN/examples/basic/" -name "*.wasm" || echo "No .wasm files found via bazel info"
WASM_COUNT=$(find "$BAZEL_BIN/examples/basic/" -name "*.wasm" 2>/dev/null | wc -l)
else
echo "Directory not found via bazel info, checking build success..."
bazel build --check_up_to_date //examples/basic:hello_component_release && echo "Build is up to date" || echo "Build check failed"
fi
fi
if [ "$WASM_COUNT" -gt 0 ]; then
echo "✅ Found $WASM_COUNT WASM component(s)"
else
echo "⚠️ No WASM components found in expected locations, but build may have succeeded"
fi
release:
name: Release
runs-on: ubuntu-latest
needs: [test-linux, test-macos, integration, bcr-docker-test]
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: false
- name: Install git-cliff
uses: taiki-e/install-action@v2
with:
tool: git-cliff
- name: Generate Release Notes
run: |
# Generate changelog for the latest changes
git-cliff --latest --strip header -o release_notes.md
echo "Generated release notes:"
cat release_notes.md
- name: Create Release Archive
run: |
# Create a clean directory for the release
mkdir -p release_tmp
# Copy files excluding Bazel and git directories
rsync -av \
--exclude='.git*' \
--exclude='bazel-*' \
--exclude='*.tar.gz' \
--exclude='.bazel*' \
--exclude='release_tmp' \
. release_tmp/
# Create the archive from the clean directory
tar -czf rules_wasm_component.tar.gz -C release_tmp .
- name: Upload Release Asset
uses: actions/upload-artifact@v4
with:
name: rules_wasm_component
path: rules_wasm_component.tar.gz