diff --git a/.github/workflows/check-btcli-tests.yml b/.github/workflows/check-btcli-tests.yml new file mode 100644 index 0000000..e64bc71 --- /dev/null +++ b/.github/workflows/check-btcli-tests.yml @@ -0,0 +1,255 @@ +name: Bittensor BTCLI Test + +permissions: + pull-requests: write + contents: read + +concurrency: + group: e2e-cli-${{ github.ref }} + cancel-in-progress: true + +on: + pull_request: + branches: + - main + - staging + types: [opened, synchronize, reopened, labeled, unlabeled] + +env: + CARGO_TERM_COLOR: always + VERBOSE: ${{ github.event.inputs.verbose }} + +jobs: + apply-label-to-new-pr: + runs-on: ubuntu-latest + if: ${{ github.event.pull_request.draft == false }} + outputs: + should_continue_cli: ${{ steps.check.outputs.should_continue_cli }} + steps: + - name: Check + id: check + run: | + ACTION="${{ github.event.action }}" + if [[ "$ACTION" == "opened" || "$ACTION" == "reopened" ]]; then + echo "should_continue_cli=true" >> $GITHUB_OUTPUT + else + echo "should_continue_cli=false" >> $GITHUB_OUTPUT + fi + shell: bash + + - name: Add label + if: steps.check.outputs.should_continue_cli == 'true' + uses: actions-ecosystem/action-add-labels@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + labels: run-bittensor-cli-tests + + check-labels: + needs: apply-label-to-new-pr + runs-on: ubuntu-latest + if: always() + outputs: + run-cli-tests: ${{ steps.get-labels.outputs.run-cli-tests }} + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Get labels from PR + id: get-labels + run: | + LABELS=$(gh pr view ${{ github.event.pull_request.number }} --json labels --jq '.labels[].name') + echo "Current labels: $LABELS" + if echo "$LABELS" | grep -q "run-bittensor-cli-tests"; then + echo "run-cli-tests=true" >> $GITHUB_ENV + echo "::set-output name=run-cli-tests::true" + else + echo "run-cli-tests=false" >> $GITHUB_ENV + echo "::set-output name=run-cli-tests::false" + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + find-e2e-tests: + needs: check-labels + if: always() && needs.check-labels.outputs.run-cli-tests == 'true' + runs-on: ubuntu-latest + outputs: + test-files: ${{ steps.get-tests.outputs.test-files }} + steps: + - name: Research preparation + working-directory: ${{ github.workspace }} + run: git clone https://github.com/opentensor/btcli.git + + - name: Checkout + working-directory: ${{ github.workspace }}/btcli + run: git checkout staging + + - name: Install dependencies + run: sudo apt-get install -y jq + + - name: Find e2e test files + id: get-tests + run: | + test_files=$(find ${{ github.workspace }}/btcli/tests/e2e_tests -name "test*.py" | jq -R -s -c 'split("\n") | map(select(. != ""))') + echo "::set-output name=test-files::$test_files" + shell: bash + + pull-docker-image: + needs: check-labels + runs-on: ubuntu-latest + if: always() && needs.check-labels.outputs.run-cli-tests == 'true' + steps: + - name: Log in to GitHub Container Registry + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin + + - name: Pull Docker Image + run: docker pull ghcr.io/opentensor/subtensor-localnet:latest + + - name: Save Docker Image to Cache + run: docker save -o subtensor-localnet.tar ghcr.io/opentensor/subtensor-localnet:latest + + - name: Upload Docker Image as Artifact + uses: actions/upload-artifact@v4 + with: + name: subtensor-localnet + path: subtensor-localnet.tar + + run-e2e-tests: + needs: + - check-labels + - find-e2e-tests + - pull-docker-image + + if: always() && needs.check-labels.outputs.run-cli-tests == 'true' + runs-on: ubuntu-latest + strategy: + fail-fast: false + max-parallel: 16 + matrix: + rust-branch: + - stable + rust-target: + - x86_64-unknown-linux-gnu + os: + - ubuntu-latest + test-file: ${{ fromJson(needs.find-e2e-tests.outputs.test-files) }} + + env: + RELEASE_NAME: development + RUSTV: ${{ matrix.rust-branch }} + RUST_BACKTRACE: full + RUST_BIN_DIR: target/${{ matrix.rust-target }} + TARGET: ${{ matrix.rust-target }} + + timeout-minutes: 60 + name: "e2e tests: ${{ matrix.test-file }}" + steps: + - name: Check-out repository + uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt-get update && + sudo apt-get install -y clang curl libssl-dev llvm libudev-dev protobuf-compiler + + - name: Create Python virtual environment + working-directory: ${{ github.workspace }} + run: python3 -m venv ${{ github.workspace }}/venv + + - name: Clone Bittensor CLI repo + working-directory: ${{ github.workspace }} + run: git clone https://github.com/opentensor/btcli.git + + - name: Setup Bittensor-cli from cloned repo + working-directory: ${{ github.workspace }}/btcli + run: | + source ${{ github.workspace }}/venv/bin/activate + git checkout staging + git fetch origin staging + python3 -m pip install --upgrade pip + python3 -m pip install '.[dev]' + python3 -m pip install pytest + + - name: Clone async-substrate-interface repo + run: git clone https://github.com/opentensor/async-substrate-interface.git + + - name: Checkout PR async-substrate-interface repo + working-directory: ${{ github.workspace }}/async-substrate-interface + run: | + git fetch origin ${{ github.event.pull_request.head.ref }} + git checkout ${{ github.event.pull_request.head.ref }} + echo "Current branch: $(git rev-parse --abbrev-ref HEAD)" + + - name: Install async-substrate-interface package + working-directory: ${{ github.workspace }}/async-substrate-interface + run: | + source ${{ github.workspace }}/venv/bin/activate + python3 -m pip uninstall async-substrate-interface -y + python3 -m pip install . + + - name: Download Cached Docker Image + uses: actions/download-artifact@v4 + with: + name: subtensor-localnet + + - name: Load Docker Image + run: docker load -i subtensor-localnet.tar + + - name: Run tests + run: | + source ${{ github.workspace }}/venv/bin/activate + pytest ${{ matrix.test-file }} -s + + + run-unit-test: + needs: + - check-labels + if: always() && needs.check-labels.outputs.run-cli-tests == 'true' + runs-on: ubuntu-latest + steps: + - name: Check-out repository + uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt-get update && + sudo apt-get install -y clang curl libssl-dev llvm libudev-dev protobuf-compiler + + - name: Create Python virtual environment + working-directory: ${{ github.workspace }} + run: python3 -m venv venv + + - name: Clone Bittensor CLI repo + working-directory: ${{ github.workspace }} + run: git clone https://github.com/opentensor/btcli.git + + - name: Setup Bittensor SDK from cloned repo + working-directory: ${{ github.workspace }}/btcli + run: | + source ${{ github.workspace }}/venv/bin/activate + git checkout staging + git fetch origin staging + python3 -m pip install --upgrade pip + python3 -m pip install '.[dev]' + + - name: Clone async-substrate-interface repo + run: git clone https://github.com/opentensor/async-substrate-interface.git + + - name: Checkout PR branch in async-substrate-interface repo + working-directory: ${{ github.workspace }}/async-substrate-interface + run: | + git fetch origin ${{ github.event.pull_request.head.ref }} + git checkout ${{ github.event.pull_request.head.ref }} + echo "Current branch: $(git rev-parse --abbrev-ref HEAD)" + + - name: Install /async-substrate-interface package + working-directory: ${{ github.workspace }}/async-substrate-interface + run: | + source ${{ github.workspace }}/venv/bin/activate + pip uninstall async-substrate-interface -y + pip install . + + - name: Run SDK unit tests + run: | + source ${{ github.workspace }}/venv/bin/activate + pytest ${{ github.workspace }}/btcli/tests/unit_tests \ No newline at end of file diff --git a/.github/workflows/check-sdk-tests.yml b/.github/workflows/check-sdk-tests.yml new file mode 100644 index 0000000..4bcd4ff --- /dev/null +++ b/.github/workflows/check-sdk-tests.yml @@ -0,0 +1,259 @@ +name: Bittensor SDK Test + +permissions: + pull-requests: write + contents: read + +concurrency: + group: e2e-sdk-${{ github.ref }} + cancel-in-progress: true + +on: + pull_request: + branches: + - main + - staging + types: [opened, synchronize, reopened, labeled, unlabeled] + +env: + CARGO_TERM_COLOR: always + VERBOSE: ${{ github.event.inputs.verbose }} + +jobs: + apply-label-to-new-pr: + runs-on: ubuntu-latest + if: ${{ github.event.pull_request.draft == false }} + outputs: + should_continue_sdk: ${{ steps.check.outputs.should_continue_sdk }} + steps: + - name: Check + id: check + run: | + ACTION="${{ github.event.action }}" + if [[ "$ACTION" == "opened" || "$ACTION" == "reopened" ]]; then + echo "should_continue_sdk=true" >> $GITHUB_OUTPUT + else + echo "should_continue_sdk=false" >> $GITHUB_OUTPUT + fi + shell: bash + + - name: Add label + if: steps.check.outputs.should_continue_sdk == 'true' + uses: actions-ecosystem/action-add-labels@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + labels: run-bittensor-sdk-tests + + check-labels: + needs: apply-label-to-new-pr + runs-on: ubuntu-latest + if: always() + outputs: + run-sdk-tests: ${{ steps.get-labels.outputs.run-sdk-tests }} + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Get labels from PR + id: get-labels + run: | + sleep 5 + LABELS=$(gh api repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels --jq '.[].name') + echo "Current labels: $LABELS" + if echo "$LABELS" | grep -q "run-bittensor-sdk-tests"; then + echo "run-sdk-tests=true" >> $GITHUB_OUTPUT + else + echo "run-sdk-tests=false" >> $GITHUB_OUTPUT + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + find-e2e-tests: + needs: check-labels + if: always() && needs.check-labels.outputs.run-sdk-tests == 'true' + runs-on: ubuntu-latest + outputs: + test-files: ${{ steps.get-tests.outputs.test-files }} + steps: + - name: Research preparation + working-directory: ${{ github.workspace }} + run: git clone https://github.com/opentensor/bittensor.git + + - name: Checkout + working-directory: ${{ github.workspace }}/bittensor + run: git checkout staging + + - name: Install dependencies + run: sudo apt-get install -y jq + + - name: Find e2e test files + id: get-tests + run: | + test_files=$(find ${{ github.workspace }}/bittensor/tests/e2e_tests -name "test*.py" | jq -R -s -c 'split("\n") | map(select(. != ""))') + echo "::set-output name=test-files::$test_files" + shell: bash + + pull-docker-image: + needs: check-labels + runs-on: ubuntu-latest + if: always() && needs.check-labels.outputs.run-sdk-tests == 'true' + steps: + - name: Log in to GitHub Container Registry + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin + + - name: Pull Docker Image + run: docker pull ghcr.io/opentensor/subtensor-localnet:devnet-ready + + - name: Save Docker Image to Cache + run: docker save -o subtensor-localnet.tar ghcr.io/opentensor/subtensor-localnet:devnet-ready + + - name: Upload Docker Image as Artifact + uses: actions/upload-artifact@v4 + with: + name: subtensor-localnet + path: subtensor-localnet.tar + + run-e2e-tests: + needs: + - check-labels + - find-e2e-tests + - pull-docker-image + + if: always() && needs.check-labels.outputs.run-sdk-tests == 'true' + runs-on: ubuntu-latest + strategy: + fail-fast: false + max-parallel: 16 + matrix: + rust-branch: + - stable + rust-target: + - x86_64-unknown-linux-gnu + os: + - ubuntu-latest + test-file: ${{ fromJson(needs.find-e2e-tests.outputs.test-files) }} + + env: + RELEASE_NAME: development + RUSTV: ${{ matrix.rust-branch }} + RUST_BACKTRACE: full + RUST_BIN_DIR: target/${{ matrix.rust-target }} + TARGET: ${{ matrix.rust-target }} + + timeout-minutes: 60 + name: "e2e tests: ${{ matrix.test-file }}" + steps: + - name: Check-out repository + uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt-get update && + sudo apt-get install -y clang curl libssl-dev llvm libudev-dev protobuf-compiler + + - name: Create Python virtual environment + working-directory: ${{ github.workspace }} + run: python3 -m venv ${{ github.workspace }}/venv + + - name: Clone Bittensor SDK repo + working-directory: ${{ github.workspace }} + run: git clone https://github.com/opentensor/bittensor.git + + - name: Setup Bittensor SDK from cloned repo + working-directory: ${{ github.workspace }}/bittensor + run: | + source ${{ github.workspace }}/venv/bin/activate + git checkout staging + git fetch origin staging + python3 -m pip install --upgrade pip + python3 -m pip install '.[dev]' + + - name: Clone Bittensor async-substrate-interface repo + run: git clone https://github.com/opentensor/async-substrate-interface.git + + - name: Checkout PR branch in async-substrate-interface repo + working-directory: ${{ github.workspace }}/async-substrate-interface + run: | + git fetch origin ${{ github.event.pull_request.head.ref }} + git checkout ${{ github.event.pull_request.head.ref }} + echo "Current branch: $(git rev-parse --abbrev-ref HEAD)" + + - name: Install async-substrate-interface package + working-directory: ${{ github.workspace }}/async-substrate-interface + run: | + source ${{ github.workspace }}/venv/bin/activate + python3 -m pip uninstall async-substrate-interface -y + python3 -m pip install . + + - name: Download Cached Docker Image + uses: actions/download-artifact@v4 + with: + name: subtensor-localnet + + - name: Load Docker Image + run: docker load -i subtensor-localnet.tar + + - name: Run tests + run: | + source ${{ github.workspace }}/venv/bin/activate + python3 -m pytest ${{ matrix.test-file }} -s + + + run-integration-and-unit-test: + needs: + - check-labels + if: always() && needs.check-labels.outputs.run-sdk-tests == 'true' + runs-on: ubuntu-latest + steps: + - name: Check-out repository + uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt-get update && + sudo apt-get install -y clang curl libssl-dev llvm libudev-dev protobuf-compiler + + - name: Create Python virtual environment + working-directory: ${{ github.workspace }} + run: python3 -m venv venv + + - name: Clone Bittensor SDK repo + working-directory: ${{ github.workspace }} + run: git clone https://github.com/opentensor/bittensor.git + + - name: Setup Bittensor SDK from cloned repo + working-directory: ${{ github.workspace }}/bittensor + run: | + source ${{ github.workspace }}/venv/bin/activate + git checkout staging + git fetch origin staging + python3 -m pip install --upgrade pip + python3 -m pip install '.[dev]' + python3 -m pip install -r requirements/torch.txt + + - name: Clone async-substrate-interface repo + run: git clone https://github.com/opentensor/async-substrate-interface.git + + - name: Checkout PR branch in async-substrate-interface repo + working-directory: ${{ github.workspace }}/async-substrate-interface + run: | + git fetch origin ${{ github.event.pull_request.head.ref }} + git checkout ${{ github.event.pull_request.head.ref }} + echo "Current branch: $(git rev-parse --abbrev-ref HEAD)" + + - name: Install /async-substrate-interface package + working-directory: ${{ github.workspace }}/async-substrate-interface + run: | + source ${{ github.workspace }}/venv/bin/activate + pip uninstall async-substrate-interface -y + pip install . + + - name: Run SDK integration tests + run: | + source ${{ github.workspace }}/venv/bin/activate + pytest ${{ github.workspace }}/bittensor/tests/integration_tests + + - name: Run bittensor-sdk unit tests + run: | + source ${{ github.workspace }}/venv/bin/activate + pytest ${{ github.workspace }}/bittensor/tests/unit_tests \ No newline at end of file