From 14c67a6897f34b18beefd9366db828b2a051d24b Mon Sep 17 00:00:00 2001 From: Maksym H Date: Wed, 21 Aug 2024 10:13:44 +0100 Subject: [PATCH] [skip ci] cmd.yml remove rust installation + add forklift submodules + dev runtime adjst subweight update ui fix regex remove old commands modify help docs --- .github/command-screnshot.png | Bin 31548 -> 0 bytes .github/commands-readme.md | 276 ------------------- .github/scripts/cmd/cmd.py | 103 ++++--- .github/workflows/cmd.yml | 145 ++++++---- .github/workflows/command-bench-all.yml | 99 ------- .github/workflows/command-bench-overhead.yml | 78 ------ .github/workflows/command-bench.yml | 124 --------- .github/workflows/command-fmt.yml | 65 ----- .github/workflows/command-inform.yml | 22 -- .github/workflows/command-prdoc.yml | 90 ------ .github/workflows/command-sync.yml | 71 ----- .github/workflows/command-update-ui.yml | 59 ---- .github/workflows/review-bot.yml | 1 - .github/workflows/runtimes-matrix.json | 13 +- .gitignore | 1 + docs/contributor/CONTRIBUTING.md | 10 +- docs/contributor/commands-readme.md | 32 +++ docs/contributor/weight-generation.md | 55 ++++ scripts/bench-all.sh | 16 -- scripts/bench.sh | 117 -------- scripts/command-utils.sh | 80 ------ scripts/lib/bench-all-cumulus.sh | 139 ---------- scripts/lib/bench-all-pallet.sh | 96 ------- scripts/lib/bench-all-polkadot.sh | 88 ------ scripts/lib/bench-all-substrate.sh | 148 ---------- scripts/lib/bench-overhead.sh | 66 ----- scripts/lib/bench-pallet.sh | 178 ------------ scripts/sync.sh | 74 ----- scripts/update-ui-tests.sh | 41 --- 29 files changed, 260 insertions(+), 2027 deletions(-) delete mode 100644 .github/command-screnshot.png delete mode 100644 .github/commands-readme.md delete mode 100644 .github/workflows/command-bench-all.yml delete mode 100644 .github/workflows/command-bench-overhead.yml delete mode 100644 .github/workflows/command-bench.yml delete mode 100644 .github/workflows/command-fmt.yml delete mode 100644 .github/workflows/command-inform.yml delete mode 100644 .github/workflows/command-prdoc.yml delete mode 100644 .github/workflows/command-sync.yml delete mode 100644 .github/workflows/command-update-ui.yml create mode 100644 docs/contributor/commands-readme.md create mode 100644 docs/contributor/weight-generation.md delete mode 100755 scripts/bench-all.sh delete mode 100755 scripts/bench.sh delete mode 100644 scripts/command-utils.sh delete mode 100755 scripts/lib/bench-all-cumulus.sh delete mode 100644 scripts/lib/bench-all-pallet.sh delete mode 100644 scripts/lib/bench-all-polkadot.sh delete mode 100644 scripts/lib/bench-all-substrate.sh delete mode 100644 scripts/lib/bench-overhead.sh delete mode 100644 scripts/lib/bench-pallet.sh delete mode 100755 scripts/sync.sh delete mode 100755 scripts/update-ui-tests.sh diff --git a/.github/command-screnshot.png b/.github/command-screnshot.png deleted file mode 100644 index 1451fabca8b975534778e8321facd261e3b803fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31548 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%0D|Qs}dMP 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 runs all benchmarks - + Runs all benchmarks %(prog)s - - > runs benchmarks for pallet_balances and pallet_multisig for all runtimes which have these pallets - > --quiet makes it to output nothing to PR but reactions - + + Runs benchmarks for pallet_balances and pallet_multisig for all runtimes which have these pallets. **--quiet** makes it to output nothing to PR but reactions %(prog)s --pallet pallet_balances pallet_xcm_benchmarks::generic --quiet - > runs bench for all pallets for polkadot runtime and continues even if some benchmarks fail - - %(prog)s --runtime polkadot --continue-on-fail - - > does not output anything and cleans up the previous bot's & author command triggering comments in PR + Runs bench for all pallets for westend runtime and continues even if some benchmarks fail + %(prog)s --runtime westend --continue-on-fail - %(prog)s --runtime polkadot kusama --pallet pallet_balances pallet_multisig --quiet --clean - - ''' + Does not output anything and cleans up the previous bot's & author command triggering comments in PR + %(prog)s --runtime westend rococo --pallet pallet_balances pallet_multisig --quiet --clean +''' parser_bench = subparsers.add_parser('bench', help='Runs benchmarks', epilog=bench_example, formatter_class=argparse.RawDescriptionHelpFormatter) @@ -64,10 +57,18 @@ """ FMT """ -parser_fmt = subparsers.add_parser('fmt', help='Formats code') +parser_fmt = subparsers.add_parser('fmt', help='Formats code (cargo +nightly-VERSION fmt) and configs (taplo format)') for arg, config in common_args.items(): parser_fmt.add_argument(arg, **config) +""" +Update UI +""" +parser_ui = subparsers.add_parser('update-ui', help='Updates UI tests') +for arg, config in common_args.items(): + parser_ui.add_argument(arg, **config) + + args, unknown = parser.parse_known_args() print(f'args: {args}') @@ -89,7 +90,7 @@ # loop over remaining runtimes to collect available pallets for runtime in runtimesMatrix.values(): - os.system(f"cargo build -p {runtime['package']} --profile {profile} --features runtime-benchmarks") + os.system(f"forklift cargo build -p {runtime['package']} --profile {profile} --features runtime-benchmarks") print(f'-- listing pallets for benchmark for {runtime["name"]}') wasm_file = f"target/{profile}/wbuild/{runtime['package']}/{runtime['package'].replace('-', '_')}.wasm" output = os.popen( @@ -135,22 +136,23 @@ for pallet in runtime_pallets_map[runtime]: config = runtimesMatrix[runtime] print(f'-- config: {config}') - default_path = f"./{config['path']}/src/weights" - xcm_path = f"./{config['path']}/src/weights/xcm" - output_path = default_path if not pallet.startswith("pallet_xcm_benchmarks") else xcm_path + if runtime == 'dev': + # to support sub-modules (https://github.com/paritytech/command-bot/issues/275) + search_manifest_path = f"cargo metadata --format-version 1 --no-deps | jq -r '.packages[] | select(.name == \"{pallet.replace('_', '-')}\") | .manifest_path'" + print(f'-- running: {search_manifest_path}') + manifest_path = os.popen(search_manifest_path).read() + package_dir = os.path.dirname(manifest_path) + print(f'-- package_dir: {package_dir}') + print(f'-- manifest_path: {manifest_path}') + output_path = os.path.join(package_dir, "src", "weights.rs") + else: + default_path = f"./{config['path']}/src/weights" + xcm_path = f"./{config['path']}/src/weights/xcm" + output_path = default_path if not pallet.startswith("pallet_xcm_benchmarks") else xcm_path print(f'-- benchmarking {pallet} in {runtime} into {output_path}') - - status = os.system(f"frame-omni-bencher v1 benchmark pallet " - f"--extrinsic=* " - f"--runtime=target/{profile}/wbuild/{config['package']}/{config['package'].replace('-', '_')}.wasm " - f"--pallet={pallet} " - f"--header={header_path} " - f"--output={output_path} " - f"--wasm-execution=compiled " - f"--steps=50 " - f"--repeat=20 " - f"--heap-pages=4096 " - ) + cmd = f"frame-omni-bencher v1 benchmark pallet --extrinsic=* --runtime=target/{profile}/wbuild/{config['package']}/{config['package'].replace('-', '_')}.wasm --pallet={pallet} --header={header_path} --output={output_path} --wasm-execution=compiled --steps=50 --repeat=20 --heap-pages=4096" + print(f'-- Running: {cmd}') + status = os.system(cmd) if status != 0 and not args.continue_on_fail: print(f'Failed to benchmark {pallet} in {runtime}') sys.exit(1) @@ -175,9 +177,13 @@ tempdir.cleanup() elif args.command == 'fmt': + # Based on https://github.com/paritytech/scripts/blob/master/dockerfiles/ci-unified/Dockerfile nightly_version = os.getenv('RUST_NIGHTLY_VERSION') + print(os.environ) + print(os.environ.get('RUST_NIGHTLY_VERSION')) + command = f"cargo +nightly-{nightly_version} fmt" - print('Formatting with `{command}`') + print(f'Formatting with `{command}`') nightly_status = os.system(f'{command}') taplo_status = os.system('taplo format --config .config/taplo.toml') @@ -185,4 +191,19 @@ print('❌ Failed to format code') sys.exit(1) +elif args.command == 'update-ui': + command = ''' + cargo test --manifest-path substrate/primitives/runtime-interface/Cargo.toml ui + cargo test -p sp-api-test ui + cargo test -p frame-election-provider-solution-type ui + cargo test -p frame-support-test --features=no-metadata-docs,try-runtime,experimental ui + cargo test -p xcm-procedural ui + ''' + print(f'Updating ui with `{command}`') + status = os.system(f'{command}') + + if status != 0 and not args.continue_on_fail: + print('❌ Failed to format code') + sys.exit(1) + print('πŸš€ Done') diff --git a/.github/workflows/cmd.yml b/.github/workflows/cmd.yml index c655700b78a93..56f5c8dfb2884 100644 --- a/.github/workflows/cmd.yml +++ b/.github/workflows/cmd.yml @@ -12,28 +12,55 @@ permissions: # allow the action to comment on the PR jobs: is-org-member: + if: startsWith(github.event.comment.body, '/cmd') runs-on: ubuntu-latest outputs: - member: ${{ steps.is-member.outputs.is-member }} + member: ${{ steps.is-member.outputs.result }} steps: - name: Checkout uses: actions/checkout@v4 + - name: Generate token + id: generate_token + uses: tibdex/github-app-token@v2.1.0 + with: + app_id: ${{ secrets.CMD_BOT_APP_ID }} + private_key: ${{ secrets.CMD_BOT_APP_KEY }} + - name: Check if user is a member of the organization id: is-member uses: actions/github-script@v7 with: - github-token: ${{ secrets.GITHUB_TOKEN }} + github-token: ${{ steps.generate_token.outputs.token }} + result-encoding: string script: | - const membership = await github.orgs.checkMembershipForUser({ - org: context.repo.owner, - username: context.actor - }) - return membership.data.state === 'active' + const fs = require("fs"); + try { + const org = '${{ github.event.repository.owner.login }}'; + const username = '${{ github.event.comment.user.login }}'; + + const membership = await github.rest.orgs.checkMembershipForUser({ + org: org, + username: username + }); + + console.log(membership, membership.status, membership.status === 204); + + if (membership.status === 204) { + return 'true'; + } else { + console.log(membership); + fs.appendFileSync(process.env["GITHUB_STEP_SUMMARY"], `${membership.data && membership.data.message || 'Unknown error happened, please check logs'}`); + } + } catch (error) { + console.log(error) + } + + return 'false'; - reject-non-fellows: + reject-non-members: needs: is-org-member - if: ${{ startsWith(github.event.comment.body, '/cmd') && !contains(needs.fellows.outputs.github-handles, github.event.sender.login) }} + if: ${{ startsWith(github.event.comment.body, '/cmd') && needs.is-org-member.outputs.member != 'true' }} runs-on: ubuntu-latest steps: - name: Add reaction to rejected comment @@ -57,12 +84,12 @@ jobs: issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: `Sorry, only fellows can run commands.` + body: `Sorry, only ${{ github.event.repository.owner.login }} members can run commands.` }) acknowledge: - needs: fellows - if: ${{ startsWith(github.event.comment.body, '/cmd') && contains(needs.fellows.outputs.github-handles, github.event.sender.login) }} + needs: is-org-member + if: ${{ startsWith(github.event.comment.body, '/cmd') && needs.is-org-member.outputs.member == 'true' }} runs-on: ubuntu-latest steps: - name: Add reaction to triggered comment @@ -85,7 +112,7 @@ jobs: uses: actions/checkout@v4 - name: Clean previous comments - if: ${{ startsWith(github.event.comment.body, '/cmd') && contains(github.event.comment.body, '--clean') && contains(needs.fellows.outputs.github-handles, github.event.sender.login) }} + if: ${{ startsWith(github.event.comment.body, '/cmd') && contains(github.event.comment.body, '--clean') && needs.is-org-member.outputs.member == 'true' }} uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -100,7 +127,13 @@ jobs: if ( ${{ github.event.comment.id }} !== comment.id && ( - ((comment.body.startsWith('Command') || comment.body.startsWith('
Command')) && comment.user.type === 'Bot') || + ( + ( + comment.body.startsWith('Command') || + comment.body.startsWith('
Command') || + comment.body.startsWith('Sorry, only ') + ) && comment.user.type === 'Bot' + ) || (comment.body.startsWith('/cmd') && comment.user.login === context.actor) ) ) { @@ -114,7 +147,7 @@ jobs: }) help: needs: [ clean, is-org-member ] - if: ${{ startsWith(github.event.comment.body, '/cmd') && contains(github.event.comment.body, '--help') && contains(needs.fellows.outputs.github-handles, github.event.sender.login) }} + if: ${{ startsWith(github.event.comment.body, '/cmd') && contains(github.event.comment.body, '--help') && needs.is-org-member.outputs.member == 'true' }} runs-on: ubuntu-latest steps: - name: Checkout @@ -145,7 +178,13 @@ jobs: issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, - body: `
Command help:${{ steps.help.outputs.help }}
` + body: `
Command help: + + \`\`\` + ${{ steps.help.outputs.help }} + \`\`\` + +
` }) - name: Add confused reaction on failure @@ -174,25 +213,50 @@ jobs: content: '+1' }) - cmd: + set-image: needs: [ clean, is-org-member ] - env: - JOB_NAME: 'cmd' - if: ${{ startsWith(github.event.comment.body, '/cmd') && !contains(github.event.comment.body, '--help') && contains(needs.fellows.outputs.github-handles, github.event.sender.login) }} - runs-on: ${{ startsWith(github.event.comment.body, '/cmd bench') && 'arc-runners-polkadot-sdk-benchmark' || 'ubuntu-latest' }} + if: ${{ startsWith(github.event.comment.body, '/cmd') && !contains(github.event.comment.body, '--help') && needs.is-org-member.outputs.member == 'true' }} + runs-on: ubuntu-latest + outputs: + IMAGE: ${{ steps.set-image.outputs.IMAGE }} + RUNNER: ${{ steps.set-image.outputs.RUNNER }} steps: - - name: Install updates and protobuf-compiler - if: startsWith(github.event.comment.body, '/cmd bench') + - name: Checkout + uses: actions/checkout@v4 + + - id: set-image run: | - sudo apt update && sudo apt install --assume-yes \ - openssl pkg-config g++ make cmake protobuf-compiler curl libssl-dev libclang-dev libudev-dev git jq + BODY=$(echo "${{ github.event.comment.body }}" | xargs) + IMAGE_OVERRIDE=$(echo $BODY | grep -oe 'docker.io/paritytech/ci-unified:.*\s' | xargs) + + cat .github/env >> $GITHUB_OUTPUT + + if [ -n "$IMAGE_OVERRIDE" ]; then + echo "IMAGE=$IMAGE_OVERRIDE" >> $GITHUB_OUTPUT + fi + + if [[ $BODY == "/cmd bench"* ]]; then + echo "RUNNER=arc-runners-polkadot-sdk-benchmark" >> $GITHUB_OUTPUT + elif [[ $BODY == "/cmd update-ui"* ]]; then + echo "RUNNER=arc-runners-polkadot-sdk-beefy" >> $GITHUB_OUTPUT + else + echo "RUNNER=ubuntu-latest" >> $GITHUB_OUTPUT + fi + cmd: + needs: [ set-image ] + env: + JOB_NAME: 'cmd' + runs-on: ${{ needs.set-image.outputs.RUNNER }} + container: + image: ${{ needs.set-image.outputs.IMAGE }} + steps: - name: Get command uses: actions-ecosystem/action-regex-match@v2 id: get-pr-comment with: text: ${{ github.event.comment.body }} - regex: '^(\/cmd )([\s\w-]+)$' + regex: '^(\/cmd )([-\/\s\w.=:]+)$' # not ";" or && || to reduce risk of injections - name: Build workflow link if: ${{ !contains(github.event.comment.body, '--quiet') }} @@ -235,36 +299,19 @@ jobs: with: ref: ${{ github.head_ref }} - - name: Set rust version via common env file - run: cat .github/env >> $GITHUB_ENV - - - name: Install Rust - uses: dtolnay/rust-toolchain@master - with: - targets: "wasm32-unknown-unknown,x86_64-unknown-linux-musl" - components: "rust-src rustfmt clippy" - toolchain: "nightly-${{env.RUST_NIGHTLY_VERSION}}" - - name: Install dependencies for bench if: startsWith(steps.get-pr-comment.outputs.group2, 'bench') run: cargo install subweight frame-omni-bencher --locked - - name: Install dependencies for fmt - if: startsWith(steps.get-pr-comment.outputs.group2, 'fmt') - run: cargo install taplo-cli --version ${{ env.TAPLO_VERSION }} - - - name: Setup Cache - if: startsWith(steps.get-pr-comment.outputs.group2, 'bench') - uses: Swatinem/rust-cache@a95ba195448af2da9b00fb742d14ffaaf3c21f43 # v2.7.0 - with: - shared-key: "fellowship-cmd" - - name: Run cmd id: cmd env: CMD: ${{ steps.get-pr-comment.outputs.group2 }} # to avoid "" around the command run: | - echo "Running command: $CMD" + echo "Running command: '$CMD' on '${{ needs.set-image.outputs.RUNNER }}' runner, container: '${{ needs.set-image.outputs.IMAGE }}'" + echo "RUST_NIGHTLY_VERSION: $RUST_NIGHTLY_VERSION" + # Fixes "detected dubious ownership" error in the ci + git config --global --add safe.directory '*' git remote -v python3 .github/scripts/cmd/cmd.py $CMD git status @@ -292,13 +339,13 @@ jobs: run: | git fetch result=$(subweight compare commits \ - --path-pattern "./**/weights/**/*.rs" \ + --path-pattern "./**/weights/**/*.rs,./**/weights.rs" \ --method asymptotic \ --format markdown \ --no-color \ --change added changed \ --ignore-errors \ - refs/remotes/origin/main ${{ github.ref }}) + refs/remotes/origin/master ${{ github.ref }}) # Save the multiline result to the output { diff --git a/.github/workflows/command-bench-all.yml b/.github/workflows/command-bench-all.yml deleted file mode 100644 index 4128f86fb7c82..0000000000000 --- a/.github/workflows/command-bench-all.yml +++ /dev/null @@ -1,99 +0,0 @@ -name: Command Bench All - -on: - workflow_dispatch: - inputs: - pr: - description: Number of the Pull Request - required: true - benchmark: - description: Pallet benchmark - type: choice - required: true - options: - - pallet - - substrate - - polkadot - - cumulus - pallet: - description: Pallet - required: false - type: string - default: pallet_name - target_dir: - description: Target directory - type: choice - options: - - substrate - - polkadot - - cumulus - runtime: - description: Runtime - type: choice - options: - - rococo - - westend - - asset-hub-kusama - - asset-hub-polkadot - - asset-hub-rococo - - asset-hub-westend - - bridge-hub-kusama - - bridge-hub-polkadot - - bridge-hub-rococo - - bridge-hub-westend - - collectives-polkadot - - collectives-westend - - coretime-rococo - - coretime-westend - - contracts-rococo - - glutton-kusama - - glutton-westend - - people-rococo - - people-westend - -jobs: - set-image: - runs-on: ubuntu-latest - outputs: - IMAGE: ${{ steps.set_image.outputs.IMAGE }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - id: set_image - run: cat .github/env >> $GITHUB_OUTPUT - cmd-bench-all: - needs: [set-image] - runs-on: arc-runners-polkadot-sdk-weights - container: - image: ${{ needs.set-image.outputs.IMAGE }} - permissions: - contents: write - pull-requests: write - steps: - - name: Download repo - uses: actions/checkout@v4 - - name: Install gh cli - id: gh - uses: ./.github/actions/set-up-gh - with: - pr-number: ${{ inputs.pr }} - GH_TOKEN: ${{ github.token }} - - name: Run bench all - run: | - "./scripts/bench-all.sh" "${{ inputs.benchmark }}" --runtime "${{ inputs.runtime }}" --pallet "${{ inputs.pallet }}" --target_dir "${{ inputs.target_dir }}" - - name: Report failure - if: ${{ failure() }} - run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} - - run: git pull --rebase - - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: cmd-action - ${{ github.workflow }} - branch: ${{ steps.gh.outputs.branch }} - - name: Report succeed - run: gh pr comment ${{ inputs.pr }} --body "

Action completed πŸŽ‰πŸŽ‰

Run by @${{ github.actor }} for ${{ github.workflow }} completed πŸŽ‰. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/command-bench-overhead.yml b/.github/workflows/command-bench-overhead.yml deleted file mode 100644 index fec8d37bb9ef8..0000000000000 --- a/.github/workflows/command-bench-overhead.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: Command Bench Overhead - -on: - workflow_dispatch: - inputs: - pr: - description: Number of the Pull Request - required: true - benchmark: - description: Pallet benchmark - type: choice - required: true - options: - - default - - substrate - - cumulus - runtime: - description: Runtime - type: choice - options: - - rococo - - westend - - asset-hub-rococo - - asset-hub-westend - target_dir: - description: Target directory - type: choice - options: - - polkadot - - substrate - - cumulus - -jobs: - set-image: - runs-on: ubuntu-latest - outputs: - IMAGE: ${{ steps.set_image.outputs.IMAGE }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - id: set_image - run: cat .github/env >> $GITHUB_OUTPUT - cmd-bench-overhead: - needs: [set-image] - runs-on: arc-runners-polkadot-sdk-benchmark - container: - image: ${{ needs.set-image.outputs.IMAGE }} - permissions: - contents: write - pull-requests: write - steps: - - name: Download repo - uses: actions/checkout@v4 - - name: Install gh cli - id: gh - uses: ./.github/actions/set-up-gh - with: - pr-number: ${{ inputs.pr }} - GH_TOKEN: ${{ github.token }} - - name: Run bench overhead - run: | - "./scripts/bench.sh" "${{ inputs.benchmark }}" --subcommand "overhead" --runtime "${{ inputs.runtime }}" --target_dir "${{ inputs.target_dir }}" - - name: Report failure - if: ${{ failure() }} - run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} - - run: git pull --rebase - - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: cmd-action - ${{ github.workflow }} - branch: ${{ steps.gh.outputs.branch }} - - name: Report succeed - run: gh pr comment ${{ inputs.pr }} --body "

Action completed πŸŽ‰πŸŽ‰

Run by @${{ github.actor }} for ${{ github.workflow }} completed πŸŽ‰. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/command-bench.yml b/.github/workflows/command-bench.yml deleted file mode 100644 index ac879f443755c..0000000000000 --- a/.github/workflows/command-bench.yml +++ /dev/null @@ -1,124 +0,0 @@ -name: Command Bench - -on: - workflow_dispatch: - inputs: - pr: - description: Number of the Pull Request - required: true - benchmark: - description: Pallet benchmark - type: choice - required: true - options: - - substrate-pallet - - polkadot-pallet - - cumulus-assets - - cumulus-collectives - - cumulus-coretime - - cumulus-bridge-hubs - - cumulus-contracts - - cumulus-glutton - - cumulus-starters - - cumulus-people - - cumulus-testing - subcommand: - description: Subcommand - type: choice - required: true - options: - - pallet - - xcm - runtime: - description: Runtime - type: choice - options: - - dev - - rococo - - westend - - asset-hub-westend - - asset-hub-rococo - - collectives-westend - - coretime-rococo - - coretime-westend - - bridge-hub-rococo - - bridge-hub-westend - - contracts-rococo - - glutton-westend - - glutton-westend-dev-1300 - - seedling - - shell - - people-westend - - people-rococo - - penpal - - rococo-parachain - pallet: - description: Pallet - type: string - default: pallet_name - target_dir: - description: Target directory - type: choice - options: - - substrate - - polkadot - - cumulus - runtime_dir: - description: Runtime directory - type: choice - options: - - people - - collectives - - coretime - - bridge-hubs - - contracts - - glutton - - starters - - testing - -jobs: - set-image: - runs-on: ubuntu-latest - outputs: - IMAGE: ${{ steps.set_image.outputs.IMAGE }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - id: set_image - run: cat .github/env >> $GITHUB_OUTPUT - cmd-bench: - needs: [set-image] - runs-on: arc-runners-polkadot-sdk-benchmark - container: - image: ${{ needs.set-image.outputs.IMAGE }} - permissions: - contents: write - pull-requests: write - steps: - - name: Download repo - uses: actions/checkout@v4 - - name: Install gh cli - id: gh - uses: ./.github/actions/set-up-gh - with: - pr-number: ${{ inputs.pr }} - GH_TOKEN: ${{ github.token }} - - name: Run bench - run: | - "./scripts/bench.sh" "${{ inputs.benchmark }}" --runtime "${{ inputs.runtime }}" --pallet "${{ inputs.pallet }}" --target_dir "${{ inputs.target_dir }}" --subcommand "${{ inputs.subcommand }}" --runtime_dir "${{ inputs.runtime_dir }}" - - name: Report failure - if: ${{ failure() }} - run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} - - run: git pull --rebase - - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: cmd-action - ${{ github.workflow }} - branch: ${{ steps.gh.outputs.branch }} - - name: Report succeed - run: gh pr comment ${{ inputs.pr }} --body "

Action completed πŸŽ‰πŸŽ‰

Run by @${{ github.actor }} for ${{ github.workflow }} completed πŸŽ‰. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/command-fmt.yml b/.github/workflows/command-fmt.yml deleted file mode 100644 index fc37a17ac549b..0000000000000 --- a/.github/workflows/command-fmt.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: Command FMT - -on: - workflow_dispatch: - inputs: - pr: - description: Number of the Pull Request - required: true - -jobs: - set-image: - runs-on: ubuntu-latest - outputs: - IMAGE: ${{ steps.set_image.outputs.IMAGE }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - id: set_image - run: cat .github/env >> $GITHUB_OUTPUT - cmd-fmt: - needs: [set-image] - runs-on: ubuntu-latest - timeout-minutes: 20 - container: - image: ${{ needs.set-image.outputs.IMAGE }} - permissions: - contents: write - pull-requests: write - steps: - - name: Download repo - uses: actions/checkout@v4 - - name: Install gh cli - id: gh - uses: ./.github/actions/set-up-gh - with: - pr-number: ${{ inputs.pr }} - GH_TOKEN: ${{ github.token }} - - name: Run FMT - run: | - cargo --version - rustc --version - cargo +nightly --version - rustc +nightly --version - - cargo +nightly fmt - - # format toml. - # since paritytech/ci-unified:bullseye-1.73.0-2023-11-01-v20231204 includes taplo-cli - taplo format --config .config/taplo.toml - - name: Report failure - if: ${{ failure() }} - run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} - - run: git pull --rebase - - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: cmd-action - ${{ github.workflow }} - branch: ${{ steps.gh.outputs.branch }} - - name: Report succeed - run: gh pr comment ${{ inputs.pr }} --body "

Action completed πŸŽ‰πŸŽ‰

Run by @${{ github.actor }} for ${{ github.workflow }} completed πŸŽ‰. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/command-inform.yml b/.github/workflows/command-inform.yml deleted file mode 100644 index afdcf4c1b7b90..0000000000000 --- a/.github/workflows/command-inform.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Inform of new command action - -on: - issue_comment: - types: [created] - -jobs: - comment: - runs-on: ubuntu-latest - # Temporary disable the bot until the new command bot works properly - if: github.event.issue.pull_request && startsWith(github.event.comment.body, 'bot ') && false - steps: - - name: Inform that the new command exist - uses: actions/github-script@v7 - with: - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: 'We are migrating the command bot to be a GitHub Action

Please, see the documentation on how to use it' - }) diff --git a/.github/workflows/command-prdoc.yml b/.github/workflows/command-prdoc.yml deleted file mode 100644 index 3a08b9a5fb286..0000000000000 --- a/.github/workflows/command-prdoc.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: Command PrDoc - -on: - workflow_dispatch: - inputs: - pr: - type: number - description: Number of the Pull Request - required: true - bump: - type: choice - description: Default bump level for all crates - default: "TODO" - required: true - options: - - "TODO" - - "no change" - - "patch" - - "minor" - - "major" - audience: - type: choice - description: Audience of the PrDoc - default: "TODO" - required: true - options: - - "TODO" - - "Runtime Dev" - - "Runtime User" - - "Node Dev" - - "Node User" - overwrite: - type: choice - description: Overwrite existing PrDoc - default: "true" - required: true - options: - - "true" - - "false" - -concurrency: - group: command-prdoc - cancel-in-progress: true - -jobs: - set-image: - runs-on: ubuntu-latest - outputs: - IMAGE: ${{ steps.set_image.outputs.IMAGE }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - id: set_image - run: cat .github/env >> $GITHUB_OUTPUT - cmd-prdoc: - needs: [set-image] - runs-on: ubuntu-latest - timeout-minutes: 20 - container: - image: ${{ needs.set-image.outputs.IMAGE }} - permissions: - contents: write - pull-requests: write - steps: - - name: Download repo - uses: actions/checkout@v4 - - name: Install gh cli - id: gh - uses: ./.github/actions/set-up-gh - with: - pr-number: ${{ inputs.pr }} - GH_TOKEN: ${{ github.token }} - - name: Generate PrDoc - run: | - python3 -m pip install -q cargo-workspace PyGithub whatthepatch pyyaml toml - - python3 .github/scripts/generate-prdoc.py --pr "${{ inputs.pr }}" --bump "${{ inputs.bump }}" --audience "${{ inputs.audience }}" --force "${{ inputs.overwrite }}" - - - name: Report failure - if: ${{ failure() }} - run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} - - name: Push Commit - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: Add PrDoc (auto generated) - branch: ${{ steps.gh.outputs.branch }} - file_pattern: 'prdoc/*.prdoc' diff --git a/.github/workflows/command-sync.yml b/.github/workflows/command-sync.yml deleted file mode 100644 index c610f4066a873..0000000000000 --- a/.github/workflows/command-sync.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Command Sync - -on: - workflow_dispatch: - inputs: - pr: - description: Number of the Pull Request - required: true - chain: - description: Chain - type: choice - required: true - options: - - westend - - rococo - sync-type: - description: Sync type - type: choice - required: true - options: - - warp - - full - - fast - - fast-unsafe - -jobs: - set-image: - runs-on: ubuntu-latest - outputs: - IMAGE: ${{ steps.set_image.outputs.IMAGE }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - id: set_image - run: cat .github/env >> $GITHUB_OUTPUT - cmd-sync: - needs: [set-image] - runs-on: arc-runners-polkadot-sdk-warpsync - container: - image: ${{ needs.set-image.outputs.IMAGE }} - permissions: - contents: write - pull-requests: write - steps: - - name: Download repo - uses: actions/checkout@v4 - - name: Install gh cli - id: gh - uses: ./.github/actions/set-up-gh - with: - pr-number: ${{ inputs.pr }} - GH_TOKEN: ${{ github.token }} - - name: Run sync - run: | - "./scripts/sync.sh" --chain "${{ inputs.chain }}" --type "${{ inputs.sync-type }}" - - name: Report failure - if: ${{ failure() }} - run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} - - run: git pull --rebase - - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: cmd-action - ${{ github.workflow }} - branch: ${{ steps.gh.outputs.branch }} - - name: Report succeed - run: gh pr comment ${{ inputs.pr }} --body "

Action completed πŸŽ‰πŸŽ‰

Run by @${{ github.actor }} for ${{ github.workflow }} completed πŸŽ‰. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/command-update-ui.yml b/.github/workflows/command-update-ui.yml deleted file mode 100644 index 860177adc8790..0000000000000 --- a/.github/workflows/command-update-ui.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Command Update UI - -on: - workflow_dispatch: - inputs: - pr: - description: Number of the Pull Request - required: true - rust-version: - description: Version of rust. Example 1.70 - required: false - -jobs: - set-image: - runs-on: ubuntu-latest - outputs: - IMAGE: ${{ steps.set_image.outputs.IMAGE }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - id: set_image - run: cat .github/env >> $GITHUB_OUTPUT - cmd-update-ui: - needs: [set-image] - runs-on: arc-runners-polkadot-sdk-beefy - timeout-minutes: 90 - container: - image: ${{ needs.set-image.outputs.IMAGE }} - permissions: - contents: write - pull-requests: write - steps: - - name: Download repo - uses: actions/checkout@v4 - - name: Install gh cli - id: gh - uses: ./.github/actions/set-up-gh - with: - pr-number: ${{ inputs.pr }} - GH_TOKEN: ${{ github.token }} - - name: Run update-ui - run: | - "./scripts/update-ui-tests.sh" "${{ inputs.rust-version }}" - - name: Report failure - if: ${{ failure() }} - run: gh pr comment ${{ inputs.pr }} --body "

Command failed ❌

Run by @${{ github.actor }} for ${{ github.workflow }} failed. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} - - run: git pull --rebase - - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: cmd-action - ${{ github.workflow }} - branch: ${{ steps.gh.outputs.branch }} - - name: Report succeed - run: gh pr comment ${{ inputs.pr }} --body "

Action completed πŸŽ‰πŸŽ‰

Run by @${{ github.actor }} for ${{ github.workflow }} completed πŸŽ‰. See logs here." - env: - RUN: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} - GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/review-bot.yml b/.github/workflows/review-bot.yml index 80c96b0ef537f..3dd5b1114813d 100644 --- a/.github/workflows/review-bot.yml +++ b/.github/workflows/review-bot.yml @@ -15,7 +15,6 @@ on: jobs: review-approvals: runs-on: ubuntu-latest - environment: master steps: - name: Generate token id: app_token diff --git a/.github/workflows/runtimes-matrix.json b/.github/workflows/runtimes-matrix.json index a7131e4dd1a94..45a3acd3f166d 100644 --- a/.github/workflows/runtimes-matrix.json +++ b/.github/workflows/runtimes-matrix.json @@ -1,16 +1,23 @@ [ + { + "name": "dev", + "package": "kitchensink-runtime", + "path": "substrate/frame", + "uri": null, + "is_relay": false + }, { "name": "westend", "package": "westend-runtime", "path": "polkadot/runtime/westend", - "uri": "wss://westend-try-runtime-node.parity-chains.parity.io:443", + "uri": "wss://try-runtime-westend.polkadot.io:443", "is_relay": true }, { "name": "rococo", "package": "rococo-runtime", "path": "polkadot/runtime/rococo", - "uri": "wss://rococo-try-runtime-node.parity-chains.parity.io:443", + "uri": "wss://try-runtime-rococo.polkadot.io:443", "is_relay": true }, { @@ -45,7 +52,7 @@ "name": "collectives-westend", "package": "collectives-westend-runtime", "path": "cumulus/parachains/runtimes/collectives/collectives-westend", - "uri": "wss://westend-collectives-rpc.polkadot.io:443", + "uri": "wss://westend-collectives-rpc.polkadot.io:443" }, { "name": "contracts-rococo", diff --git a/.gitignore b/.gitignore index e3e382af6195e..0263626d832df 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ **/node_modules **/target/ **/wip/*.stderr +**/__pycache__/ /.cargo/config /.envrc artifacts diff --git a/docs/contributor/CONTRIBUTING.md b/docs/contributor/CONTRIBUTING.md index 2e2d7a7fb4f7c..0a9aec9e1f788 100644 --- a/docs/contributor/CONTRIBUTING.md +++ b/docs/contributor/CONTRIBUTING.md @@ -161,11 +161,9 @@ test output there is a script * `./scripts/update-ui-tests.sh` to update the tests for a current rust version locally * `./scripts/update-ui-tests.sh 1.70` # to update the tests for a specific rust version locally -Or if you have opened PR and you're member of `paritytech` - you can use command-bot to run the tests for you in CI: -* `bot update-ui` - will run the tests for the current rust version -* `bot update-ui latest --rust_version=1.70.0` - will run the tests for the specified rust version -* `bot update-ui latest -v CMD_IMAGE=paritytech/ci-unified:bullseye-1.70.0-2023-05-23 --rust_version=1.70.0` - will run -the tests for the specified rust version and specified image +Or if you have opened PR and you're member of `paritytech` - you can use [/cmd](./commands-readme.md) to run the tests for you in CI: +* `/cmd update-ui` - will run the tests for the current rust version +* `/cmd update-ui --image docker.io/paritytech/ci-unified:bullseye-1.70.0-2023-05-23` - will run the tests for the specified rust version and specified image ## Feature Propagation @@ -175,7 +173,7 @@ We use [zepter](https://github.com/ggwpez/zepter) to enforce features are propag If you're member of **paritytech** org - you can use command-bot to run various of common commands in CI: -Start with comment in PR: `bot help` to see the list of available commands. +Start with comment in PR: `/cmd --help` to see the list of available commands. ## Deprecating code diff --git a/docs/contributor/commands-readme.md b/docs/contributor/commands-readme.md new file mode 100644 index 0000000000000..7c90b26972ae2 --- /dev/null +++ b/docs/contributor/commands-readme.md @@ -0,0 +1,32 @@ +# Running Commands in PRs + +You can run commands in PRs by triggering it via comment. It will use the context of your PR and post the results back. + +## Usage + +`/cmd --help` to see all available commands and usage format + +`/cmd --help` to see the usage of a specific command + + +### Commands + +- `/cmd fmt` to format the code in the PR. It commits back with the formatted code (fmt) and configs (taplo). + +- `/cmd bench` to generate weights for a runtime. Read more about [Weight Generation](weight-generation.md) + +### Flags + +1.`--quiet` to suppress the output of the command in the comments. +By default, the Start and End/Failure of the command will be commented with the link to a pipeline. +If you want to avoid, use this flag. Go to [Action Tab](https://github.com/paritytech/polkadot-sdk/actions/workflows/cmd.yml) to see the pipeline status. + +2.`--continue-on-fail` to continue running the command even if something inside a command (like specific pallet weight generation) are failed. +Basically avoids interruption in the middle with `exit 1` +The pipeline logs will include what is failed (like which runtimes/pallets), then you can re-run them separately or not. + +3.`--clean` to clean up all yours and bot's comments in PR relevant to `/cmd` commands. If you run too many commands, or they keep failing, and you're rerunning them again, it's handy to add this flag to keep a PR clean. + +### Adding new Commands +Feel free to add new commands to the workflow, however **_note_** that triggered workflows will use the actions from `main` (default) branch, meaning they will take effect only after the PR with new changes/command is merged. +If you want to test the new command, it's better to test in your fork and local-to-fork PRs, where you control the default branch. diff --git a/docs/contributor/weight-generation.md b/docs/contributor/weight-generation.md new file mode 100644 index 0000000000000..70d371ed7d94d --- /dev/null +++ b/docs/contributor/weight-generation.md @@ -0,0 +1,55 @@ +# Weight Generation + +To generate weights for a runtime. +Weights generation is using self-hosted runner which is provided by Parity CI, the rest commands are using standard GitHub runners on `ubuntu-latest` or `ubuntu-20.04`. +Self-hosted runner for benchmarks (arc-runners-polkadot-sdk-benchmark) is configured to meet requirements of reference hardware for running validators https://wiki.polkadot.network/docs/maintain-guides-how-to-validate-polkadot#reference-hardware + +In a PR run the actions through comment: + +```sh +/cmd bench --help # outputs the actual usage documentation with examples and supported runtimes + +# or + +/cmd --help # to see all available commands +``` + +To regenerate all weights (however it will take long, so don't do it unless you really need it), run the following command: +```sh +/cmd bench +``` + +To generate weights for all pallets in a particular runtime(s), run the following command: +```sh +/cmd bench --runtime kusama polkadot +``` + +For substrate pallets (supports sub-modules too): +```sh +/cmd bench --runtime dev --pallet pallet_asset_conversion_ops +``` + +> **πŸ“ Note**: The action is not being run right-away, it will be queued and run in the next available runner. So might be quick, but might also take up to 10 mins (That's in control of Github). +Once the action is run, you'll see reaction πŸ‘€ on original comment, and if you didn't pass `--quiet` - it will also send a link to a pipeline when started, and link to whole workflow when finished. + +> **πŸ’‘Hint #1** : if you run all runtimes or all pallets, it might be that some pallet in the middle is failed to generate weights, thus it stops (fails) the whole pipeline. +> If you want, you can make it to continue running, even if some pallets are failed, add `--continue-on-fail` flag to the command. The report will include which runtimes/pallets have failed, then you can re-run them separately after all is done. + +This way it runs all possible runtimes for the specified pallets, if it finds them in the runtime +```sh +/cmd bench --pallet pallet_balances pallet_xcm_benchmarks::generic pallet_xcm_benchmarks::fungible +``` + +If you want to run all specific pallet(s) for specific runtime(s), you can do it like this: +```sh +/cmd bench --runtime bridge-hub-polkadot --pallet pallet_xcm_benchmarks::generic pallet_xcm_benchmarks::fungible +``` + + +> **πŸ’‘Hint #2** : Sometimes when you run too many commands, or they keep failing and you're rerunning them again, it's handy to add `--clean` flag to the command. This will clean up all yours and bot's comments in PR relevant to /cmd commands. + +```sh +/cmd bench --runtime kusama polkadot --pallet=pallet_balances --clean --continue-on-fail +``` + +> **πŸ’‘Hint #3** : If you have questions or need help, feel free to tag @paritytech/opstooling (in github comments) or ping in [matrix](https://matrix.to/#/#command-bot:parity.io) channel. \ No newline at end of file diff --git a/scripts/bench-all.sh b/scripts/bench-all.sh deleted file mode 100755 index e5512e26bbad7..0000000000000 --- a/scripts/bench-all.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -set -eu -o pipefail -shopt -s inherit_errexit -shopt -s globstar - -. "$(realpath "$(dirname "${BASH_SOURCE[0]}")/command-utils.sh")" - -get_arg optional --pallet "$@" -PALLET="${out:-""}" - -if [[ ! -z "$PALLET" ]]; then - . "$(dirname "${BASH_SOURCE[0]}")/lib/bench-all-pallet.sh" "$@" -else - . "$(dirname "${BASH_SOURCE[0]}")/bench.sh" --subcommand=all "$@" -fi diff --git a/scripts/bench.sh b/scripts/bench.sh deleted file mode 100755 index 2f4ef7ec6a141..0000000000000 --- a/scripts/bench.sh +++ /dev/null @@ -1,117 +0,0 @@ -#!/bin/bash -# Initially based on https://github.com/paritytech/bench-bot/blob/cd3b2943d911ae29e41fe6204788ef99c19412c3/bench.js - -# Most external variables used in this script, such as $GH_CONTRIBUTOR, are -# related to https://github.com/paritytech/try-runtime-bot - -# This script relies on $GITHUB_TOKEN which is probably a protected GitLab CI -# variable; if this assumption holds true, it is implied that this script should -# be ran only on protected pipelines - -set -eu -o pipefail -shopt -s inherit_errexit - -# realpath allows to reuse the current -BENCH_ROOT_DIR=$(realpath "$(dirname "${BASH_SOURCE[0]}")") - -. "$(realpath "$(dirname "${BASH_SOURCE[0]}")/command-utils.sh")" - -repository_name="$(basename "$PWD")" - -get_arg optional --target_dir "$@" -target_dir="${out:-""}" - -get_arg optional --noexit "$@" -noexit="${out:-""}" - -output_path="." - -profile="production" - -if [[ "$repository_name" == "polkadot-sdk" ]]; then - output_path="./$target_dir" -fi - -cargo_run_benchmarks="cargo run --quiet --profile=${profile}" - -echo "Repository: $repository_name" -echo "Target Dir: $target_dir" -echo "Output Path: $output_path" - -cargo_run() { - echo "Running $cargo_run_benchmarks" "${args[@]}" - - # if not patched with PATCH_something=123 then use --locked - if [[ -z "${BENCH_PATCHED:-}" ]]; then - cargo_run_benchmarks+=" --locked" - fi - - $cargo_run_benchmarks "${args[@]}" -} - - -main() { - - # Remove the "github" remote since the same repository might be reused by a - # GitLab runner, therefore the remote might already exist from a previous run - # in case it was not cleaned up properly for some reason - &>/dev/null git remote remove github || : - - tmp_dirs=() - cleanup() { - exit_code=$? - # Clean up the "github" remote at the end since it contains the - # $GITHUB_TOKEN secret, which is only available for protected pipelines on - # GitLab - &>/dev/null git remote remove github || : - rm -rf "${tmp_dirs[@]}" - echo "Done, exit: $exit_code" - exit $exit_code - } - - # avoid exit if --noexit is passed - if [ -z "$noexit" ]; then - trap cleanup EXIT - fi - - # set -x - - get_arg required --subcommand "$@" - local subcommand="${out:-""}" - - case "$subcommand" in - runtime|pallet|xcm) - echo 'Running bench_pallet' - . "$BENCH_ROOT_DIR/lib/bench-pallet.sh" "$@" - ;; - overhead) - echo 'Running bench_overhead' - . "$BENCH_ROOT_DIR/lib/bench-overhead.sh" "$@" - ;; - all) - echo "Running all-$target_dir" - . "$BENCH_ROOT_DIR/lib/bench-all-${target_dir}.sh" "$@" - ;; - *) - die "Invalid subcommand $subcommand to process_args" - ;; - esac - - # set +x - - # in case we used diener to patch some dependency during benchmark execution, - # revert the patches so that they're not included in the diff - git checkout --quiet HEAD Cargo.toml - - # Save the generated weights to GitLab artifacts in case commit+push fails - echo "Showing weights diff for command" - git diff -P | tee -a "${ARTIFACTS_DIR}/weights.patch" - echo "Wrote weights patch to \"${ARTIFACTS_DIR}/weights.patch\"" - - - # instead of using `cargo run --locked`, we allow the Cargo files to be updated - # but avoid committing them. It is so `cmd_runner_apply_patches` can work - git restore --staged Cargo.* -} - -main "$@" diff --git a/scripts/command-utils.sh b/scripts/command-utils.sh deleted file mode 100644 index 252e4c86480e6..0000000000000 --- a/scripts/command-utils.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env bash - -if [ "${LOADED_UTILS_SH:-}" ]; then - return -else - export LOADED_UTILS_SH=true -fi - -export ARTIFACTS_DIR="$PWD/.git/.artifacts" - -die() { - if [ "${1:-}" ]; then - >&2 echo "$1" - fi - exit 1 -} - -get_arg() { - local arg_type="$1" - shift - - local is_required - case "$arg_type" in - required|required-many) - is_required=true - ;; - optional|optional-many) ;; - *) - die "Invalid is_required argument \"$2\" in get_arg" - ;; - esac - - local has_many_values - if [ "${arg_type: -6}" == "-many" ]; then - has_many_values=true - fi - - local option_arg="$1" - shift - - local args=("$@") - - unset out - out=() - - local get_next_arg - for arg in "${args[@]}"; do - if [ "${get_next_arg:-}" ]; then - out+=("$arg") - unset get_next_arg - if [ ! "${has_many_values:-}" ]; then - break - fi - # --foo=bar (get the value after '=') - elif [ "${arg:0:$(( ${#option_arg} + 1 ))}" == "$option_arg=" ]; then - out+=("${arg:$(( ${#option_arg} + 1 ))}") - if [ ! "${has_many_values:-}" ]; then - break - fi - # --foo bar (get the next argument) - elif [ "$arg" == "$option_arg" ]; then - get_next_arg=true - fi - done - - # arg list ended with --something but no argument was provided next - if [ "${get_next_arg:-}" ]; then - die "Expected argument after \"${args[-1]}"\" - fi - - if [ "${out[0]:-}" ]; then - if [ ! "${has_many_values:-}" ]; then - out="${out[0]}" - fi - elif [ "${is_required:-}" ]; then - die "Argument $option_arg is required, but was not found" - else - unset out - fi -} diff --git a/scripts/lib/bench-all-cumulus.sh b/scripts/lib/bench-all-cumulus.sh deleted file mode 100755 index f4c2a35c6b6b7..0000000000000 --- a/scripts/lib/bench-all-cumulus.sh +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/env bash -# originally moved from https://github.com/paritytech/cumulus/blob/445f9277ab55b4d930ced4fbbb38d27c617c6658/scripts/benchmarks-ci.sh - -# default RUST_LOG is warn, but could be overridden -export RUST_LOG="${RUST_LOG:-error}" - -THIS_DIR=$(dirname "${BASH_SOURCE[0]}") -. "$THIS_DIR/../command-utils.sh" - -POLKADOT_PARACHAIN="./target/$profile/polkadot-parachain" - -run_cumulus_bench() { - local artifactsDir="$ARTIFACTS_DIR" - local category=$1 - local runtimeName=$2 - local paraId=${3:-} - - local benchmarkOutput="$output_path/parachains/runtimes/$category/$runtimeName/src/weights" - local benchmarkRuntimeChain - if [[ ! -z "$paraId" ]]; then - benchmarkRuntimeChain="${runtimeName}-dev-$paraId" - else - benchmarkRuntimeChain="$runtimeName-dev" - fi - - local benchmarkMetadataOutputDir="$artifactsDir/$runtimeName" - mkdir -p "$benchmarkMetadataOutputDir" - - # Load all pallet names in an array. - echo "[+] Listing pallets for runtime $runtimeName for chain: $benchmarkRuntimeChain ..." - local pallets=($( - $POLKADOT_PARACHAIN benchmark pallet --list --chain="${benchmarkRuntimeChain}" |\ - tail -n+2 |\ - cut -d',' -f1 |\ - sort |\ - uniq - )) - - if [ ${#pallets[@]} -ne 0 ]; then - echo "[+] Benchmarking ${#pallets[@]} pallets for runtime $runtimeName for chain: $benchmarkRuntimeChain, pallets:" - for pallet in "${pallets[@]}"; do - echo " [+] $pallet" - done - else - echo "$runtimeName pallet list not found in benchmarks-ci.sh" - exit 1 - fi - - for pallet in "${pallets[@]}"; do - # (by default) do not choose output_file, like `pallet_assets.rs` because it does not work for multiple instances - # `benchmark pallet` command will decide the output_file name if there are multiple instances - local output_file="" - local extra_args="" - # a little hack for pallet_xcm_benchmarks - we want to force custom implementation for XcmWeightInfo - if [[ "$pallet" == "pallet_xcm_benchmarks::generic" ]] || [[ "$pallet" == "pallet_xcm_benchmarks::fungible" ]]; then - output_file="xcm/${pallet//::/_}.rs" - extra_args="--template=$output_path/templates/xcm-bench-template.hbs" - fi - $POLKADOT_PARACHAIN benchmark pallet \ - $extra_args \ - --chain="${benchmarkRuntimeChain}" \ - --wasm-execution=compiled \ - --pallet="$pallet" \ - --no-storage-info \ - --no-median-slopes \ - --no-min-squares \ - --extrinsic='*' \ - --steps=50 \ - --repeat=20 \ - --json \ - --header="$output_path/file_header.txt" \ - --output="${benchmarkOutput}/${output_file}" >> "$benchmarkMetadataOutputDir/${pallet//::/_}_benchmark.json" - done -} - - -echo "[+] Compiling benchmarks..." -cargo build --profile $profile --locked --features=runtime-benchmarks -p polkadot-parachain-bin - -# Run benchmarks for all pallets of a given runtime if runtime argument provided -get_arg optional --runtime "$@" -runtime="${out:-""}" - -if [[ $runtime ]]; then - paraId="" - case "$runtime" in - asset-*) - category="assets" - ;; - collectives-*) - category="collectives" - ;; - coretime-*) - category="coretime" - ;; - bridge-*) - category="bridge-hubs" - ;; - contracts-*) - category="contracts" - ;; - people-*) - category="people" - ;; - glutton-*) - category="glutton" - paraId="1300" - ;; - *) - echo "Unknown runtime: $runtime" - exit 1 - ;; - esac - - run_cumulus_bench $category $runtime $paraId - -else # run all - # Assets - run_cumulus_bench assets asset-hub-rococo - run_cumulus_bench assets asset-hub-westend - - # Collectives - run_cumulus_bench collectives collectives-westend - - # Coretime - run_cumulus_bench coretime coretime-rococo - run_cumulus_bench coretime coretime-westend - - # People - run_cumulus_bench people people-rococo - run_cumulus_bench people people-westend - - # Bridge Hubs - run_cumulus_bench bridge-hubs bridge-hub-rococo - run_cumulus_bench bridge-hubs bridge-hub-westend - - # Glutton - run_cumulus_bench glutton glutton-westend 1300 -fi diff --git a/scripts/lib/bench-all-pallet.sh b/scripts/lib/bench-all-pallet.sh deleted file mode 100644 index e6908045ddbd7..0000000000000 --- a/scripts/lib/bench-all-pallet.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env bash - -set -eu -o pipefail -shopt -s inherit_errexit -shopt -s globstar - -. "$(dirname "${BASH_SOURCE[0]}")/../command-utils.sh" - -get_arg required --pallet "$@" -PALLET="${out:-""}" - -REPO_NAME="$(basename "$PWD")" -BASE_COMMAND="$(dirname "${BASH_SOURCE[0]}")/../../bench/bench.sh --noexit=true --subcommand=pallet" - -WEIGHT_FILE_PATHS=( $(find . -type f -name "${PALLET}.rs" -path "**/weights/*" | sed 's|^\./||g') ) - -# convert pallet_ranked_collective to ranked-collective -CLEAN_PALLET=$(echo $PALLET | sed 's/pallet_//g' | sed 's/_/-/g') - -# add substrate pallet weights to a list -SUBSTRATE_PALLET_PATH=$(ls substrate/frame/$CLEAN_PALLET/src/weights.rs || :) -if [ ! -z "${SUBSTRATE_PALLET_PATH}" ]; then - WEIGHT_FILE_PATHS+=("$SUBSTRATE_PALLET_PATH") -fi - -# add trappist pallet weights to a list -TRAPPIST_PALLET_PATH=$(ls pallet/$CLEAN_PALLET/src/weights.rs || :) -if [ ! -z "${TRAPPIST_PALLET_PATH}" ]; then - WEIGHT_FILE_PATHS+=("$TRAPPIST_PALLET_PATH") -fi - -COMMANDS=() - -if [ "${#WEIGHT_FILE_PATHS[@]}" -eq 0 ]; then - echo "No weights files found for pallet: $PALLET" - exit 1 -else - echo "Found weights files for pallet: $PALLET" -fi - -for f in ${WEIGHT_FILE_PATHS[@]}; do - echo "- $f" - # f examples: - # cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_balances.rs - # polkadot/runtime/rococo/src/weights/pallet_balances.rs - # runtime/trappist/src/weights/pallet_assets.rs - TARGET_DIR=$(echo $f | cut -d'/' -f 1) - - if [ "$REPO_NAME" == "polkadot-sdk" ]; then - case $TARGET_DIR in - cumulus) - TYPE=$(echo $f | cut -d'/' -f 2) - # Example: cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_balances.rs - if [ "$TYPE" == "parachains" ]; then - RUNTIME=$(echo $f | cut -d'/' -f 5) - RUNTIME_DIR=$(echo $f | cut -d'/' -f 4) - COMMANDS+=("$BASE_COMMAND --runtime=$RUNTIME --runtime_dir=$RUNTIME_DIR --target_dir=$TARGET_DIR --pallet=$PALLET") - fi - ;; - polkadot) - # Example: polkadot/runtime/rococo/src/weights/pallet_balances.rs - RUNTIME=$(echo $f | cut -d'/' -f 3) - COMMANDS+=("$BASE_COMMAND --runtime=$RUNTIME --target_dir=$TARGET_DIR --pallet=$PALLET") - ;; - substrate) - # Example: substrate/frame/contracts/src/weights.rs - COMMANDS+=("$BASE_COMMAND --target_dir=$TARGET_DIR --runtime=dev --pallet=$PALLET") - ;; - *) - echo "Unknown dir: $TARGET_DIR" - exit 1 - ;; - esac - fi - - if [ "$REPO_NAME" == "trappist" ]; then - case $TARGET_DIR in - runtime) - TYPE=$(echo $f | cut -d'/' -f 2) - if [ "$TYPE" == "trappist" || "$TYPE" == "stout" ]; then - # Example: runtime/trappist/src/weights/pallet_assets.rs - COMMANDS+=("$BASE_COMMAND --target_dir=trappist --runtime=$TYPE --pallet=$PALLET") - fi - ;; - *) - echo "Unknown dir: $TARGET_DIR" - exit 1 - ;; - esac - fi -done - -for cmd in "${COMMANDS[@]}"; do - echo "Running command: $cmd" - . $cmd -done diff --git a/scripts/lib/bench-all-polkadot.sh b/scripts/lib/bench-all-polkadot.sh deleted file mode 100644 index ac52e00140e38..0000000000000 --- a/scripts/lib/bench-all-polkadot.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash - -# Runs all benchmarks for all pallets, for a given runtime, provided by $1 -# Should be run on a reference machine to gain accurate benchmarks -# current reference machine: https://github.com/paritytech/polkadot/pull/6508/files -# original source: https://github.com/paritytech/polkadot/blob/b9842c4b52f6791fef6c11ecd020b22fe614f041/scripts/run_all_benches.sh - -get_arg required --runtime "$@" -runtime="${out:-""}" - -# default RUST_LOG is error, but could be overridden -export RUST_LOG="${RUST_LOG:-error}" - -echo "[+] Compiling benchmarks..." -cargo build --profile $profile --locked --features=runtime-benchmarks -p polkadot - -POLKADOT_BIN="./target/$profile/polkadot" - -# Update the block and extrinsic overhead weights. -echo "[+] Benchmarking block and extrinsic overheads..." -OUTPUT=$( - $POLKADOT_BIN benchmark overhead \ - --chain="${runtime}-dev" \ - --wasm-execution=compiled \ - --weight-path="$output_path/runtime/${runtime}/constants/src/weights/" \ - --warmup=10 \ - --repeat=100 \ - --header="$output_path/file_header.txt" -) -if [ $? -ne 0 ]; then - echo "$OUTPUT" >> "$ERR_FILE" - echo "[-] Failed to benchmark the block and extrinsic overheads. Error written to $ERR_FILE; continuing..." -fi - - -# Load all pallet names in an array. -PALLETS=($( - $POLKADOT_BIN benchmark pallet --list --chain="${runtime}-dev" |\ - tail -n+2 |\ - cut -d',' -f1 |\ - sort |\ - uniq -)) - -echo "[+] Benchmarking ${#PALLETS[@]} pallets for runtime $runtime" - -# Define the error file. -ERR_FILE="${ARTIFACTS_DIR}/benchmarking_errors.txt" -# Delete the error file before each run. -rm -f $ERR_FILE - -# Benchmark each pallet. -for PALLET in "${PALLETS[@]}"; do - echo "[+] Benchmarking $PALLET for $runtime"; - - output_file="" - if [[ $PALLET == *"::"* ]]; then - # translates e.g. "pallet_foo::bar" to "pallet_foo_bar" - output_file="${PALLET//::/_}.rs" - fi - - OUTPUT=$( - $POLKADOT_BIN benchmark pallet \ - --chain="${runtime}-dev" \ - --steps=50 \ - --repeat=20 \ - --no-storage-info \ - --no-median-slopes \ - --no-min-squares \ - --pallet="$PALLET" \ - --extrinsic="*" \ - --execution=wasm \ - --wasm-execution=compiled \ - --header="$output_path/file_header.txt" \ - --output="$output_path/runtime/${runtime}/src/weights/${output_file}" 2>&1 - ) - if [ $? -ne 0 ]; then - echo "$OUTPUT" >> "$ERR_FILE" - echo "[-] Failed to benchmark $PALLET. Error written to $ERR_FILE; continuing..." - fi -done - -# Check if the error file exists. -if [ -f "$ERR_FILE" ]; then - echo "[-] Some benchmarks failed. See: $ERR_FILE" -else - echo "[+] All benchmarks passed." -fi diff --git a/scripts/lib/bench-all-substrate.sh b/scripts/lib/bench-all-substrate.sh deleted file mode 100644 index eeb18cdd8bbb3..0000000000000 --- a/scripts/lib/bench-all-substrate.sh +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env bash - -# This file is part of Substrate. -# Copyright (C) 2022 Parity Technologies (UK) Ltd. -# SPDX-License-Identifier: Apache-2.0 -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This script has three parts which all use the Substrate runtime: -# - Pallet benchmarking to update the pallet weights -# - Overhead benchmarking for the Extrinsic and Block weights -# - Machine benchmarking -# -# Should be run on a reference machine to gain accurate benchmarks -# current reference machine: https://github.com/paritytech/substrate/pull/5848 - -# Original source: https://github.com/paritytech/substrate/blob/ff9921a260a67e3a71f25c8b402cd5c7da787a96/scripts/run_all_benchmarks.sh -# Fail if any sub-command in a pipe fails, not just the last one. -set -o pipefail -# Fail on undeclared variables. -set -u -# Fail if any sub-command fails. -set -e -# Fail on traps. -# set -E - -# default RUST_LOG is warn, but could be overridden -export RUST_LOG="${RUST_LOG:-error}" - -echo "[+] Compiling Substrate benchmarks..." -cargo build --profile=$profile --locked --features=runtime-benchmarks -p staging-node-cli - -# The executable to use. -SUBSTRATE="./target/$profile/substrate-node" - -# Manually exclude some pallets. -EXCLUDED_PALLETS=( - # Helper pallets - "pallet_election_provider_support_benchmarking" - # Pallets without automatic benchmarking - "pallet_babe" - "pallet_grandpa" - "pallet_mmr" - "pallet_offences" - # Only used for testing, does not need real weights. - "frame_benchmarking_pallet_pov" - "pallet_example_tasks" - "pallet_example_basic" - "pallet_example_split" - "pallet_example_kitchensink" - "pallet_example_mbm" - "tasks_example" -) - -# Load all pallet names in an array. -ALL_PALLETS=($( - $SUBSTRATE benchmark pallet --list --chain=dev |\ - tail -n+2 |\ - cut -d',' -f1 |\ - sort |\ - uniq -)) - -# Define the error file. -ERR_FILE="${ARTIFACTS_DIR}/benchmarking_errors.txt" - -# Delete the error file before each run. -rm -f "$ERR_FILE" - -mkdir -p "$(dirname "$ERR_FILE")" - -# Update the block and extrinsic overhead weights. -echo "[+] Benchmarking block and extrinsic overheads..." -OUTPUT=$( - $SUBSTRATE benchmark overhead \ - --chain=dev \ - --wasm-execution=compiled \ - --weight-path="$output_path/frame/support/src/weights/" \ - --header="$output_path/HEADER-APACHE2" \ - --warmup=10 \ - --repeat=100 2>&1 -) -if [ $? -ne 0 ]; then - echo "$OUTPUT" >> "$ERR_FILE" - echo "[-] Failed to benchmark the block and extrinsic overheads. Error written to $ERR_FILE; continuing..." -fi - -echo "[+] Benchmarking ${#ALL_PALLETS[@]} Substrate pallets and excluding ${#EXCLUDED_PALLETS[@]}." - -echo "[+] Excluded pallets ${EXCLUDED_PALLETS[@]}" -echo "[+] ------ " -echo "[+] Whole list pallets ${ALL_PALLETS[@]}" - -# Benchmark each pallet. -for PALLET in "${ALL_PALLETS[@]}"; do - FOLDER="$(echo "${PALLET#*_}" | tr '_' '-')"; - WEIGHT_FILE="$output_path/frame/${FOLDER}/src/weights.rs" - - # Skip the pallet if it is in the excluded list. - - if [[ " ${EXCLUDED_PALLETS[@]} " =~ " ${PALLET} " ]]; then - echo "[+] Skipping $PALLET as it is in the excluded list." - continue - fi - - echo "[+] Benchmarking $PALLET with weight file $WEIGHT_FILE"; - - set +e # Disable exit on error for the benchmarking of the pallets - OUTPUT=$( - $SUBSTRATE benchmark pallet \ - --chain=dev \ - --steps=50 \ - --repeat=20 \ - --pallet="$PALLET" \ - --no-storage-info \ - --no-median-slopes \ - --no-min-squares \ - --extrinsic="*" \ - --wasm-execution=compiled \ - --heap-pages=4096 \ - --output="$WEIGHT_FILE" \ - --header="$output_path/HEADER-APACHE2" \ - --template="$output_path/.maintain/frame-weight-template.hbs" 2>&1 - ) - if [ $? -ne 0 ]; then - echo -e "$PALLET: $OUTPUT\n" >> "$ERR_FILE" - echo "[-] Failed to benchmark $PALLET. Error written to $ERR_FILE; continuing..." - fi - set -e # Re-enable exit on error -done - - -# Check if the error file exists. -if [ -s "$ERR_FILE" ]; then - echo "[-] Some benchmarks failed. See: $ERR_FILE" - exit 1 -else - echo "[+] All benchmarks passed." -fi diff --git a/scripts/lib/bench-overhead.sh b/scripts/lib/bench-overhead.sh deleted file mode 100644 index c4cca8b4c128c..0000000000000 --- a/scripts/lib/bench-overhead.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -THIS_DIR=$(dirname "${BASH_SOURCE[0]}") -. "$THIS_DIR/../command-utils.sh" - -bench_overhead_common_args=( - -- - benchmark - overhead - --wasm-execution=compiled - --warmup=10 - --repeat=100 -) -bench_overhead() { - local args - case "$target_dir" in - substrate) - args=( - --bin=substrate - "${bench_overhead_common_args[@]}" - --header="$output_path/HEADER-APACHE2" - --weight-path="$output_path/frame/support/src/weights" - --chain="dev" - ) - ;; - polkadot) - get_arg required --runtime "$@" - local runtime="${out:-""}" - args=( - --bin=polkadot - "${bench_overhead_common_args[@]}" - --header="$output_path/file_header.txt" - --weight-path="$output_path/runtime/$runtime/constants/src/weights" - --chain="$runtime-dev" - ) - ;; - cumulus) - get_arg required --runtime "$@" - local runtime="${out:-""}" - args=( - -p=polkadot-parachain-bin - "${bench_overhead_common_args[@]}" - --header="$output_path/file_header.txt" - --weight-path="$output_path/parachains/runtimes/assets/$runtime/src/weights" - --chain="$runtime" - ) - ;; - trappist) - get_arg required --runtime "$@" - local runtime="${out:-""}" - args=( - "${bench_overhead_common_args[@]}" - --header="$output_path/templates/file_header.txt" - --weight-path="$output_path/runtime/$runtime/src/weights" - --chain="$runtime-dev" - ) - ;; - *) - die "Target Dir \"$target_dir\" is not supported in bench_overhead" - ;; - esac - - cargo_run "${args[@]}" -} - -bench_overhead "$@" diff --git a/scripts/lib/bench-pallet.sh b/scripts/lib/bench-pallet.sh deleted file mode 100644 index 15eac31e3a45c..0000000000000 --- a/scripts/lib/bench-pallet.sh +++ /dev/null @@ -1,178 +0,0 @@ -#!/bin/bash - -THIS_DIR=$(dirname "${BASH_SOURCE[0]}") -. "$THIS_DIR/../command-utils.sh" - -bench_pallet_common_args=( - -- - benchmark - pallet - --steps=50 - --repeat=20 - --extrinsic="*" - --wasm-execution=compiled - --heap-pages=4096 - --json-file="${ARTIFACTS_DIR}/bench.json" -) -bench_pallet() { - get_arg required --subcommand "$@" - local subcommand="${out:-""}" - - get_arg required --runtime "$@" - local runtime="${out:-""}" - - get_arg required --pallet "$@" - local pallet="${out:-""}" - - local args - case "$target_dir" in - substrate) - args=( - --features=runtime-benchmarks - --manifest-path="$output_path/bin/node/cli/Cargo.toml" - "${bench_pallet_common_args[@]}" - --pallet="$pallet" - --chain="$runtime" - ) - - case "$subcommand" in - pallet) - # Translates e.g. "pallet_foo::bar" to "pallet_foo_bar" - local output_dir="${pallet//::/_}" - - # Substrate benchmarks are output to the "frame" directory but they aren't - # named exactly after the $pallet argument. For example: - # - When $pallet == pallet_balances, the output folder is frame/balances - # - When $pallet == frame_benchmarking, the output folder is frame/benchmarking - # The common pattern we infer from those examples is that we should remove - # the prefix - if [[ "$output_dir" =~ ^[A-Za-z]*[^A-Za-z](.*)$ ]]; then - output_dir="${BASH_REMATCH[1]}" - fi - - # We also need to translate '_' to '-' due to the folders' naming - # conventions - output_dir="${output_dir//_/-}" - - args+=( - --header="$output_path/HEADER-APACHE2" - --output="$output_path/frame/$output_dir/src/weights.rs" - --template="$output_path/.maintain/frame-weight-template.hbs" - ) - ;; - *) - die "Subcommand $subcommand is not supported for $target_dir in bench_pallet" - ;; - esac - ;; - polkadot) - # For backward compatibility: replace "-dev" with "" - runtime=${runtime/-dev/} - - local weights_dir="$output_path/runtime/${runtime}/src/weights" - - args=( - --bin=polkadot - --features=runtime-benchmarks - "${bench_pallet_common_args[@]}" - --pallet="$pallet" - --chain="${runtime}-dev" - ) - - case "$subcommand" in - pallet) - args+=( - --header="$output_path/file_header.txt" - --output="${weights_dir}/" - ) - ;; - xcm) - args+=( - --header="$output_path/file_header.txt" - --template="$output_path/xcm/pallet-xcm-benchmarks/template.hbs" - --output="${weights_dir}/xcm/" - ) - ;; - *) - die "Subcommand $subcommand is not supported for $target_dir in bench_pallet" - ;; - esac - ;; - cumulus) - get_arg required --runtime_dir "$@" - local runtime_dir="${out:-""}" - local chain="$runtime" - - # to support specifying parachain id from runtime name (e.g. ["glutton-westend", "glutton-westend-dev-1300"]) - # If runtime ends with "-dev" or "-dev-\d+", leave as it is, otherwise concat "-dev" at the end of $chain - if [[ ! "$runtime" =~ -dev(-[0-9]+)?$ ]]; then - chain="${runtime}-dev" - fi - - # replace "-dev" or "-dev-\d+" with "" for runtime - runtime=$(echo "$runtime" | sed 's/-dev.*//g') - - args=( - -p=polkadot-parachain-bin - --features=runtime-benchmarks - "${bench_pallet_common_args[@]}" - --pallet="$pallet" - --chain="${chain}" - --header="$output_path/file_header.txt" - ) - - case "$subcommand" in - pallet) - args+=( - --output="$output_path/parachains/runtimes/$runtime_dir/$runtime/src/weights/" - ) - ;; - xcm) - mkdir -p "$output_path/parachains/runtimes/$runtime_dir/$runtime/src/weights/xcm" - args+=( - --template="$output_path/templates/xcm-bench-template.hbs" - --output="$output_path/parachains/runtimes/$runtime_dir/$runtime/src/weights/xcm/" - ) - ;; - *) - die "Subcommand $subcommand is not supported for $target_dir in bench_pallet" - ;; - esac - ;; - trappist) - local weights_dir="$output_path/runtime/$runtime/src/weights" - - args=( - --features=runtime-benchmarks - "${bench_pallet_common_args[@]}" - --pallet="$pallet" - --chain="${runtime}-dev" - --header="$output_path/templates/file_header.txt" - ) - - case "$subcommand" in - pallet) - args+=( - --output="${weights_dir}/" - ) - ;; - xcm) - args+=( - --template="$output_path/templates/xcm-bench-template.hbs" - --output="${weights_dir}/xcm/" - ) - ;; - *) - die "Subcommand $subcommand is not supported for $target_dir in bench_pallet" - ;; - esac - ;; - *) - die "Repository $target_dir is not supported in bench_pallet" - ;; - esac - - cargo_run "${args[@]}" -} - -bench_pallet "$@" diff --git a/scripts/sync.sh b/scripts/sync.sh deleted file mode 100755 index b5d8a52199371..0000000000000 --- a/scripts/sync.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env bash - -set -eu -o pipefail - -. "$(realpath "$(dirname "${BASH_SOURCE[0]}")/command-utils.sh")" - - -# Function to check syncing status -check_syncing() { - # Send the system_health request and parse the isSyncing field - RESPONSE=$(curl -sSX POST http://127.0.0.1:9944 \ - --header 'Content-Type: application/json' \ - --data-raw '{"jsonrpc": "2.0", "method": "system_health", "params": [], "id": "1"}') - - # Check for errors in the curl command - if [ $? -ne 0 ]; then - echo "Error: Unable to send request to Polkadot node" - fi - - IS_SYNCING=$(echo $RESPONSE | jq -r '.result.isSyncing') - - # Check for errors in the jq command or missing field in the response - if [ $? -ne 0 ] || [ "$IS_SYNCING" == "null" ]; then - echo "Error: Unable to parse sync status from response" - fi - - # Return the isSyncing value - echo $IS_SYNCING -} - -main() { - get_arg required --chain "$@" - local chain="${out:-""}" - - get_arg required --type "$@" - local type="${out:-""}" - - export RUST_LOG="${RUST_LOG:-remote-ext=debug,runtime=trace}" - - cargo build --release - - cp "./target/release/polkadot" ./polkadot-bin - - # Start sync. - # "&" runs the process in the background - # "> /dev/tty" redirects the output of the process to the terminal - ./polkadot-bin --sync="$type" --chain="$chain" > "$ARTIFACTS_DIR/sync.log" 2>&1 & - - # Get the PID of process - POLKADOT_SYNC_PID=$! - - sleep 10 - - # Poll the node every 100 seconds until syncing is complete - while :; do - SYNC_STATUS="$(check_syncing)" - if [ "$SYNC_STATUS" == "true" ]; then - echo "Node is still syncing..." - sleep 100 - elif [ "$SYNC_STATUS" == "false" ]; then - echo "Node sync is complete!" - kill "$POLKADOT_SYNC_PID" # Stop the Polkadot node process once syncing is complete - exit 0 # Success - elif [[ "$SYNC_STATUS" = Error:* ]]; then - echo "$SYNC_STATUS" - exit 1 # Error - else - echo "Unknown error: $SYNC_STATUS" - exit 1 # Unknown error - fi - done -} - -main "$@" diff --git a/scripts/update-ui-tests.sh b/scripts/update-ui-tests.sh deleted file mode 100755 index d363e51e40414..0000000000000 --- a/scripts/update-ui-tests.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash -# Script for updating the UI tests for a new rust stable version. -# Exit on error -set -e - -# by default current rust stable will be used -RUSTUP_RUN="" -# check if we have a parameter -# ./scripts/update-ui-tests.sh 1.70 -if [ ! -z "$1" ]; then - echo "RUST_VERSION: $1" - # This will run all UI tests with the rust stable 1.70. - # The script requires that rustup is installed. - RUST_VERSION=$1 - RUSTUP_RUN="rustup run $RUST_VERSION" - - - echo "installing rustup $RUST_VERSION" - if ! command -v rustup &> /dev/null - then - echo "rustup needs to be installed" - exit - fi - - rustup install $RUST_VERSION - rustup component add rust-src --toolchain $RUST_VERSION -fi - -# Ensure we run the ui tests -export RUN_UI_TESTS=1 -# We don't need any wasm files for ui tests -export SKIP_WASM_BUILD=1 -# Let trybuild overwrite the .stderr files -export TRYBUILD=overwrite - -# ./substrate -$RUSTUP_RUN cargo test --manifest-path substrate/primitives/runtime-interface/Cargo.toml ui -$RUSTUP_RUN cargo test -p sp-api-test ui -$RUSTUP_RUN cargo test -p frame-election-provider-solution-type ui -$RUSTUP_RUN cargo test -p frame-support-test --features=no-metadata-docs,try-runtime,experimental ui -$RUSTUP_RUN cargo test -p xcm-procedural ui