Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 132 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]

env:
CARGO_TERM_COLOR: always

jobs:
test:
name: Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-test-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-test-

- name: Run tests
run: cargo test --verbose

clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
components: clippy

- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-clippy-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-clippy-

- name: Run Clippy
run: cargo clippy -- -D warnings

fmt:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt

- name: Check formatting
run: cargo fmt -- --check

build-wasm:
name: Build WASM
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown

- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-wasm-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-wasm-

- name: Build WASM
run: cargo build --target wasm32-unknown-unknown --release

- name: Upload WASM artifact
uses: actions/upload-artifact@v4
with:
name: flagd_evaluator.wasm
path: target/wasm32-unknown-unknown/release/flagd_evaluator.wasm
retention-days: 30

validate-size:
name: Validate WASM Size
needs: build-wasm
runs-on: ubuntu-latest
steps:
- name: Download WASM artifact
uses: actions/download-artifact@v4
with:
name: flagd_evaluator.wasm

- name: Check WASM size
run: |
SIZE=$(stat -c%s flagd_evaluator.wasm)
echo "WASM file size: $SIZE bytes ($(echo "scale=2; $SIZE / 1024" | bc) KB)"
MAX_SIZE=$((2000 * 1024)) # 2MB in bytes (includes full JSON Logic implementation)
if [ $SIZE -gt $MAX_SIZE ]; then
echo "Error: WASM file size ($SIZE bytes) exceeds maximum allowed size ($MAX_SIZE bytes)"
exit 1
fi
echo "WASM file size is within limits"
77 changes: 77 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
name: Release

on:
push:
tags:
- 'v*.*.*'

env:
CARGO_TERM_COLOR: always

permissions:
contents: write

jobs:
build-release:
name: Build Release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown

- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-release-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-release-

- name: Build WASM
run: cargo build --target wasm32-unknown-unknown --release

- name: Install wasm-opt
run: |
curl -L https://github.com/WebAssembly/binaryen/releases/download/version_118/binaryen-version_118-x86_64-linux.tar.gz | tar xz -C /tmp
echo "/tmp/binaryen-version_118/bin" >> $GITHUB_PATH

- name: Optimize WASM
run: |
wasm-opt -Oz --enable-bulk-memory --enable-nontrapping-float-to-int \
-o target/wasm32-unknown-unknown/release/flagd_evaluator.optimized.wasm \
target/wasm32-unknown-unknown/release/flagd_evaluator.wasm
mv target/wasm32-unknown-unknown/release/flagd_evaluator.optimized.wasm \
target/wasm32-unknown-unknown/release/flagd_evaluator.wasm
echo "WASM optimized with wasm-opt"

- name: Generate checksums
run: |
cd target/wasm32-unknown-unknown/release
sha256sum flagd_evaluator.wasm > flagd_evaluator.wasm.sha256
echo "SHA256 checksum:"
cat flagd_evaluator.wasm.sha256

- name: Get WASM size
run: |
SIZE=$(stat -c%s target/wasm32-unknown-unknown/release/flagd_evaluator.wasm)
echo "WASM file size: $SIZE bytes ($(echo "scale=2; $SIZE / 1024" | bc) KB)"

- name: Create Release
uses: softprops/action-gh-release@v2
with:
files: |
target/wasm32-unknown-unknown/release/flagd_evaluator.wasm
target/wasm32-unknown-unknown/release/flagd_evaluator.wasm.sha256
generate_release_notes: true
fail_on_unmatched_files: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
46 changes: 46 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Generated files
/target/
/dist/

# Cargo lock file (library)
Cargo.lock

# IDE and editor files
.idea/
.vscode/
*.swp
*.swo
*~
.DS_Store

# Build artifacts
*.wasm
!examples/**/*.wasm

# Backup files
*.bak
*.orig

# Test coverage
*.profraw
*.profdata
coverage/
tarpaulin-report.html

# Local environment
.env
.env.local

# Temporary files
*.tmp
*.temp
tmp/
temp/

# Documentation build
/target/doc/

# OS generated files
Thumbs.db
ehthumbs.db
Desktop.ini
Loading