diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 96721feb1a0..7ce5008c6f8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -195,6 +195,25 @@ jobs: ./scripts/build-alphanet-relay-image.sh docker push $DOCKER_TAG fi + - name: Check & prepare para-test docker image + run: | + POLKADOT_REPO=${{ needs.set-tags.outputs.polkadot_repo }} + POLKADOT_COMMIT=${{ needs.set-tags.outputs.polkadot_commit }} + DOCKER_TAG="purestake/polkadot-para-tests:sha-$POLKADOT_COMMIT" + POLKADOT_EXISTS=$(docker manifest inspect $DOCKER_TAG > /dev/null && \ + echo "true" || echo "false") + if [[ "$POLKADOT_EXISTS" == "false" ]]; then + mkdir -p build + MOONBEAM_DOCKER_TAG="purestake/moonbase-relay-testnet:sha-$POLKADOT_COMMIT" + docker create --pull always -ti --name dummy $MOONBEAM_DOCKER_TAG bash + docker cp dummy:/usr/local/bin/polkadot build/polkadot + docker rm -f dummy + docker build . --pull --no-cache -f docker/polkadot-para-tests.Dockerfile \ + --network=host \ + --build-arg HOST_UID="$UID" \ + -t $DOCKER_TAG + docker push $DOCKER_TAG + fi ####### Building and Testing binaries ####### @@ -219,8 +238,6 @@ jobs: RUSTFLAGS: "-C opt-level=3 -D warnings" # MOONBEAM_LOG: info # DEBUG: "test*" - outputs: - RUSTC: ${{ steps.get-rust-versions.outputs.rustc }} steps: - name: Checkout uses: actions/checkout@v2 @@ -251,9 +268,6 @@ jobs: fi $SCCACHE_BIN -s echo "RUSTC_WRAPPER=$SCCACHE_BIN" >> $GITHUB_ENV - - id: get-rust-versions - run: | - echo "::set-output name=rustc::$(rustc --version)" - name: Build Node run: | env @@ -312,7 +326,7 @@ jobs: typescript-tests: runs-on: self-hosted - needs: ["set-tags", "build"] + needs: ["set-tags", "build", "prepare-polkadot"] steps: - name: Checkout uses: actions/checkout@v2 @@ -327,16 +341,33 @@ jobs: with: node-version: 14.x - name: Typescript integration tests (against dev service) - env: - BINARY_PATH: ../build/moonbeam run: | chmod uog+x build/moonbeam + + #### Preparing the repository cd moonbeam-types-bundle npm install npm run build cd ../tests npm install - node_modules/.bin/mocha --parallel -j 4 -r ts-node/register 'tests/**/test-*.ts' + cd .. + + #### Retrieving docker image as base to run tests + POLKADOT_REPO=${{ needs.set-tags.outputs.polkadot_repo }} + POLKADOT_COMMIT=${{ needs.set-tags.outputs.polkadot_commit }} + DOCKER_TAG="purestake/polkadot-para-tests:sha-$POLKADOT_COMMIT" + + docker run \ + -e BINARY_PATH='../build/moonbeam' \ + -v $(pwd):/moonbeam:z \ + -u $UID \ + -w /moonbeam/tests \ + $DOCKER_TAG \ + node node_modules/.bin/mocha \ + --parallel -j 4 \ + --exit \ + -r ts-node/register \ + 'tests/**/test-*.ts' # We determine whether there are unmodified package-lock.json files by: # 1. Asking git for a list of all modified files @@ -398,7 +429,7 @@ jobs: npm run build cd ../tests npm install - node_modules/.bin/mocha --parallel -j 2 -r ts-node/register 'tracing-tests/**/test-*.ts' + node_modules/.bin/mocha --exit --parallel -j 2 -r ts-node/register 'tracing-tests/**/test-*.ts' typescript-para-tests: runs-on: self-hosted @@ -437,11 +468,51 @@ jobs: run: | chmod uog+x build/polkadot chmod uog+x build/moonbeam + + #### Preparing the repository cd moonbeam-types-bundle npm install cd ../tests npm install - node_modules/.bin/mocha -r ts-node/register 'para-tests/**/test-*.ts' + cd .. + + POLKADOT_REPO=${{ needs.set-tags.outputs.polkadot_repo }} + POLKADOT_COMMIT=${{ needs.set-tags.outputs.polkadot_commit }} + DOCKER_TAG="purestake/polkadot-para-tests:sha-$POLKADOT_COMMIT" + + #### Retrieve binary to avoid para-node script to rely on docker + mkdir -p build + localVersion=$(grep 'spec_version: [0-9]*' runtime/moonbase/src/lib.rs | grep -o '[0-9]*') + baseRuntime=$(git tag -l -n 'runtime-[0-9]*' | \ + cut -d' ' -f 1 | cut -d'-' -f 2 | \ + sed "1 i ${localVersion}" | \ + sort -n -r | \ + uniq | \ + grep -A1 "${localVersion}" | \ + tail -1) + rev=$(git rev-list -1 runtime-$baseRuntime) + sha8=${rev:0:8} + dockerImage=purestake/moonbeam:sha-${sha8} + binaryPath=build/moonbeam-${sha8} + docker create --pull always --name moonbeam-tmp ${dockerImage} && \ + docker cp moonbeam-tmp:/moonbeam/moonbeam ${binaryPath} && \ + docker rm moonbeam-tmp + + echo "Running para-tests inside docker: $DOCKER_TAG" + docker run \ + -e OVERRIDE_RUNTIME_PATH='./runtimes' \ + -e BINARY_PATH='../build/moonbeam' \ + -e MOONBEAM_LOG='info' \ + -e RELAY_BINARY_PATH='/binaries/polkadot' \ + -e RUNTIME_DIRECTORY='/tmp/runtimes' \ + -e BINARY_DIRECTORY='../build/' \ + -e SPECS_DIRECTORY='/tmp/specs' \ + -v $(pwd):/moonbeam:z \ + -v $(pwd)/${binaryPath}:/binaries/moonbeam:z \ + -u $UID \ + -w /moonbeam/tests \ + $DOCKER_TAG \ + node node_modules/.bin/mocha --exit -r ts-node/register 'para-tests/**/test-*.ts' docker-parachain: runs-on: ubuntu-latest diff --git a/docker/polkadot-para-tests.Dockerfile b/docker/polkadot-para-tests.Dockerfile new file mode 100644 index 00000000000..92857639fdd --- /dev/null +++ b/docker/polkadot-para-tests.Dockerfile @@ -0,0 +1,26 @@ +# Node for Moonbase Parachains. +# +# Requires to run from repository root and to copy the binary in the build folder (part of the release workflow) + +FROM node +LABEL maintainer "alan@purestake.com" +LABEL description="Node image use to run Moonbeam para-tests" + +ARG HOST_UID=1001 + +RUN ((getent passwd $HOST_UID > /dev/null) || \ + useradd -m -u $HOST_UID -U -s /bin/sh -d /polkadot polkadot) && \ + mkdir -p /polkadot/.local/share/polkadot && \ + chown -R $HOST_UID /polkadot && \ + ln -s /polkadot/.local/share/polkadot /data + +RUN mkdir -p /binaries +COPY build/polkadot /binaries/ +RUN chmod -R uog+rwX /binaries + +USER $HOST_UID + +WORKDIR /polkadot + +ENTRYPOINT ["docker-entrypoint.sh"] +CMD [ "node" ] \ No newline at end of file diff --git a/scripts/build-alphanet-relay-image.sh b/scripts/build-alphanet-relay-image.sh index 6dbe074207a..5f0c68164a2 100755 --- a/scripts/build-alphanet-relay-image.sh +++ b/scripts/build-alphanet-relay-image.sh @@ -13,7 +13,7 @@ fi echo "Using Polkadot from $POLKADOT_REPO revision #${POLKADOT_COMMIT}" -docker build . -f docker/polkadot-relay.Dockerfile --network=host \ +docker build . --pull --no-cache -f docker/polkadot-relay.Dockerfile --network=host \ --build-arg POLKADOT_COMMIT="$POLKADOT_COMMIT" \ --build-arg POLKADOT_REPO="$POLKADOT_REPO" \ -t purestake/moonbase-relay-testnet:sha-$POLKADOT_COMMIT diff --git a/tests/util/para-node.ts b/tests/util/para-node.ts index 2755b44c469..0624f599302 100644 --- a/tests/util/para-node.ts +++ b/tests/util/para-node.ts @@ -94,9 +94,9 @@ export interface NodePorts { wsPort: number; } -const RUNTIME_DIRECTORY = "runtimes"; -const BINARY_DIRECTORY = "binaries"; -const SPECS_DIRECTORY = "specs"; +const RUNTIME_DIRECTORY = process.env.RUNTIME_DIRECTORY || "runtimes"; +const BINARY_DIRECTORY = process.env.BINARY_DIRECTORY || "binaries"; +const SPECS_DIRECTORY = process.env.SPECS_DIRECTORY || "specs"; // Downloads the runtime and return the filepath export async function getRuntimeWasm( @@ -105,6 +105,10 @@ export async function getRuntimeWasm( ): Promise { const runtimePath = path.join(RUNTIME_DIRECTORY, `${runtimeName}-${runtimeTag}.wasm`); + if (!fs.existsSync(RUNTIME_DIRECTORY)) { + fs.mkdirSync(RUNTIME_DIRECTORY, { recursive: true }); + } + if (runtimeTag == "local") { const builtRuntimePath = path.join( OVERRIDE_RUNTIME_PATH || `../target/release/wbuild/${runtimeName}-runtime/`, @@ -176,7 +180,7 @@ export async function getMoonbeamDockerBinary(binaryTag: string): Promise ${specPath}` + `${binaryPath} build-spec --chain moonbase-local ` + + `--raw --disable-default-bootnode > ${specPath}` ); } return specPath; @@ -208,7 +213,8 @@ export async function generateRawSpecs( if (!fs.existsSync(specPath)) { child_process.execSync( `mkdir -p ${path.dirname(specPath)} && ` + - `${binaryPath} build-spec --chain moonbase-local --raw > ${specPath}` + `${binaryPath} build-spec --chain moonbase-local ` + + `--raw --disable-default-bootnode > ${specPath}` ); } return specPath; diff --git a/tests/util/providers.ts b/tests/util/providers.ts index cb6235910d5..a8a1ffa10e1 100644 --- a/tests/util/providers.ts +++ b/tests/util/providers.ts @@ -20,9 +20,12 @@ export async function customWeb3Request(web3: Web3, method: string, params: any[ (error: Error | null, result?: JsonRpcResponse) => { if (error) { reject( - `Failed to send custom request (${method} (${params.join(",")})): ${ - error.message || error.toString() - }` + `Failed to send custom request (${method} (${params + .map((p) => { + const str = p.toString(); + return str.length > 128 ? `${str.slice(0, 96)}...${str.slice(-28)}` : str; + }) + .join(",")})): ${error.message || error.toString()}` ); } resolve(result);