Skip to content
Merged
Show file tree
Hide file tree
Changes from 52 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
e4c2841
Added Westend solochain workflow to CI and justfile
x3c41a Dec 18, 2025
f0d5e76
added newline
x3c41a Dec 18, 2025
3b2980f
removed dyld references
x3c41a Dec 18, 2025
3c1b9db
added retries to fetchCID fun
x3c41a Dec 18, 2025
4203d1e
updated default in just
x3c41a Dec 18, 2025
e49b719
fixed Mac OS libclang error by adding symlink
x3c41a Dec 18, 2025
acf37a6
now chainspec is being read from zombienet folder, parametrized scrip…
x3c41a Dec 19, 2025
4f8ba15
added safeguards
x3c41a Dec 19, 2025
54a69de
Merge branch 'main' into fix_westend
x3c41a Jan 5, 2026
70c09bb
tmp fix with fallback
x3c41a Jan 5, 2026
4d74596
Fix CI: handle missing polkadot-sdk branch and zombienet directory cl…
x3c41a Jan 5, 2026
e139c60
Use latest master as fallback instead of pinned commit
x3c41a Jan 6, 2026
f90da7b
always use master
x3c41a Jan 6, 2026
a988338
reverterd api.js
x3c41a Jan 6, 2026
8d5e2c3
reverted again
x3c41a Jan 6, 2026
5080e7e
export DYLD_FALLBACK_LIBRARY_PATH
x3c41a Jan 6, 2026
d7a1ae0
extracted setup into a separate script
x3c41a Jan 6, 2026
a575b98
store PID in /tmp
x3c41a Jan 6, 2026
a0506ee
unified process turndown
x3c41a Jan 6, 2026
d186f3d
use inner/outer scope
x3c41a Jan 6, 2026
31046a6
do not use top level dir /tmp
x3c41a Jan 6, 2026
0a72d35
merged fns
x3c41a Jan 6, 2026
7da6f9c
experiment with justfile()
x3c41a Jan 6, 2026
4ba2603
fixed disconnet
x3c41a Jan 6, 2026
0becfde
Fix zombienet prompts
x3c41a Jan 7, 2026
b54691f
Apply suggestions from code review
bkontur Jan 8, 2026
7d6c9b0
Rename setup_westend_prerequisites.sh to setup_parachain_prerequisite…
bkontur Jan 8, 2026
1b0405d
Update examples/justfile
bkontur Jan 8, 2026
b399719
Merge remote-tracking branch 'origin/main' into fix_westend
bkontur Jan 8, 2026
05c5adf
Use polkadot-sdk cache and fixed commit
bkontur Jan 8, 2026
186ded0
Nit
bkontur Jan 8, 2026
eb6f8ea
reverted TEST_DIR
x3c41a Jan 8, 2026
ec22065
Use polkadot-omni-node (build much faster than polkadot-parachain)
bkontur Jan 8, 2026
ce9be36
Download and cache binaries
bkontur Jan 8, 2026
0ea21a9
Attemp to build omni-node once and cache
bkontur Jan 8, 2026
24d79dd
Nit
bkontur Jan 8, 2026
2cdfddb
Download binaries as separate step
bkontur Jan 8, 2026
a92b8bd
Refactor kill-pids
bkontur Jan 8, 2026
4162488
Separate bulletin-westend-parachain-zombienet-start for setup-services
bkontur Jan 8, 2026
e074f10
Change order
bkontur Jan 8, 2026
0472ee1
check command instead of `-f` just file
bkontur Jan 9, 2026
8ad4fe3
conditionaly skip setup_parachain_prerequisites.sh
bkontur Jan 9, 2026
9b8e652
nit
bkontur Jan 9, 2026
3f2a6c4
One more fix for local setup
bkontur Jan 9, 2026
c3b6cdc
Add zombienet also to the cache
bkontur Jan 9, 2026
e0aca4f
let's check command instead of `-f`
bkontur Jan 9, 2026
b0ba1cc
temporary hit the cache to speed up another runs
bkontur Jan 9, 2026
fa74eac
Revert back `save-if`
bkontur Jan 9, 2026
44f92a3
Just file nits
bkontur Jan 10, 2026
c0e80f3
Hmm?
bkontur Jan 10, 2026
9a71e88
make runtime required
bkontur Jan 10, 2026
0e88660
Add all
bkontur Jan 10, 2026
1a379b9
Wrong cfg for smoldot?
bkontur Jan 10, 2026
6284000
skip smoldot
bkontur Jan 10, 2026
1482927
Maybe some cleanup problem?
bkontur Jan 10, 2026
289f145
correctly `set +e` before node scripts to handle EXAMPLE_EXIT
bkontur Jan 10, 2026
7e201d3
Revert back
bkontur Jan 10, 2026
3ebc44e
Adjust timeouts
bkontur Jan 10, 2026
203c7b5
nit
bkontur Jan 10, 2026
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
152 changes: 130 additions & 22 deletions .github/workflows/integration-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,89 @@ concurrency:

env:
NODE_VERSION: 22
POLKADOT_SDK_VERSION: polkadot-stable2512
POLKADOT_SDK_BIN_DIR: ${{ github.workspace }}/.polkadot-sdk-bin
ZOMBIENET_VERSION: v1.3.138
ZOMBIENET_BIN_DIR: ${{ github.workspace }}/.zombienet-bin

jobs:
integration-tests:
name: Integration Tests
setup:
name: Setup
runs-on: ubuntu-latest
timeout-minutes: 60

steps:
- name: Free Disk Space (Ubuntu)
if: ${{ runner.environment == 'github-hosted' }}
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1
with:
tool-cache: false

# TODO: remove when released: https://github.com/paritytech/polkadot-sdk/pull/10662
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
components: rust-src
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y protobuf-compiler libclang-dev

# Cache the Polkadot SDK binaries
- name: Cache Polkadot SDK binaries
uses: actions/cache@v3
id: polkadot-sdk-cache
with:
path: ${{ env.POLKADOT_SDK_BIN_DIR }}
key: polkadot-sdk-${{ env.POLKADOT_SDK_VERSION }}-binaries
# Download and extract binaries if cache missed
- name: Download Polkadot SDK binaries
if: steps.polkadot-sdk-cache.outputs.cache-hit != 'true'
run: |
mkdir -p $POLKADOT_SDK_BIN_DIR
cd $POLKADOT_SDK_BIN_DIR
echo "Downloading Polkadot SDK binaries..."
curl -L -o polkadot https://github.com/paritytech/polkadot-sdk/releases/download/${POLKADOT_SDK_VERSION}/polkadot
curl -L -o polkadot-prepare-worker https://github.com/paritytech/polkadot-sdk/releases/download/${POLKADOT_SDK_VERSION}/polkadot-prepare-worker
curl -L -o polkadot-execute-worker https://github.com/paritytech/polkadot-sdk/releases/download/${POLKADOT_SDK_VERSION}/polkadot-execute-worker
curl -L -o chain-spec-builder https://github.com/paritytech/polkadot-sdk/releases/download/${POLKADOT_SDK_VERSION}/chain-spec-builder
# TODO: remove when released: https://github.com/paritytech/polkadot-sdk/pull/10662
# curl -L -o polkadot-omni-node https://github.com/paritytech/polkadot-sdk/releases/download/${POLKADOT_SDK_VERSION}/polkadot-omni-node
chmod +x *
# TODO: remove when released: https://github.com/paritytech/polkadot-sdk/pull/10662
git clone https://github.com/paritytech/polkadot-sdk.git
cd polkadot-sdk
git reset --hard b2bcb74b13f1a1e082f701e3e05ce1be44d16790
cargo build -p polkadot-omni-node -r
cd ..
cp polkadot-sdk/target/release/polkadot-omni-node .
rm -R polkadot-sdk

# Cache the Zombienet binaries
- name: Cache Zombienet
uses: actions/cache@v3
id: zombienet-cache
with:
path: ${{ env.ZOMBIENET_BIN_DIR }}
key: zombienet-${{ env.ZOMBIENET_VERSION }}-binaries
# Download and extract binaries if cache missed
- name: Download Zombienet binaries
if: steps.zombienet-cache.outputs.cache-hit != 'true'
run: |
mkdir -p $ZOMBIENET_BIN_DIR
cd $ZOMBIENET_BIN_DIR
curl -L \
-H "Authorization: token ${{ github.token }}" \
-o zombienet-linux-x64 \
"https://github.com/paritytech/zombienet/releases/download/${ZOMBIENET_VERSION}/zombienet-linux-x64"
chmod +x zombienet-linux-x64

integration-tests:
needs: [setup]
name: Integration Tests
runs-on: ubuntu-latest
timeout-minutes: 200

steps:
- name: Checkout sources
uses: actions/checkout@v4

Expand Down Expand Up @@ -63,35 +132,74 @@ jobs:
- name: Install just
run: cargo install just --locked || true

- name: Download zombienet
- name: Cache Polkadot SDK binaries
uses: actions/cache@v3
id: polkadot-sdk-cache
with:
path: ${{ env.POLKADOT_SDK_BIN_DIR }}
key: polkadot-sdk-${{ env.POLKADOT_SDK_VERSION }}-binaries
- name: Cache Zombienet
uses: actions/cache@v3
id: zombienet-cache
with:
path: ${{ env.ZOMBIENET_BIN_DIR }}
key: zombienet-${{ env.ZOMBIENET_VERSION }}-binaries
- name: Add binaries to PATH
run: |
curl -L \
-H "Authorization: token ${{ github.token }}" \
-o zombienet-linux-x64 \
"https://github.com/paritytech/zombienet/releases/download/v1.3.138/zombienet-linux-x64"
chmod +x zombienet-linux-x64
echo "ZOMBIENET_BINARY=$GITHUB_WORKSPACE/zombienet-linux-x64" >> $GITHUB_ENV

- name: Run authorize and store (PAPI, RPC node)
ls -lrt "${POLKADOT_SDK_BIN_DIR}"
ls -lrt "${ZOMBIENET_BIN_DIR}"
echo "${POLKADOT_SDK_BIN_DIR}" >> "$GITHUB_PATH"
echo "SKIP_PARACHAIN_SETUP=1" >> "$GITHUB_ENV"
echo "${ZOMBIENET_BIN_DIR}" >> "$GITHUB_PATH"
echo "ZOMBIENET_BINARY=zombienet-linux-x64" >> "$GITHUB_ENV"

# Westend parachain
- name: Run authorize and store (PAPI, RPC node, Westend parachain)
working-directory: examples
run: |
export TEST_DIR="$(mktemp -d $GITHUB_WORKSPACE/bulletin-tests-run-XXXXX)/test"
echo "TEST_DIR=$TEST_DIR" >> $GITHUB_ENV
just run-authorize-and-store "ws"

- name: Run authorize and store (PAPI, smoldot)
echo "TEST_DIR=$TEST_DIR" >> "$GITHUB_ENV"
mkdir -p "$TEST_DIR"
just run-authorize-and-store "bulletin-westend-runtime" "ws"
- name: Run authorize and store (PAPI, smoldot, Westend parachain)
working-directory: examples
run: |
export TEST_DIR="$(mktemp -d $GITHUB_WORKSPACE/bulletin-tests-run-XXXXX)/test"
echo "TEST_DIR=$TEST_DIR" >> "$GITHUB_ENV"
mkdir -p "$TEST_DIR"
just run-authorize-and-store "bulletin-westend-runtime" "smoldot"
- name: Run store chunked data + DAG-PB (PJS-API, RPC node, Westend parachain)
working-directory: examples
run: |
export TEST_DIR="$(mktemp -d $GITHUB_WORKSPACE/bulletin-tests-run-XXXXX)/test"
echo "TEST_DIR=$TEST_DIR" >> $GITHUB_ENV
just run-authorize-and-store "smoldot"
echo "TEST_DIR=$TEST_DIR" >> "$GITHUB_ENV"
mkdir -p "$TEST_DIR"
just run-store-chunked-data "bulletin-westend-runtime"

# TODO: Polkadot parachain

- name: Run store chunked data + DAG-PB (PJS-API, RPC node)
# Polkadot solochain
- name: Run authorize and store (PAPI, RPC node, Polkadot solochain)
working-directory: examples
run: |
export TEST_DIR="$(mktemp -d $GITHUB_WORKSPACE/bulletin-tests-run-XXXXX)/test"
echo "TEST_DIR=$TEST_DIR" >> "$GITHUB_ENV"
mkdir -p "$TEST_DIR"
just run-authorize-and-store "bulletin-polkadot-runtime" "ws"
- name: Run authorize and store (PAPI, smoldot, Polkadot solochain)
working-directory: examples
run: |
export TEST_DIR="$(mktemp -d $GITHUB_WORKSPACE/bulletin-tests-run-XXXXX)/test"
echo "TEST_DIR=$TEST_DIR" >> "$GITHUB_ENV"
mkdir -p "$TEST_DIR"
just run-authorize-and-store "bulletin-polkadot-runtime" "smoldot"
- name: Run store chunked data + DAG-PB (PJS-API, RPC node, Polkadot solochain)
working-directory: examples
run: |
export TEST_DIR="$(mktemp -d $GITHUB_WORKSPACE/bulletin-tests-run-XXXXX)/test"
echo "TEST_DIR=$TEST_DIR" >> $GITHUB_ENV
just run-store-chunked-data
echo "TEST_DIR=$TEST_DIR" >> "$GITHUB_ENV"
mkdir -p "$TEST_DIR"
just run-store-chunked-data "bulletin-polkadot-runtime"

# Collects logs from the last failed zombienet run.
- name: Upload Zombienet logs (on failure)
Expand Down
32 changes: 16 additions & 16 deletions examples/authorize_and_store_papi_smoldot.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import assert from "assert";
import * as smoldot from 'smoldot';
import { ApiPromise, WsProvider } from "@polkadot/api";
import { readFileSync } from 'fs';
import { createClient } from 'polkadot-api';
import { getSmProvider } from 'polkadot-api/sm-provider';
import { cryptoWaitReady } from '@polkadot/util-crypto';
Expand All @@ -10,22 +10,14 @@ import { cidFromBytes } from "./cid_dag_metadata.js";
import { bulletin } from './.papi/descriptors/dist/index.mjs';

// Constants
const BOB_NODE_WS = 'ws://localhost:12346';
const SYNC_WAIT_SEC = 15;
const SMOLDOT_LOG_LEVEL = 3; // 0=off, 1=error, 2=warn, 3=info, 4=debug, 5=trace
const HTTP_IPFS_API = 'http://127.0.0.1:8080' // Local IPFS HTTP gateway

async function fetchChainSpec(nodeWs) {
console.log('Fetching chainspec from node...');
const provider = new WsProvider(nodeWs);
const api = await ApiPromise.create({ provider });
await api.isReady;

const chainSpec = (await api.rpc.syncstate.genSyncSpec(true)).toString();
const chainSpecObj = JSON.parse(chainSpec);
chainSpecObj.protocolId = null; // Allow smoldot to sync with local chain

await api.disconnect();
function readChainSpec(chainspecPath) {
const chainSpecContent = readFileSync(chainspecPath, 'utf8');
const chainSpecObj = JSON.parse(chainSpecContent);
chainSpecObj.protocolId = null;
return JSON.stringify(chainSpecObj);
}

Expand All @@ -41,8 +33,8 @@ function initSmoldot() {
return sd;
}

async function createSmoldotClient() {
const chainSpec = await fetchChainSpec(BOB_NODE_WS);
async function createSmoldotClient(chainspecPath) {
const chainSpec = readChainSpec(chainspecPath);
const sd = initSmoldot();
const chain = await sd.addChain({ chainSpec });
const client = createClient(getSmProvider(chain));
Expand All @@ -53,10 +45,18 @@ async function createSmoldotClient() {
async function main() {
await cryptoWaitReady();

// Get chainspec path from command line argument
const chainspecPath = process.argv[2];
if (!chainspecPath) {
console.error('❌ Error: Chainspec path is required as first argument');
console.error('Usage: node authorize_and_store_papi_smoldot.js <chainspec-path>');
process.exit(1);
}

let sd, client, resultCode;
try {
// Init Smoldot PAPI client and typed api.
({ client, sd } = await createSmoldotClient());
({ client, sd } = await createSmoldotClient(chainspecPath));
console.log(`⏭️ Waiting ${SYNC_WAIT_SEC} seconds for smoldot to sync...`);
// TODO: check better way, when smoldot is synced, maybe some RPC/runtime api that checks best vs finalized block?
await new Promise(resolve => setTimeout(resolve, SYNC_WAIT_SEC * 1000));
Expand Down
Loading
Loading