refactor: move forge test intense workflow into separate file #60
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Foundry | |
on: | |
workflow_dispatch: | |
push: | |
branches: | |
- mainnet | |
- testnet-holesky | |
- dev | |
pull_request: | |
env: | |
FOUNDRY_PROFILE: ci | |
RPC_MAINNET: ${{ secrets.RPC_MAINNET }} | |
RPC_HOLESKY: ${{ secrets.RPC_HOLESKY }} | |
CHAIN_ID: ${{ secrets.CHAIN_ID }} | |
jobs: | |
# ----------------------------------------------------------------------- | |
# Forge Test | |
# ----------------------------------------------------------------------- | |
test: | |
name: Test | |
runs-on: ubuntu-latest | |
steps: | |
# Check out repository with all submodules for complete codebase access. | |
- uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
# Install the Foundry toolchain. | |
- name: Install Foundry | |
uses: foundry-rs/foundry-toolchain@v1 | |
with: | |
version: stable | |
# Run Forge's formatting checker to ensure consistent code style. | |
- name: Forge Fmt | |
run: | | |
forge fmt --check | |
id: fmt | |
# Build the project and display contract sizes. | |
- name: Forge Build | |
run: | | |
forge --version | |
forge build --sizes | |
id: build | |
# Run local tests (unit and integration). | |
- name: Forge Test (Local) | |
run: forge test -vvv | |
# Run integration tests using a mainnet fork. | |
- name: Forge Test Integration (Fork) | |
run: FOUNDRY_PROFILE=forktest forge test --match-contract Integration -vvv | |
# ----------------------------------------------------------------------- | |
# Forge Coverage | |
# ----------------------------------------------------------------------- | |
run-coverage: | |
name: Coverage | |
runs-on: ubuntu-latest | |
steps: | |
# Check out repository with all submodules for complete codebase access. | |
- uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
# Install the Foundry toolchain. | |
- name: Install Foundry | |
uses: foundry-rs/foundry-toolchain@v1 | |
with: | |
version: stable | |
# Install LCOV for coverage report generation. | |
- name: Install LCOV | |
run: | | |
sudo apt-get install lcov | |
id: lcov | |
# Build the project and display contract sizes. | |
- name: Forge Build | |
run: | | |
forge --version | |
forge build --sizes | |
id: build | |
# Run Forge coverage with LCOV report format, excluding test and script files | |
- name: Forge Coverage | |
run: | | |
FOUNDRY_DENY_WARNINGS=false FOUNDRY_PROFILE=ci forge coverage --report lcov --report summary --no-match-coverage "script|test" | |
genhtml -q -o report ./lcov.info | |
# Upload coverage report as artifact before potential failure | |
- name: Upload Coverage Report | |
uses: actions/upload-artifact@v4 | |
with: | |
name: code-coverage-report | |
path: report/* | |
# Check coverage threshold after uploading report | |
- name: Check Coverage Threshold for >=90% | |
run: | | |
LINES_PCT=$(lcov --summary lcov.info | grep "lines" | cut -d ':' -f 2 | cut -d '%' -f 1 | tr -d '[:space:]') | |
FUNCTIONS_PCT=$(lcov --summary lcov.info | grep "functions" | cut -d ':' -f 2 | cut -d '%' -f 1 | tr -d '[:space:]') | |
FAILED=0 | |
if (( $(echo "$LINES_PCT < 90" | bc -l) )); then | |
echo -e "\033[1;31m❌ Lines coverage ($LINES_PCT%) is below minimum threshold of 90%\033[0m" | |
FAILED=1 | |
else | |
echo -e "\033[1;32m✅ Lines coverage ($LINES_PCT%) meets minimum threshold of 90%\033[0m" | |
fi | |
if (( $(echo "$FUNCTIONS_PCT < 90" | bc -l) )); then | |
echo -e "\033[1;31m❌ Functions coverage ($FUNCTIONS_PCT%) is below minimum threshold of 90%\033[0m" | |
FAILED=1 | |
else | |
echo -e "\033[1;32m✅ Functions coverage ($FUNCTIONS_PCT%) meets minimum threshold of 90%\033[0m" | |
fi | |
if [ $FAILED -eq 1 ]; then | |
exit 1 | |
fi | |
# ----------------------------------------------------------------------- | |
# Forge Size Diff | |
# ----------------------------------------------------------------------- | |
compare-contract-sizes: | |
name: Size Diff | |
runs-on: ubuntu-latest | |
steps: | |
# Check out repository with all submodules for complete codebase access. | |
- uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
# Install the Foundry toolchain. | |
- name: Install Foundry | |
uses: foundry-rs/foundry-toolchain@v1 | |
with: | |
version: stable | |
- name: Build contracts on PR branch | |
run: | | |
forge build --json --sizes | jq '.' > pr_sizes.json | |
- name: Checkout target branch | |
run: | | |
git fetch origin ${{ github.base_ref }} | |
git checkout ${{ github.base_ref }} | |
- name: Build contracts on target branch | |
run: | | |
forge build --json --sizes | jq '.' > target_sizes.json | |
- name: Compare contract sizes using Bash | |
run: | | |
# Extract contract names | |
contracts=$(jq -r 'keys[]' pr_sizes.json) | |
# Track if there are any differences | |
has_differences=0 | |
echo -e "\n📊 \033[1;34mContract Size Comparison Report\033[0m 📊\n" | |
# Iterate through contracts and compare sizes | |
for contract in $contracts; do | |
pr_runtime=$(jq -r --arg contract "$contract" '.[$contract].runtime_size // 0' pr_sizes.json) | |
pr_init=$(jq -r --arg contract "$contract" '.[$contract].init_size // 0' pr_sizes.json) | |
target_runtime=$(jq -r --arg contract "$contract" '.[$contract].runtime_size // 0' target_sizes.json) | |
target_init=$(jq -r --arg contract "$contract" '.[$contract].init_size // 0' target_sizes.json) | |
runtime_diff=$((pr_runtime - target_runtime)) | |
init_diff=$((pr_init - target_init)) | |
if [ "$runtime_diff" -ne 0 ] || [ "$init_diff" -ne 0 ]; then | |
echo -e "\033[1;36m📝 $contract:\033[0m" | |
if [ "$runtime_diff" -ne 0 ]; then | |
if [ "$runtime_diff" -gt 0 ]; then | |
echo -e " Runtime: \033[1;31m+$runtime_diff bytes\033[0m 📈" | |
else | |
echo -e " Runtime: \033[1;32m$runtime_diff bytes\033[0m 📉" | |
fi | |
fi | |
if [ "$init_diff" -ne 0 ]; then | |
if [ "$init_diff" -gt 0 ]; then | |
echo -e " Init: \033[1;31m+$init_diff bytes\033[0m 📈" | |
else | |
echo -e " Init: \033[1;32m$init_diff bytes\033[0m 📉" | |
fi | |
fi | |
has_differences=1 | |
fi | |
done | |
if [ "$has_differences" -eq 0 ]; then | |
echo -e "\033[1;32m✨ No contract size changes detected ✨\033[0m" | |
fi |