Skip to content

Commit

Permalink
feat: earthly bb tests + arm + satellites (#5268)
Browse files Browse the repository at this point in the history
Earthly:
- no longer copy timestamps (COPY --keep-ts) outside of C++, to be
revisited (C++ is the only confirmed need of timestamps)
- use https://docs.earthly.dev/earthly-cloud/satellites earthly
satellites, one arm one x86 per user
- run bb tests in earthly and one additional e2e test

---------

Co-authored-by: ludamad <[email protected]>
Co-authored-by: ludamad <[email protected]>
  • Loading branch information
3 people authored Mar 20, 2024
1 parent c237193 commit eca12b3
Show file tree
Hide file tree
Showing 22 changed files with 157 additions and 71 deletions.
94 changes: 67 additions & 27 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,48 +1,88 @@
name: Run CI with Earthly
name: Earthly CI
on:
push:
branches:
- master
branches: [master]
pull_request: {}
workflow_dispatch: {}

jobs:
ci:
e2e:
runs-on: ubuntu-latest
# run ci for both x86_64 and arm64
# strategy: {matrix: {environment: [x86, arm]}}
# TODO figure out why arm64 doesn't exit properly
strategy: {matrix: {environment: [x86]}}
env:
EARTHLY_TOKEN: ${{ secrets.EARTHLY_TOKEN }}
# TODO currently names are coupled to platform
strategy: { matrix: { environment: [x86, arm], test: [e2e-escrow-contract, e2e-account-contracts] } }
# cancel if reran on same PR if exists, otherwise if on same commit
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ matrix.environment }}
group: ${{ matrix.test }}-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ matrix.environment }}
cancel-in-progress: true
steps:
- uses: earthly/actions-setup@v1
with:
version: v0.8.5

- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
submodules: recursive

- name: Setup
working-directory: ./scripts
run: ./setup_env.sh ${{ matrix.environment }} ${{ secrets.DOCKERHUB_PASSWORD }} ${{ secrets.BUILD_INSTANCE_SSH_KEY }}

- name: Test
working-directory: ./yarn-project/end-to-end
run: |
mkdir -p ~/.ssh
echo DOCKER_HOST=ssh://build-instance-${{ matrix.environment }}.aztecprotocol.com >> $GITHUB_ENV
echo ${{ secrets.DOCKERHUB_PASSWORD}} | docker login -u aztecprotocolci --password-stdin
echo ${{ secrets.BUILD_INSTANCE_SSH_KEY }} | base64 -d > ~/.ssh/build_instance_key
chmod 600 ~/.ssh/build_instance_key
cat > ~/.ssh/config <<EOF
IdentityFile ~/.ssh/build_instance_key
StrictHostKeyChecking no
User ubuntu
EOF
# TODO put in script
if [ "${{ matrix.environment }}" == "arm" ]; then
PLATFORM=linux/arm64
elif [ "${{ matrix.environment }}" == "x86" ]; then
PLATFORM=linux/amd64
fi
earthly sat --org aztec launch --size 4xlarge --platform $PLATFORM build-${{github.actor}}-${{ matrix.environment }} || true
if [ ${{ github.ref_name }} = master ] ; then
# update the remote cache
export EARTHLY_PUSH=true
fi
# TODO need to use more SAVE IMAGE --cache-hint and explicit BUILD statements for remote-cache to work well but then it should read artifacts from master done by all runners
earthly -P --no-output --org aztec --remote-cache=aztecprotocol/cache:${{matrix.test}} --sat build-${{github.actor}}-${{ matrix.environment }} +${{ matrix.test }}
# Turn on if updating our custom built WASM-enabled clang (wasi-sdk), foundry or other base images
#- name: Ensure Base Images
# run: |
# scripts/earthly --push ./foundry/+build
# Uncomment the following line if needed for the arm environment
# scripts/earthly --push ./barretenberg/cpp/+build-wasi-sdk
bb-native-tests:
runs-on: ubuntu-latest
env:
EARTHLY_TOKEN: ${{ secrets.EARTHLY_TOKEN }}
# run for both x86_64 and arm64
# TODO currently names are coupled to platform
strategy: { matrix: { environment: [x86, arm] } }
# cancel if reran on same PR if exists, otherwise if on same commit
concurrency:
group: bb-native-tests-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-${{ matrix.environment }}
cancel-in-progress: true
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
submodules: recursive

- name: Setup
working-directory: ./scripts
run: ./setup_env.sh ${{ matrix.environment }} ${{ secrets.DOCKERHUB_PASSWORD }} ${{ secrets.BUILD_INSTANCE_SSH_KEY }}

- name: CI
run: scripts/earthly +build-ci-small
- name: Build and test
working-directory: ./barretenberg/cpp
run: |
# TODO put in script
if [ "${{ matrix.environment }}" == "arm" ]; then
PLATFORM=linux/arm64
elif [ "${{ matrix.environment }}" == "x86" ]; then
PLATFORM=linux/amd64
fi
earthly sat --org aztec launch --size 4xlarge --platform $PLATFORM build-${{github.actor}}-${{ matrix.environment }} || true
if [ ${{ github.ref_name }} = master ] ; then
# update the remote cache
export EARTHLY_PUSH=true
fi
# TODO need to use more SAVE IMAGE --cache-hint and explicit BUILD statements for remote-cache to work well but then it should read artifacts from master done by all runners
earthly -P --no-output --org aztec --remote-cache=aztecprotocol/cache:bb-native-tests --sat build-${{github.actor}}-${{ matrix.environment }} +test
2 changes: 1 addition & 1 deletion avm-transpiler/Earthfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ WORKDIR /build/avm-transpiler

RUN apt-get update && apt-get install -y git

COPY --keep-ts --dir scripts src Cargo.lock Cargo.toml rust-toolchain.toml .
COPY --dir scripts src Cargo.lock Cargo.toml rust-toolchain.toml .

build:
RUN ./scripts/bootstrap_native.sh
Expand Down
15 changes: 15 additions & 0 deletions barretenberg/cpp/Earthfile
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ RUN apt-get update && apt-get install -y \
WORKDIR /build

SAVE IMAGE --push aztecprotocol/cache:bb-ubuntu-lunar
SAVE IMAGE --cache-hint

build-wasi-sdk-image:
WORKDIR /
Expand Down Expand Up @@ -58,6 +59,11 @@ source:
# cmake source
COPY --keep-ts --dir cmake CMakeLists.txt CMakePresets.json .

preset-release-assert-all:
FROM +source
RUN cmake --preset clang16 -DCMAKE_BUILD_TYPE=RelWithAssert && cmake --build --preset clang16
SAVE ARTIFACT bin

preset-release:
FROM +source
DO +RUN_CMAKE --configure="--preset clang16" --build="--target bb"
Expand All @@ -76,6 +82,7 @@ preset-wasm:
DO +RUN_CMAKE --configure="--preset wasm-threads" --build="--target barretenberg.wasm"
RUN ./src/wasi-sdk/bin/llvm-strip ./bin/barretenberg.wasm
SAVE ARTIFACT bin
SAVE IMAGE --cache-hint

preset-gcc:
FROM +source
Expand Down Expand Up @@ -103,6 +110,7 @@ preset-op-count-time:
SAVE ARTIFACT bin

test-clang-format:
FROM +source
COPY .clang-format .
COPY format.sh .
RUN ./format.sh check
Expand All @@ -118,6 +126,13 @@ bench-client-ivc:

build: # default target
BUILD +preset-release
BUILD +preset-wasm

test:
BUILD +test-clang-format
FROM +preset-release-assert-all
COPY --dir ./srs_db/+build/. srs_db
RUN cd build && GTEST_COLOR=1 ctest -j$(nproc) --output-on-failure

# Functions
RUN_CMAKE:
Expand Down
6 changes: 3 additions & 3 deletions barretenberg/cpp/bootstrap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,9 @@ b="\033[34m" # Blue
p="\033[35m" # Purple
r="\033[0m" # Reset

(build_native > >(awk -W interactive -v g="$g" -v r="$r" '$0=g"native: "r $0')) &
(build_wasm > >(awk -W interactive -v b="$b" -v r="$r" '$0=b"wasm: "r $0')) &
(build_wasm_threads > >(awk -W interactive -v p="$p" -v r="$r" '$0=p"wasm_threads: "r $0')) &
(build_native > >(awk -v g="$g" -v r="$r" '{print g "native: " r $0}')) &
(build_wasm > >(awk -v b="$b" -v r="$r" '{print b "wasm: " r $0}')) &
(build_wasm_threads > >(awk -v p="$p" -v r="$r" '{print p "wasm_threads: "r $0}')) &

for job in $(jobs -p); do
wait $job || exit 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ size_t generate_ecdsa_constraint(EcdsaSecp256r1Constraint& ecdsa_r1_constraint,

TEST(ECDSASecp256r1, test_hardcoded)
{
bb::srs::init_crs_factory("../srs_db/ignition");
EcdsaSecp256r1Constraint ecdsa_r1_constraint;
WitnessVector witness_values;

Expand Down Expand Up @@ -168,6 +169,7 @@ TEST(ECDSASecp256r1, test_hardcoded)

TEST(ECDSASecp256r1, TestECDSAConstraintSucceed)
{
bb::srs::init_crs_factory("../srs_db/ignition");
EcdsaSecp256r1Constraint ecdsa_r1_constraint;
WitnessVector witness_values;
size_t num_variables = generate_ecdsa_constraint(ecdsa_r1_constraint, witness_values);
Expand Down Expand Up @@ -216,6 +218,7 @@ TEST(ECDSASecp256r1, TestECDSAConstraintSucceed)
// even though we are just building the circuit.
TEST(ECDSASecp256r1, TestECDSACompilesForVerifier)
{
bb::srs::init_crs_factory("../srs_db/ignition");
EcdsaSecp256r1Constraint ecdsa_r1_constraint;
WitnessVector witness_values;
size_t num_variables = generate_ecdsa_constraint(ecdsa_r1_constraint, witness_values);
Expand Down Expand Up @@ -252,6 +255,7 @@ TEST(ECDSASecp256r1, TestECDSACompilesForVerifier)

TEST(ECDSASecp256r1, TestECDSAConstraintFail)
{
bb::srs::init_crs_factory("../srs_db/ignition");
EcdsaSecp256r1Constraint ecdsa_r1_constraint;
WitnessVector witness_values;
size_t num_variables = generate_ecdsa_constraint(ecdsa_r1_constraint, witness_values);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ using namespace bb::plonk;
// Test proving key serialization/deserialization to/from buffer
TEST(proving_key, proving_key_from_serialized_key)
{
bb::srs::init_crs_factory("../srs_db/ignition");
auto builder = StandardCircuitBuilder();
auto composer = StandardComposer();
fr a = fr::one();
Expand All @@ -25,7 +26,7 @@ TEST(proving_key, proving_key_from_serialized_key)
plonk::proving_key& p_key = *composer.compute_proving_key(builder);
auto pk_buf = to_buffer(p_key);
auto pk_data = from_buffer<plonk::proving_key_data>(pk_buf);
auto crs = std::make_unique<bb::srs::factories::FileCrsFactory<curve::BN254>>("../srs_db/ignition");
auto crs = bb::srs::get_bn254_crs_factory();
auto proving_key =
std::make_shared<plonk::proving_key>(std::move(pk_data), crs->get_prover_crs(pk_data.circuit_size + 1));

Expand Down Expand Up @@ -54,6 +55,7 @@ TEST(proving_key, proving_key_from_serialized_key)
// Test proving key serialization/deserialization to/from buffer using UltraPlonkComposer
TEST(proving_key, proving_key_from_serialized_key_ultra)
{
bb::srs::init_crs_factory("../srs_db/ignition");
auto builder = UltraCircuitBuilder();
auto composer = UltraComposer();
fr a = fr::one();
Expand All @@ -62,7 +64,7 @@ TEST(proving_key, proving_key_from_serialized_key_ultra)
plonk::proving_key& p_key = *composer.compute_proving_key(builder);
auto pk_buf = to_buffer(p_key);
auto pk_data = from_buffer<plonk::proving_key_data>(pk_buf);
auto crs = std::make_unique<bb::srs::factories::FileCrsFactory<curve::BN254>>("../srs_db/ignition");
auto crs = bb::srs::get_bn254_crs_factory();
auto proving_key =
std::make_shared<plonk::proving_key>(std::move(pk_data), crs->get_prover_crs(pk_data.circuit_size + 1));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,14 @@ TEST(reference_string, mem_bn254_file_consistency)
0);
}

TEST(reference_string, mem_grumpkin_file_consistency)
TEST(reference_string, DISABLED_mem_grumpkin_file_consistency)
{
// Load 1024 from file.
auto file_crs = FileCrsFactory<Grumpkin>("../srs_db/ignition", 1024);
auto file_crs = FileCrsFactory<Grumpkin>("../srs_db/grumpkin", 1024);

// Use low level io lib to read 1024 from file.
std::vector<Grumpkin::AffineElement> points(1024);
::srs::IO<Grumpkin>::read_transcript_g1(points.data(), 1024, "../srs_db/ignition");
::srs::IO<Grumpkin>::read_transcript_g1(points.data(), 1024, "../srs_db/grumpkin");

MemGrumpkinCrsFactory mem_crs(points);
auto file_prover_crs = file_crs.get_prover_crs(1024);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,12 +266,12 @@ HEAVY_TYPED_TEST(GoblinRecursiveVerifierTest, RecursiveVerificationKey)
TestFixture::test_recursive_verification_key_creation();
}

HEAVY_TYPED_TEST(GoblinRecursiveVerifierTest, SingleRecursiveVerification)
HEAVY_TYPED_TEST(GoblinRecursiveVerifierTest, DISABLED_SingleRecursiveVerification)
{
TestFixture::test_recursive_verification();
};

HEAVY_TYPED_TEST(GoblinRecursiveVerifierTest, SingleRecursiveVerificationFailure)
HEAVY_TYPED_TEST(GoblinRecursiveVerifierTest, DISABLED_SingleRecursiveVerificationFailure)
{
TestFixture::test_recursive_verification_fails();
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,12 +248,12 @@ HEAVY_TYPED_TEST(HonkRecursiveVerifierTest, RecursiveVerificationKey)
TestFixture::test_recursive_verification_key_creation();
}

HEAVY_TYPED_TEST(HonkRecursiveVerifierTest, SingleRecursiveVerification)
HEAVY_TYPED_TEST(HonkRecursiveVerifierTest, DISABLED_SingleRecursiveVerification)
{
TestFixture::test_recursive_verification();
};

HEAVY_TYPED_TEST(HonkRecursiveVerifierTest, SingleRecursiveVerificationFailure)
HEAVY_TYPED_TEST(HonkRecursiveVerifierTest, DISABLED_SingleRecursiveVerificationFailure)
{
TestFixture::test_recursive_verification_fails();
};
Expand Down
2 changes: 1 addition & 1 deletion barretenberg/cpp/srs_db/Earthfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ build:
RUN ./download_grumpkin.sh
# export srs-db for runners
SAVE ARTIFACT ignition ignition
SAVE ARTIFACT ignition grumpkin
SAVE ARTIFACT grumpkin grumpkin

build-local:
# copy files locally
Expand Down
10 changes: 5 additions & 5 deletions barretenberg/cpp/srs_db/download_srs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,19 @@ checksum() {
download() {
# Initialize an empty variable for the Range header
RANGE_HEADER=""

# If both RANGE_START and RANGE_END are set, add them to the Range header
if [ -n "$RANGE_START" ] && [ -n "$RANGE_END" ]; then
RANGE_HEADER="-H Range:bytes=$RANGE_START-$RANGE_END"
fi

# Download the file
if [ "$APPEND" = "true" ]; then
curl $RANGE_HEADER https://aztec-ignition.s3-eu-west-2.amazonaws.com/$AWS_BUCKET/monomial/transcript${1}.dat >> transcript${1}.dat
curl -s $RANGE_HEADER https://aztec-ignition.s3-eu-west-2.amazonaws.com/$AWS_BUCKET/monomial/transcript${1}.dat >> transcript${1}.dat
else
curl $RANGE_HEADER https://aztec-ignition.s3-eu-west-2.amazonaws.com/$AWS_BUCKET/monomial/transcript${1}.dat > transcript${1}.dat
curl -s $RANGE_HEADER https://aztec-ignition.s3-eu-west-2.amazonaws.com/$AWS_BUCKET/monomial/transcript${1}.dat > transcript${1}.dat
fi

}

for TRANSCRIPT in $(seq 0 $NUM); do
Expand Down
6 changes: 3 additions & 3 deletions barretenberg/ts/Earthfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ WORKDIR /build

# minimum files to download yarn packages
# keep timestamps for incremental builds
COPY --keep-ts --dir .yarn package.json yarn.lock .yarnrc.yml .
COPY --dir .yarn package.json yarn.lock .yarnrc.yml .
RUN yarn --immutable

# other source files
COPY --keep-ts --dir src *.json *.js *.cjs .
COPY --dir src *.json *.js *.cjs .

# copy over wasm build from cpp folder
COPY ../cpp/+preset-wasm/bin/barretenberg.wasm src/barretenberg_wasm/barretenberg-threads.wasm
Expand All @@ -23,7 +23,7 @@ esm:
SAVE ARTIFACT /build

cjs:
COPY --keep-ts scripts/cjs_postprocess.sh scripts/
COPY scripts/cjs_postprocess.sh scripts/
RUN yarn build:cjs
SAVE ARTIFACT /build

Expand Down
2 changes: 1 addition & 1 deletion l1-contracts/Earthfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ RUN foundryup
RUN npm install --global yarn solhint

WORKDIR /build
COPY --keep-ts --dir lib scripts src terraform test *.json *.toml *.sh .
COPY --dir lib scripts src terraform test *.json *.toml *.sh .

build:
RUN git init && git add . && yarn lint && yarn slither && yarn slither-has-diff
Expand Down
6 changes: 3 additions & 3 deletions noir-projects/bootstrap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ g="\033[32m" # Green
b="\033[34m" # Blue
r="\033[0m" # Reset

((cd "./noir-contracts" && ./bootstrap.sh) > >(awk -v g="$g" -v r="$r" '$0=g"contracts: "r $0')) &
((cd "./noir-protocol-circuits" && ./bootstrap.sh) > >(awk -v b="$b" -v r="$r" '$0=b"protocol-circuits: "r $0')) &
((cd "./noir-contracts" && ./bootstrap.sh) > >(awk -v g="$g" -v r="$r" '{print g "contracts: " r $0}')) &
((cd "./noir-protocol-circuits" && ./bootstrap.sh) > >(awk -v b="$b" -v r="$r" '{print b "protocol-circuits: " r $0}')) &

for job in $(jobs -p); do
wait $job || exit 1
done
done
Loading

0 comments on commit eca12b3

Please sign in to comment.