From a0b6705c2aba1f11e887142e9e73c0bc8caa8f49 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Sun, 3 Sep 2023 19:03:41 +0200 Subject: [PATCH] ci: move nodeonly to baedeker --- .baedeker/node-only.jsonnet | 43 +++ .docker/Dockerfile-parachain-node-only.j2 | 67 ---- .docker/Dockerfile-unique-release | 49 +++ .docker/docker-compose.node-only.j2 | 16 - .github/actions/buildContainer/action.yml | 59 ++++ .github/workflows/node-only-update.yml | 356 ++++++---------------- .github/workflows/xcm.yml | 2 +- tests/scripts/wait_for_first_block.sh | 30 +- tests/src/util/globalSetup.ts | 6 +- tests/src/xcm/xcmQuartz.test.ts | 20 +- 10 files changed, 279 insertions(+), 369 deletions(-) create mode 100644 .baedeker/node-only.jsonnet delete mode 100644 .docker/Dockerfile-parachain-node-only.j2 create mode 100644 .docker/Dockerfile-unique-release delete mode 100644 .docker/docker-compose.node-only.j2 create mode 100644 .github/actions/buildContainer/action.yml diff --git a/.baedeker/node-only.jsonnet b/.baedeker/node-only.jsonnet new file mode 100644 index 0000000000..797ce99827 --- /dev/null +++ b/.baedeker/node-only.jsonnet @@ -0,0 +1,43 @@ +local +m = import 'baedeker-library/mixin/spec.libsonnet', +; + +local relay = { + name: 'relay', + bin: 'bin/polkadot', + validatorIdAssignment: 'staking', + spec: {Genesis:{ + chain: 'rococo-local', + modify:: m.genericRelay($), + }}, + nodes: { + [name]: { + bin: $.bin, + wantedKeys: 'relay', + }, + for name in ['alice', 'bob', 'charlie', 'dave', 'eve'] + }, +}; + +local unique = { + name: 'unique', + bin: 'bin/unique', + paraId: 1001, + spec: {Genesis:{ + modify:: m.genericPara($), + }}, + nodes: { + [name]: { + bin: $.bin, + wantedKeys: 'para', + }, + for name in ['alice', 'bob'] + }, +}; + +relay + { + parachains: { + [para.name]: para, + for para in [unique] + }, +} diff --git a/.docker/Dockerfile-parachain-node-only.j2 b/.docker/Dockerfile-parachain-node-only.j2 deleted file mode 100644 index 6c002eaaee..0000000000 --- a/.docker/Dockerfile-parachain-node-only.j2 +++ /dev/null @@ -1,67 +0,0 @@ -# ===== Rust builder ===== -FROM uniquenetwork/services:latest as rust-builder -ENV CARGO_HOME="/cargo-home" -ENV PATH="/cargo-home/bin:$PATH" -ENV TZ=UTC - -RUN rustup toolchain uninstall $(rustup toolchain list) && \ - rustup toolchain install {{ RUST_TOOLCHAIN }} && \ - rustup default {{ RUST_TOOLCHAIN }} && \ - rustup target list --installed && \ - rustup show -RUN rustup target add wasm32-unknown-unknown --toolchain {{ RUST_TOOLCHAIN }} - -RUN mkdir /unique_parachain -WORKDIR /unique_parachain - - -# ===== BUILD current version ====== -FROM rust-builder as builder-unique-current - -ARG PROFILE=release - -WORKDIR /unique_parachain - -RUN git clone -b {{ MAINNET_BRANCH }} https://github.com/UniqueNetwork/unique-chain.git . && \ - cargo build --features={{ NETWORK }}-runtime --$PROFILE - -# ===== BUILD target version ====== -FROM rust-builder as builder-unique-target - -ARG PROFILE=release - -COPY . /unique_parachain -WORKDIR /unique_parachain - -RUN cargo build --features={{ NETWORK }}-runtime --$PROFILE - -# ===== RUN ====== - -FROM ubuntu:22.04 - -RUN apt-get -y update && \ - apt-get -y install curl git && \ - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash && \ - export NVM_DIR="$HOME/.nvm" && \ - [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \ - nvm install v16.16.0 && \ - nvm use v16.16.0 - -RUN git clone https://github.com/uniquenetwork/polkadot-launch -b {{ POLKADOT_LAUNCH_BRANCH }} - -COPY --from=builder-unique-current /unique_parachain/target/release/unique-collator /unique-chain/current/release/ - -COPY --from=builder-unique-target /unique_parachain/target/release/unique-collator /unique-chain/target/release/ -COPY --from=builder-unique-target /unique_parachain/target/release/wbuild/{{ WASM_NAME }}-runtime/{{ WASM_NAME }}_runtime.compact.compressed.wasm /unique-chain/target/release/wbuild/{{ WASM_NAME }}-runtime/{{ WASM_NAME }}_runtime.compact.compressed.wasm -COPY --from=builder-unique-target /unique_parachain/.docker/forkless-config/launch-config-node-only.json /polkadot-launch/launch-config.json - -COPY --from=uniquenetwork/builder-polkadot:{{ POLKADOT_BUILD_BRANCH }} /unique_parachain/polkadot/target/release/polkadot /polkadot/target/release/ -COPY --from=uniquenetwork/builder-polkadot:{{ POLKADOT_BUILD_BRANCH }} /unique_parachain/polkadot/target/release/wbuild/westend-runtime/westend_runtime.compact.compressed.wasm /polkadot/target/release/wbuild/westend-runtime/westend_runtime.compact.compressed.wasm -COPY --from=uniquenetwork/builder-polkadot:{{ POLKADOT_BUILD_BRANCH }} /unique_parachain/polkadot/target/release/wbuild/rococo-runtime/rococo_runtime.compact.compressed.wasm /polkadot/target/release/wbuild/rococo-runtime/rococo_runtime.compact.compressed.wasm - -CMD export NVM_DIR="$HOME/.nvm" && \ - [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \ - cd /polkadot-launch && \ - npm install --global yarn && \ - yarn install && \ - yarn start launch-config.json --test-upgrade-parachains -w -n diff --git a/.docker/Dockerfile-unique-release b/.docker/Dockerfile-unique-release new file mode 100644 index 0000000000..ab378b11c9 --- /dev/null +++ b/.docker/Dockerfile-unique-release @@ -0,0 +1,49 @@ +# ===== Rust builder ===== +FROM ubuntu:22.04 as rust-builder +LABEL maintainer="Unique.Network" + +ENV CARGO_HOME="/cargo-home" +ENV PATH="/cargo-home/bin:$PATH" +ENV TZ=UTC +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN apt-get update && \ + apt-get install -y curl cmake pkg-config libssl-dev git clang llvm libudev-dev protobuf-compiler && \ + apt-get clean && \ + rm -r /var/lib/apt/lists/* + +RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain none + +ARG RUST_TOOLCHAIN +RUN echo "Using Rust '$RUST_TOOLCHAIN'" && \ + rustup toolchain install $RUST_TOOLCHAIN && \ + rustup target add wasm32-unknown-unknown --toolchain ${RUST_TOOLCHAIN} && \ + rustup default $RUST_TOOLCHAIN && \ + rustup target list --installed && \ + rustup show + +RUN mkdir /unique_parachain +WORKDIR /unique_parachain + +# ===== BUILD POLKADOT ===== +FROM rust-builder as builder-polkadot-bin + +WORKDIR /unique_parachain + +ARG UNIQUE_VERSION +RUN git clone -b "$UNIQUE_VERSION" --depth 1 https://github.com/uniquenetwork/unique-chain.git + +ARG RUNTIME_FEATURES +RUN --mount=type=cache,target=/cargo-home/registry \ + --mount=type=cache,target=/cargo-home/git \ + --mount=type=cache,target=/unique_parachain/polkadot/target \ + cd unique-chain && \ + CARGO_INCREMENTAL=0 cargo build --release --features="$RUNTIME_FEATURES" --locked && \ + mv ./target/release/unique-collator /unique_parachain/unique-chain/ + +# ===== BIN ====== + +FROM ubuntu:22.04 as builder-polkadot + +COPY --from=builder-polkadot-bin /unique_parachain/unique-chain/unique-collator /bin/unique-collator +ENTRYPOINT ["/bin/unique-collator"] diff --git a/.docker/docker-compose.node-only.j2 b/.docker/docker-compose.node-only.j2 deleted file mode 100644 index 2887f7ea79..0000000000 --- a/.docker/docker-compose.node-only.j2 +++ /dev/null @@ -1,16 +0,0 @@ -version: "3.5" - -services: - node-only: - image: uniquenetwork/ci-node-only-local:{{ NETWORK }}-{{ BUILD_TAG }} - container_name: node-only - expose: - - 9944 - - 9945 - - 9933 - - 9844 - ports: - - 127.0.0.1:9944:9944 - - 127.0.0.1:9945:9945 - - 127.0.0.1:9933:9933 - - 127.0.0.1:9844:9844 diff --git a/.github/actions/buildContainer/action.yml b/.github/actions/buildContainer/action.yml new file mode 100644 index 0000000000..f6f56a4b81 --- /dev/null +++ b/.github/actions/buildContainer/action.yml @@ -0,0 +1,59 @@ +name: Build or pull container +description: '' +inputs: + container: + description: Which name to fetch/push + required: true + tag: + description: Which tag to fetch/push + required: true + context: + description: Container context + required: true + default: "." + dockerfile: + description: Path to dockerfile (relative to context) + required: true + args: + description: Docker build extra args + default: '' + dockerhub_username: + description: Secret + dockerhub_token: + description: Secret +outputs: + name: + description: Full container name + value: ${{ steps.ensure.outputs.name }} +runs: + using: "composite" + steps: + - name: Ensure have ${{ inputs.container }}:${{ inputs.tag }} + id: ensure + run: | + echo "Wanted container: ${{ inputs.container }}:${{ inputs.tag }}" + + TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${{ inputs.dockerhub_username }}'", "password": "'${{ inputs.dockerhub_token }}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token) + + # Get TAGS from DOCKERHUB + TAGS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${{ inputs.container }}/tags/?page_size=100 | jq -r '."results"[]["name"]' || echo "") + + echo "Available tags:" + echo "$TAGS" + + # Check correct version POLKADOT and build it if it doesn't exist in POLKADOT TAGS + if [[ ${TAGS[*]} =~ (^|[[:space:]])"${{ inputs.tag }}"($|[[:space:]]) ]]; then + echo "Repository has needed version, pulling"; + docker pull ${{ inputs.container }}:${{ inputs.tag }} + else + echo "Repository had no needed version, so build it"; + cd "${{ inputs.context }}" && docker build --file "${{ inputs.dockerfile }}" \ + $BUILD_ARGS --tag ${{ inputs.container }}:${{ inputs.tag }} \ + . + echo "Push built version to the repository"; + docker push ${{ inputs.container }}:${{ inputs.tag }} || true + fi + echo "name=${{ inputs.container }}:${{ inputs.tag }}" >> $GITHUB_OUTPUT + env: + BUILD_ARGS: ${{ inputs.args }} + shell: bash diff --git a/.github/workflows/node-only-update.yml b/.github/workflows/node-only-update.yml index 882d962d87..66c58e1d17 100644 --- a/.github/workflows/node-only-update.yml +++ b/.github/workflows/node-only-update.yml @@ -37,11 +37,10 @@ jobs: id: create_matrix with: matrix: | - network {opal}, wasm_name {opal}, mainnet_branch {${{ env.OPAL_MAINNET_BRANCH }}}, relay_branch {${{ env.UNIQUEWEST_MAINNET_BRANCH }}} - network {sapphire}, wasm_name {quartz}, mainnet_branch {${{ env.SAPPHIRE_MAINNET_BRANCH }}}, relay_branch {${{ env.UNIQUEEAST_MAINNET_BRANCH }}} - network {quartz}, wasm_name {quartz}, mainnet_branch {${{ env.QUARTZ_MAINNET_BRANCH }}}, relay_branch {${{ env.KUSAMA_MAINNET_BRANCH }}} - network {unique}, wasm_name {unique}, mainnet_branch {${{ env.UNIQUE_MAINNET_BRANCH }}}, relay_branch {${{ env.POLKADOT_MAINNET_BRANCH }}} - + network {opal}, mainnet_branch {${{ env.OPAL_MAINNET_BRANCH }}}, relay_branch {${{ env.UNIQUEWEST_MAINNET_BRANCH }}}, runtime_features {opal-runtime} + network {sapphire}, mainnet_branch {${{ env.SAPPHIRE_MAINNET_BRANCH }}}, relay_branch {${{ env.UNIQUEEAST_MAINNET_BRANCH }}}, runtime_features {sapphire-runtime} + network {quartz}, mainnet_branch {${{ env.QUARTZ_MAINNET_BRANCH }}}, relay_branch {${{ env.KUSAMA_MAINNET_BRANCH }}}, runtime_features {quartz-runtime} + network {unique}, mainnet_branch {${{ env.UNIQUE_MAINNET_BRANCH }}}, relay_branch {${{ env.POLKADOT_MAINNET_BRANCH }}}, runtime_features {unique-runtime} node-only-update-build: @@ -80,292 +79,136 @@ jobs: - name: Read .env file uses: xom9ikk/dotenv@v2 - # Build main image for NODE-ONLY-UPDATE - - name: Generate ENV related extend Dockerfile file - uses: cuchi/jinja2-action@v1.2.0 - with: - template: .docker/Dockerfile-parachain-node-only.j2 - output_file: .docker/Dockerfile-parachain-node-only.${{ matrix.network }}.yml - variables: | - RUST_TOOLCHAIN=${{ env.RUST_TOOLCHAIN }} - NETWORK=${{ matrix.network }} - MAINNET_BRANCH=${{ matrix.mainnet_branch }} - POLKADOT_LAUNCH_BRANCH=${{ env.POLKADOT_LAUNCH_BRANCH }} - WASM_NAME=${{ matrix.wasm_name }} - POLKADOT_BUILD_BRANCH=${{ matrix.relay_branch }} - - - name: Show build configuration - run: cat .docker/Dockerfile-parachain-node-only.${{ matrix.network }}.yml - - - name: Generate launch-config.json - uses: cuchi/jinja2-action@v1.2.0 - with: - template: .docker/forkless-config/launch-config-forkless-nodata.j2 - output_file: .docker/forkless-config/launch-config-node-only.json - variables: | - WASM_NAME=${{ matrix.wasm_name }} - RELAY_CHAIN_TYPE=${{ env.RELAY_CHAIN_TYPE }} - - - name: Show launch-config-forkless configuration - run: cat .docker/forkless-config/launch-config-node-only.json - - - name: Run find-and-replace to remove slashes from branch name - uses: mad9000/actions-find-and-replace-string@4 - id: branchname - with: - source: ${{ github.head_ref }} - find: '/' - replace: '-' - - - name: Set build SHA - shell: bash - run: | - echo "BUILD_SHA=${LAST_COMMIT_SHA:0:8}" >> $GITHUB_ENV - - - name: Build the stack - run: cd .docker/ && docker build --no-cache --file ./Dockerfile-parachain-node-only.${{ matrix.network }}.yml --tag uniquenetwork/ci-node-only-local:${{ matrix.network }}-${{ steps.branchname.outputs.value }}-$BUILD_SHA ../ - - name: Log in to Docker Hub uses: docker/login-action@v2.1.0 with: username: ${{ secrets.CORE_DOCKERHUB_USERNAME }} password: ${{ secrets.CORE_DOCKERHUB_TOKEN }} - - name: Push docker image version - run: docker push uniquenetwork/ci-node-only-local:${{ matrix.network }}-${{ steps.branchname.outputs.value }}-$BUILD_SHA - - - name: Remove builder cache - if: always() # run this step always - run: | - docker builder prune -f - docker system prune -f - - - node-only-update-tests: - needs: [prepare-execution-matrix, node-only-update-build] - # The type of runner that the job will run on - runs-on: [self-hosted-ci, large] - - timeout-minutes: 2880 - - name: ${{ matrix.network }}-tests - - continue-on-error: true #Do not stop testing of matrix runs failed. As it decided during PR review - it required 50/50& Let's check it with false. - - strategy: - matrix: - include: ${{fromJson(needs.prepare-execution-matrix.outputs.matrix)}} - - steps: - - name: Skip if pull request is in Draft - if: github.event.pull_request.draft == true - run: exit 1 - - - name: Clean Workspace - uses: AutoModality/action-clean@v1.1.0 - - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3.1.0 - with: - ref: ${{ github.head_ref }} #Checking out head commit - - - name: Prepare - uses: ./.github/actions/prepare - - - name: Set build SHA - shell: bash - run: | - echo "BUILD_SHA=${LAST_COMMIT_SHA:0:8}" >> $GITHUB_ENV - - - name: Run find-and-replace to remove slashes from branch name - uses: mad9000/actions-find-and-replace-string@4 - id: branchname - with: - source: ${{ github.head_ref }} - find: '/' - replace: '-' - - - name: Read .env file - uses: xom9ikk/dotenv@v2 - - - name: Generate ENV related extend file for docker-compose + - name: Generate ENV related extend Dockerfile file for POLKADOT uses: cuchi/jinja2-action@v1.2.0 with: - template: .docker/docker-compose.node-only.j2 - output_file: .docker/docker-compose.node-only.${{ matrix.network }}.yml + template: .docker/Dockerfile-polkadot.j2 + output_file: .docker/Dockerfile-polkadot.${{ matrix.relay_branch }}.yml variables: | - NETWORK=${{ matrix.network }} - BUILD_TAG=${{ steps.branchname.outputs.value }}-$BUILD_SHA - - - name: Show build configuration - run: cat .docker/docker-compose.node-only.${{ matrix.network }}.yml - - - name: Log in to Docker Hub - uses: docker/login-action@v2.1.0 + RUST_TOOLCHAIN=${{ env.RUST_TOOLCHAIN }} + POLKADOT_BUILD_BRANCH=${{ matrix.relay_branch }} + - name: Prepare polkadot + uses: ./.github/actions/buildContainer + id: polkadot with: - username: ${{ secrets.CORE_DOCKERHUB_USERNAME }} - password: ${{ secrets.CORE_DOCKERHUB_TOKEN }} - - - name: Build the stack - run: docker-compose -f ".docker/docker-compose.node-only.${{ matrix.network }}.yml" up -d --remove-orphans --force-recreate --timeout 300 - - # 🚀 POLKADOT LAUNCH COMPLETE 🚀 - - name: Check if docker logs consist messages related to testing of Node Parachain Upgrade. - if: success() - run: | - counter=160 - function check_container_status { - docker inspect -f {{.State.Running}} node-only - } - function do_docker_logs { - docker logs --details node-only 2>&1 - } - function is_started { - if [ "$(check_container_status)" == "true" ]; then - echo "Container: node-only RUNNING"; - echo "Check Docker logs" - DOCKER_LOGS=$(do_docker_logs) - if [[ ${DOCKER_LOGS} = *"POLKADOT LAUNCH COMPLETE"* ]];then - echo "🚀 POLKADOT LAUNCH COMPLETE 🚀" - return 0 - else - echo "Message not found in logs output, repeating..." - return 1 - fi - else - echo "Container node-only NOT RUNNING" - echo "Halting all future checks" - exit 1 - fi - echo "something goes wrong" - exit 1 - } - while ! is_started; do - echo "Waiting for special message in log files " - sleep 30s - counter=$(( $counter - 1 )) - echo "Counter: $counter" - if [ "$counter" -gt "0" ]; then - continue - else - break - fi - done - echo "Halting script" - exit 0 - shell: bash + container: uniquenetwork/builder-polkadot + tag: ${{ matrix.relay_branch }} + context: .docker + dockerfile: Dockerfile-polkadot.${{ matrix.relay_branch }}.yml + dockerhub_username: ${{ secrets.CORE_DOCKERHUB_USERNAME }} + dockerhub_token: ${{ secrets.CORE_DOCKERHUB_TOKEN }} + + - name: Prepare mainnet + uses: ./.github/actions/buildContainer + id: mainnet + with: + container: uniquenetwork/ci-node-only-${{ matrix.network }} + tag: ${{ matrix.mainnet_branch }} + context: .docker + dockerfile: Dockerfile-unique-release + args: | + --build-arg RUNTIME_FEATURES=${{ matrix.runtime_features }} + --build-arg RUST_TOOLCHAIN=${{ env.RUST_TOOLCHAIN }} + --build-arg UNIQUE_VERSION=${{ matrix.mainnet_branch }} + dockerhub_username: ${{ secrets.CORE_DOCKERHUB_USERNAME }} + dockerhub_token: ${{ secrets.CORE_DOCKERHUB_TOKEN }} + + - name: Prepare latest + uses: ./.github/actions/buildContainer + id: latest + with: + container: uniquenetwork/ci-node-only-${{ matrix.network }} + tag: ${{ env.REF_SLUG }}-${{ env.BUILD_SHA }} + context: . + dockerfile: .docker/Dockerfile-unique + args: | + --build-arg RUNTIME_FEATURES=${{ matrix.runtime_features }} + --build-arg RUST_TOOLCHAIN=${{ env.RUST_TOOLCHAIN }} + dockerhub_username: ${{ secrets.CORE_DOCKERHUB_USERNAME }} + dockerhub_token: ${{ secrets.CORE_DOCKERHUB_TOKEN }} - name: Checkout at '${{ matrix.mainnet_branch }}' branch uses: actions/checkout@master with: - ref: ${{ matrix.mainnet_branch }} #Checking out head commit + ref: ${{ github.head_ref }} + # ref: ${{ matrix.mainnet_branch }} #Checking out head commit path: ${{ matrix.mainnet_branch }} - uses: actions/setup-node@v3.5.1 with: node-version: 16 + - name: Install baedeker + uses: UniqueNetwork/baedeker-action/setup@built + + - name: Setup library + run: mkdir -p .baedeker/vendor/ && git clone https://github.com/UniqueNetwork/baedeker-library .baedeker/vendor/baedeker-library + + - name: Start network + uses: UniqueNetwork/baedeker-action@built + id: bdk + with: + jpath: | + .baedeker/vendor + tla-str: | + relay_spec=westend-local + inputs: | + .baedeker/node-only.jsonnet + snippet:(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({'bin/polkadot':{dockerImage:'${{ steps.polkadot.outputs.name }}'}}) + ephemeral:snippet:(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({'bin/unique':{dockerImage:'${{ steps.mainnet.outputs.name }}'}}, extra_node_mixin = {legacyRpc: true}) + - name: Run Parallel tests before Node Parachain upgrade working-directory: ${{ matrix.mainnet_branch }}/tests if: success() || failure() run: | - yarn install + yarn yarn add mochawesome ./scripts/wait_for_first_block.sh echo "Ready to start tests" NOW=$(date +%s) && yarn testParallel --reporter mochawesome --reporter-options reportFilename=test-parallel-${NOW} env: - RPC_URL: http://127.0.0.1:9944/ + RPC_URL: ${{ env.RELAY_UNIQUE_HTTP_URL }} - name: Run Sequential tests before Node Parachain upgrade if: success() || failure() working-directory: ${{ matrix.mainnet_branch }}/tests run: NOW=$(date +%s) && yarn testSequential --reporter mochawesome --reporter-options reportFilename=test-sequential-${NOW} env: - RPC_URL: http://127.0.0.1:9944/ + RPC_URL: ${{ env.RELAY_UNIQUE_HTTP_URL }} - - name: Send SIGUSR1 to polkadot-launch process + - name: "Reconcile: only one old node" if: success() || failure() - run: | - #Get PID of polkadot-launch - ContainerID=$(docker ps -aqf "name=node-only") - PID=$(docker exec node-only pidof 'polkadot-launch') - sleep 30s - echo -e "\n" - echo -e "Restart polkadot-launch process: $PID\n" - docker exec node-only kill -SIGUSR1 ${PID} - echo "SIGUSR1 sent to Polkadot-launch PID: $PID" - sleep 60s - echo -e "Show logs of node-only container.\n" - docker logs ${ContainerID} - - - name: Get chain logs in case of docker image crashed after Polkadot Launch restart - if: failure() # run this step only at failure - run: | - docker exec node-only tail -n 1000 /polkadot-launch/9944.log - docker exec node-only tail -n 1000 /polkadot-launch/9945.log - docker exec node-only tail -n 1000 /polkadot-launch/alice.log - - - name: copy chain log files from container to the host + uses: UniqueNetwork/baedeker-action/reconcile@built + with: + baedeker: ${{ steps.bdk.baedeker }} + # Chain should always be built with the mainnet spec, this we first set binary for all nodes expect one, then set mainnet binary for the last node, and then force chainspec to be still generated from mainnet + inputs: | + snippet:(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({'bin/unique':{dockerImage:'${{ steps.latest.outputs.name }}'}}, leave = 1, for_chain = false) + snippet:(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({'bin/unique':{dockerImage:'${{ steps.mainnet.outputs.name }}'}}, extra_node_mixin = {legacyRpc: true}, for_chain = false) + snippet:(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({'bin/unique':{dockerImage:'${{ steps.mainnet.outputs.name }}'}}) + + - name: Ensure network is alive if: success() || failure() # run this step even if previous step failed run: | - mkdir -p /tmp/node-only-update - docker cp node-only:/polkadot-launch/9944.log /tmp/node-only-update/ - docker cp node-only:/polkadot-launch/9945.log /tmp/node-only-update/ - docker cp node-only:/polkadot-launch/alice.log /tmp/node-only-update/ + ./tests/scripts/wait_for_first_block.sh + env: + RPC_URL: ${{ env.RELAY_UNIQUE_HTTP_URL }} - - name: Upload chain log files + - name: "Reconcile: all nodes are updated" if: success() || failure() - uses: actions/upload-artifact@v3 + uses: UniqueNetwork/baedeker-action/reconcile@built with: - name: node-only-update-chain-logs - path: /tmp/node-only-update/ - if-no-files-found: warn - - - name: Check if docker logs consist messages related to testing of Node Parachain Upgrade. - if: success() - run: | - counter=160 - function check_container_status { - docker inspect -f {{.State.Running}} node-only - } - function do_docker_logs { - docker logs --details node-only 2>&1 - } - function is_started { - if [ "$(check_container_status)" == "true" ]; then - echo "Container: node-only RUNNING"; - echo "Check Docker logs" - DOCKER_LOGS=$(do_docker_logs) - if [[ ${DOCKER_LOGS} = *"All parachain collators restarted with the new binaries."* ]];then - echo "🌗 All parachain collators restarted with the new binaries." - return 0 - else - echo "Message not found in logs output, repeating..." - return 1 - fi - else - echo "Container node-only NOT RUNNING" - echo "Halting all future checks" - exit 1 - fi - echo "something goes wrong" - exit 1 - } - while ! is_started; do - echo "Waiting for special message in log files " - sleep 30s - counter=$(( $counter - 1 )) - echo "Counter: $counter" - if [ "$counter" -gt "0" ]; then - continue - else - break - fi - done - echo "Halting script" - exit 0 - shell: bash + baedeker: ${{ steps.bdk.baedeker }} + # Chain should always be built with the mainnet spec, this we first set binary for all nodes, and then force chainspec to be still generated from mainnet + inputs: | + snippet:(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({'bin/unique':{dockerImage:'${{ steps.latest.outputs.name }}'}}, for_chain = false) + snippet:(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({'bin/unique':{dockerImage:'${{ steps.mainnet.outputs.name }}'}}) - name: Run Parallel tests after Node Parachain upgrade working-directory: ${{ matrix.mainnet_branch }}/tests @@ -377,27 +220,16 @@ jobs: echo "Ready to start tests" NOW=$(date +%s) && yarn testParallel --reporter mochawesome --reporter-options reportFilename=test-parallel-${NOW} env: - RPC_URL: http://127.0.0.1:9944/ + RPC_URL: ${{ env.RELAY_UNIQUE_HTTP_URL }} - name: Run Sequential tests after Node Parachain upgrade if: success() || failure() working-directory: ${{ matrix.mainnet_branch }}/tests run: NOW=$(date +%s) && yarn testSequential --reporter mochawesome --reporter-options reportFilename=test-sequential-${NOW} env: - RPC_URL: http://127.0.0.1:9944/ - - - name: Stop running containers - if: always() # run this step always - run: docker-compose -f ".docker/docker-compose.node-only.${{ matrix.network }}.yml" down + RPC_URL: ${{ env.RELAY_UNIQUE_HTTP_URL }} - name: Remove builder cache if: always() # run this step always run: | - docker builder prune -f -a docker system prune -f - docker image prune -f -a - - - name: Remove repo at the end - if: always() # run this step always - run: | - ls -ls ./ diff --git a/.github/workflows/xcm.yml b/.github/workflows/xcm.yml index 4bf391d992..b6bce1cd5f 100644 --- a/.github/workflows/xcm.yml +++ b/.github/workflows/xcm.yml @@ -312,7 +312,7 @@ jobs: jpath: | .baedeker/vendor tla-str: | - relay_spec=rococo + relay_spec=westend-local inputs: | .baedeker/xcm-${{ matrix.network }}.jsonnet snippet:(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({'bin/polkadot':{dockerImage:'uniquenetwork/builder-polkadot:${{ matrix.relay_branch }}'}}) diff --git a/tests/scripts/wait_for_first_block.sh b/tests/scripts/wait_for_first_block.sh index 87c369b344..c8453212b0 100755 --- a/tests/scripts/wait_for_first_block.sh +++ b/tests/scripts/wait_for_first_block.sh @@ -4,24 +4,40 @@ DIR=$(dirname "$0") . $DIR/functions.sh -function is_started { +last_block_id=0 +block_id=0 +function get_block { block_id_hex=$(do_rpc chain_getHeader | jq -r .result.number) block_id=$((${block_id_hex})) echo Id = $block_id - if (( $block_id > 1 )); then +} + +function had_new_block { + last_block_id=$block_id + get_block + if (( last_block_id != 0 && block_id > last_block_id )); then return 0 fi return 1 } -while ! is_started; do - echo "Waiting for first block..." +function reset_check { + last_block_id=0 + block_id=0 +} + +while ! had_new_block; do + echo "Waiting for next block..." sleep 12 done +reset_check + echo "Chain is running, but lets wait for another block after a minute, to avoid startup flakiness." -sleep 120 -while ! is_started; do - echo "Waiting for second block..." +sleep 60 + +while ! had_new_block; do + echo "Waiting for another block..." sleep 12 done + echo "Chain is running!" diff --git a/tests/src/util/globalSetup.ts b/tests/src/util/globalSetup.ts index 2a4ac7655b..81bf61f65b 100644 --- a/tests/src/util/globalSetup.ts +++ b/tests/src/util/globalSetup.ts @@ -112,4 +112,8 @@ const fundFilenamesWithRetries = (retriesLeft: number): Promise => { }); }; -globalSetup().catch(() => process.exit(1)); +globalSetup().catch(e => { + console.error('Setup error'); + console.error(e); + process.exit(1) +}); diff --git a/tests/src/xcm/xcmQuartz.test.ts b/tests/src/xcm/xcmQuartz.test.ts index 2ba530cbc2..ef8dfa9631 100644 --- a/tests/src/xcm/xcmQuartz.test.ts +++ b/tests/src/xcm/xcmQuartz.test.ts @@ -481,7 +481,7 @@ describeXCM('[XCM] Integration test: Exchanging tokens with Karura', () => { await usingKaruraPlaygrounds(karuraUrl, async (helper) => { const destination = { - V1: { + V2: { parents: 1, interior: { X1: { @@ -591,7 +591,7 @@ describeXCM('[XCM] Integration test: Exchanging tokens with Karura', () => { itSub('Should connect to Karura and send QTZ back', async ({helper}) => { await usingKaruraPlaygrounds(karuraUrl, async (helper) => { const destination = { - V1: { + V2: { parents: 1, interior: { X2: [ @@ -653,7 +653,7 @@ describeXCM('[XCM] Integration test: Exchanging tokens with Karura', () => { const [targetAccount] = await helper.arrange.createAccounts([targetAccountBalance], alice); const quartzMultilocation = { - V1: { + V2: { parents: 1, interior: { X1: {Parachain: QUARTZ_CHAIN}, @@ -716,7 +716,7 @@ describeXCM('[XCM] Integration test: Exchanging tokens with Karura', () => { const [targetAccount] = await helper.arrange.createAccounts([0n], alice); const quartzMultilocation = { - V1: { + V2: { parents: 1, interior: { X1: { @@ -797,7 +797,6 @@ describeXCM('[XCM] Integration test: Quartz rejects non-native tokens', () => { let quartzParachainMultilocation: any; let quartzAccountMultilocation: any; let quartzCombinedMultilocation: any; - let quartzCombinedMultilocationKarura: any; // TODO remove it when Karura goes V2 let messageSent: any; @@ -842,15 +841,6 @@ describeXCM('[XCM] Integration test: Quartz rejects non-native tokens', () => { }, }; - quartzCombinedMultilocationKarura = { - V1: { - parents: 1, - interior: { - X2: [quartzParachainJunction, quartzAccountJunction], - }, - }, - }; - // Set the default version to wrap the first message to other chains. await helper.getSudo().xcm.setSafeXcmVersion(alice, SAFE_XCM_VERSION); }); @@ -871,7 +861,7 @@ describeXCM('[XCM] Integration test: Quartz rejects non-native tokens', () => { const id = { Token: 'KAR', }; - const destination = quartzCombinedMultilocationKarura; + const destination = quartzCombinedMultilocation; await helper.xTokens.transfer(alice, id, testAmount, destination, 'Unlimited'); messageSent = await helper.wait.expectEvent(maxWaitBlocks, Event.XcmpQueue.XcmpMessageSent);