Skip to content

Commit

Permalink
Run TS SDK tests against local testnets built from prod branches, spl…
Browse files Browse the repository at this point in the history
…it API checks into separate job
  • Loading branch information
banool committed Jun 21, 2023
1 parent 1b7b553 commit aad288d
Show file tree
Hide file tree
Showing 7 changed files with 236 additions and 88 deletions.
37 changes: 37 additions & 0 deletions .github/actions/run-local-testnet/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: "Run Local Testnet"
description: |
Runs a local testnet from a Docker image built from a particular release branch
inputs:
IMAGE_TAG:
description: "The image tag to use for running the local testnet, e.g. devnet / testnet / mainnet or some SHA"
required: true
GCP_DOCKER_ARTIFACT_REPO:
description: "The GCP Docker artifact repository"
required: true

runs:
using: composite
steps:
# Create a directory that we'll bindmount into the container into which it can
# store all its configuration and files.
- name: Create directory for testnet files
run: mkdir -p ${{ runner.temp }}/testnet
shell: bash

# Run a local testnet. We mount in the testnet directory we just created.
- run: docker run -p 8080:8080 -p 8081:8081 -v ${{ runner.temp }}/testnet:/testnet --name=local-testnet-${{ inputs.IMAGE_TAG }} --detach ${{ inputs.GCP_DOCKER_ARTIFACT_REPO }}/tools:${{ inputs.IMAGE_TAG }} aptos node run-local-testnet --with-faucet --test-dir /testnet
shell: bash

# Wait for the node API and faucet of the local testnet to start up.
- run: npm install -g wait-on
shell: bash
- run: wait-on -t 60000 --httpTimeout 60000 http-get://127.0.0.1:8080/v1
shell: bash
- run: wait-on -t 60000 --httpTimeout 60000 http-get://127.0.0.1:8081
shell: bash

# Print the logs from the local testnet if the tests failed.
- name: Print local testnet logs if something failed
run: docker logs local-testnet-${{ inputs.IMAGE_TAG }}
shell: bash
if: ${{ failure() }}
63 changes: 63 additions & 0 deletions .github/actions/run-sdk-e2e-tests/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: "Run SDK E2E tests"
description: |
Run the SDK E2E tests against a local testnet built from a particular release branch
inputs:
NETWORK:
description: "The network to use for running the local testnet, one of devnet / testnet / mainnet"
required: true
GCP_DOCKER_ARTIFACT_REPO:
description: "The GCP Docker artifact repository"
required: true

runs:
using: composite
steps:
# Install node and pnpm.
- uses: actions/setup-node@969bd2663942d722d85b6a8626225850c2f7be4b # pin@v3
with:
node-version-file: .node-version
registry-url: "https://registry.npmjs.org"
- uses: pnpm/action-setup@537643d491d20c2712d11533497cb47b2d0eb9d5 # pin https://github.com/pnpm/action-setup/releases/tag/v2.2.3

# Set up the necessary env vars for the test suite.
- run: echo "APTOS_NODE_URL=http://127.0.0.1:8080/v1" >> .env
shell: bash
working-directory: ./ecosystem/typescript/sdk
- run: echo "APTOS_FAUCET_URL=http://127.0.0.1:8081" >> .env
shell: bash
working-directory: ./ecosystem/typescript/sdk
- run: echo "ANS_TEST_ACCOUNT_PRIVATE_KEY=0x37368b46ce665362562c6d1d4ec01a08c8644c488690df5a17e13ba163e20221" >> .env
shell: bash
working-directory: ./ecosystem/typescript/sdk
- run: echo "ANS_TEST_ACCOUNT_ADDRESS=585fc9f0f0c54183b039ffc770ca282ebd87307916c215a3e692f2f8e4305e82" >> .env
shell: bash
working-directory: ./ecosystem/typescript/sdk
- run: echo "APTOS_INVOCATION='docker run -v ${{ runner.temp }}/ans:/tmp/ans --network host ${{ inputs.GCP_DOCKER_ARTIFACT_REPO }}/tools:${{ inputs.NETWORK }} aptos'" >>.env
shell: bash
working-directory: ./ecosystem/typescript/sdk
- run: echo "ANS_REPO_LOCATION=${{ runner.temp }}/ans" >> .env
shell: bash
working-directory: ./ecosystem/typescript/sdk
- run: echo "NETWORK=${{ inputs.NETWORK }}" >> .env
shell: bash
working-directory: ./ecosystem/typescript/sdk

# Run package install. If install fails, it probably means the lockfile
# was not included in the commit.
- run: pnpm install --frozen-lockfile
shell: bash
working-directory: ./ecosystem/typescript/sdk

# Run a local testnet.
- uses: ./.github/actions/run-local-testnet
with:
IMAGE_TAG: ${{ inputs.NETWORK }}
GCP_DOCKER_ARTIFACT_REPO: ${{ inputs.GCP_DOCKER_ARTIFACT_REPO }}

# Run the TS SDK tests.
- uses: nick-fields/retry@7f8f3d9f0f62fe5925341be21c2e8314fd4f7c7c # pin@v2
name: sdk-pnpm-test
with:
max_attempts: 3
timeout_minutes: 25
command: cd ./ecosystem/typescript/sdk && pnpm run test:ci
9 changes: 5 additions & 4 deletions .github/workflows/docker-build-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ name: "Build+Test Docker Images"
on: # build on main branch OR when a PR is labeled with `CICD:build-images`
# Allow us to run this specific workflow without a PR
workflow_dispatch:
pull_request_target:
# TODO: Undo this once I can see that node-api-compatilibity-tests is working.
pull_request:
types: [labeled, opened, synchronize, reopened, auto_merge_enabled]
push:
branches:
Expand Down Expand Up @@ -182,15 +183,15 @@ jobs:
BUILD_ADDL_TESTING_IMAGES: true
TARGET_REGISTRY: ${{ needs.determine-docker-build-metadata.outputs.targetRegistry }}

sdk-release:
node-api-compatibility-tests:
needs: [permission-check, rust-images, determine-docker-build-metadata] # runs with the default release docker build variant "rust-images"
if: |
(github.event_name == 'push' && github.ref_name != 'main') ||
github.event_name == 'workflow_dispatch' ||
contains(github.event.pull_request.labels.*.name, 'CICD:run-e2e-tests') ||
github.event.pull_request.auto_merge != null ||
contains(github.event.pull_request.body, '#e2e')
uses: aptos-labs/aptos-core/.github/workflows/sdk-release.yaml@main
uses: ./.github/workflows/node-api-compatibility-tests.yaml
secrets: inherit
with:
GIT_SHA: ${{ needs.determine-docker-build-metadata.outputs.gitSha }}
Expand Down Expand Up @@ -351,6 +352,6 @@ jobs:
FORGE_TEST_SUITE: multiregion_benchmark_test
IMAGE_TAG: ${{ needs.determine-docker-build-metadata.outputs.gitSha }}
FORGE_RUNNER_DURATION_SECS: 300
COMMENT_HEADER: forge-multiregion-test
COMMENT_HEADER: forge-multiregion-test
FORGE_NAMESPACE: forge-multiregion-test-${{ needs.determine-docker-build-metadata.outputs.targetCacheId }}
FORGE_CLUSTER_NAME: forge-multiregion
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
## - Replace env.IMAGE_TAG for a known image tag
## - env.GIT_SHA will resolve to that of your PR branch

name: "API + TS SDK CI"
# These tests ensure that the Node API, the OpenAPI spec that is generated from it,
# and the TS SDK inner client that is generated from that, all match up.
name: "Node API Compatibility Tests"
on:
# This is called from within the docker-build-test.yaml workflow since we depend
# on the images having been built before this workflow runs.
Expand All @@ -22,9 +24,6 @@ on:
required: true
type: string
description: Use this to override the git SHA1, branch name (e.g. devnet) or tag to release the SDK from
pull_request:
paths:
- .github/workflows/sdk-release.yaml

env:
# This is the docker image tag that will be used for the SDK release.
Expand All @@ -36,7 +35,7 @@ jobs:
# Confirm that the generated client within the TS SDK has been re-generated
# if there are any changes that would affect it within the PR / commit. If
# everything is checked in, run tests, build the SDK, and upload it to npmjs.
test-sdk-confirm-client-generated-publish:
node-api-compatibility-tests:
runs-on: high-perf-docker
permissions:
contents: read
Expand Down Expand Up @@ -84,6 +83,7 @@ jobs:
max_attempts: 3
timeout_minutes: 20
command: docker run --rm --mount=type=bind,source=${{ runner.temp }}/specs,target=/specs ${{ secrets.GCP_DOCKER_ARTIFACT_REPO }}/tools:${IMAGE_TAG} aptos-openapi-spec-generator -f yaml -o /specs/spec.yaml

- uses: nick-fields/retry@7f8f3d9f0f62fe5925341be21c2e8314fd4f7c7c # pin@v2
name: generate-json-spec
with:
Expand All @@ -98,21 +98,6 @@ jobs:
- run: git diff --no-index --ignore-space-at-eol --ignore-blank-lines ${{ runner.temp }}/specs/spec.yaml api/doc/spec.yaml
- run: git diff --no-index --ignore-space-at-eol --ignore-blank-lines ${{ runner.temp }}/specs/spec.json api/doc/spec.json

# Set up dotenv file for tests (jest doesn't read env vars properly).
- run: echo "APTOS_NODE_URL=$APTOS_NODE_URL" >> ./ecosystem/typescript/sdk/.env
- run: echo "APTOS_FAUCET_URL=$APTOS_FAUCET_URL" >> ./ecosystem/typescript/sdk/.env
- run: echo "FAUCET_AUTH_TOKEN=$FAUCET_AUTH_TOKEN" >> ./ecosystem/typescript/sdk/.env
- run: echo "ANS_TEST_ACCOUNT_PRIVATE_KEY=$ANS_TEST_ACCOUNT_PRIVATE_KEY" >> ./ecosystem/typescript/sdk/.env
- run: echo "ANS_TEST_ACCOUNT_ADDRESS=$ANS_TEST_ACCOUNT_ADDRESS" >> ./ecosystem/typescript/sdk/.env

# These two have to be defined here and not in the env section because the runner
# context is only available here.
- run: echo "APTOS_INVOCATION='docker run -v ${{ runner.temp }}/ans:/tmp/ans --network host ${{ secrets.GCP_DOCKER_ARTIFACT_REPO }}/tools:${IMAGE_TAG} aptos'" >> ./ecosystem/typescript/sdk/.env
- run: echo "ANS_REPO_LOCATION=${{ runner.temp }}/ans" >> ./ecosystem/typescript/sdk/.env

- run: cp ./ecosystem/typescript/sdk/.env ./ecosystem/typescript/sdk/examples/typescript/.env
- run: cp ./ecosystem/typescript/sdk/.env ./ecosystem/typescript/sdk/examples/javascript/.env

# Run package install. If install fails, it probably means the lockfile
# was not included in the commit.
- run: cd ./ecosystem/typescript/sdk && pnpm install --frozen-lockfile
Expand All @@ -123,56 +108,6 @@ jobs:
- run: echo "cd ecosystem/typescript/sdk && pnpm generate-client"
- run: git diff --no-index --ignore-space-at-eol --ignore-blank-lines ./ecosystem/typescript/sdk/src/generated/ /tmp/generated_client/

# Run a local testnet built from the same commit.
- run: docker run -p 8080:8080 -p 8081:8081 --name=local-testnet --detach ${{ secrets.GCP_DOCKER_ARTIFACT_REPO }}/tools:${IMAGE_TAG} aptos node run-local-testnet --with-faucet

# Wait for the API and faucet to startup.
- run: npm install -g wait-on
- run: wait-on -t 60000 --httpTimeout 60000 http-get://127.0.0.1:8080/v1
- run: wait-on -t 60000 --httpTimeout 60000 http-get://127.0.0.1:8081

# Run the TS SDK tests and confirm the build works.
- uses: nick-fields/retry@7f8f3d9f0f62fe5925341be21c2e8314fd4f7c7c # pin@v2
name: sdk-pnpm-test
with:
max_attempts: 3
timeout_minutes: 20
command: cd ./ecosystem/typescript/sdk && pnpm run test:ci
- run: cd ./ecosystem/typescript/sdk && pnpm build

# Confirm the Rust API client examples pass.
- uses: aptos-labs/aptos-core/.github/actions/rust-setup@main
- run: cargo run -p aptos-rest-client --example account -- --api-url http://127.0.01:8080

- name: Print docker-compose testnet logs on failure
if: ${{ failure() }}
working-directory: docker/compose/validator-testnet
run: docker logs local-testnet

# Run the TS SDK indexer tests. Note: indexer service can be flaky and we
# dont want those tests to be land blocking for any PR on the aptos repo.
# This is why we run those tests separate from
# test-sdk-confirm-client-generated-publish.
run-indexer-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # pin@v3
with:
ref: ${{ env.GIT_SHA }}
- uses: actions/setup-node@969bd2663942d722d85b6a8626225850c2f7be4b # pin@v3
with:
node-version-file: .node-version
registry-url: "https://registry.npmjs.org"
- uses: pnpm/action-setup@537643d491d20c2712d11533497cb47b2d0eb9d5 # pin https://github.com/pnpm/action-setup/releases/tag/v2.2.3

# Run package install. If install fails, it probably means the lockfile
# was not included in the commit.
- run: cd ./ecosystem/typescript/sdk && pnpm install --frozen-lockfile

# Run indexer tests.
- uses: nick-fields/retry@7f8f3d9f0f62fe5925341be21c2e8314fd4f7c7c # pin@v2
name: ts-sdk-indexer-test
with:
max_attempts: 3
timeout_minutes: 20
command: cd ./ecosystem/typescript/sdk && pnpm run test:indexer
- run: cargo run -p aptos-rest-client --example account -- --api-url $APTOS_NODE_URL
102 changes: 102 additions & 0 deletions .github/workflows/sdk-e2e-tests.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Each of these jobs runs the TS SDK E2E tests from this commit against a local testnet
# built from one of the production release branches. In other words, we run the TS SDK
# tests against a local devnet, testnet, and mainnet. We also run the TS SDK tests for
# the indexer, though those run against the production indexer for now.

name: "SDK E2E Tests"
on:
pull_request:
push:
branches:
- main

jobs:
run-tests-devnet:
runs-on: high-perf-docker
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # pin@v3
- uses: aptos-labs/aptos-core/.github/actions/docker-setup@main
with:
GCP_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
GCP_SERVICE_ACCOUNT_EMAIL: ${{ secrets.GCP_SERVICE_ACCOUNT_EMAIL }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DOCKER_ARTIFACT_REPO: ${{ secrets.AWS_DOCKER_ARTIFACT_REPO }}
GIT_CREDENTIALS: ${{ secrets.GIT_CREDENTIALS }}
- uses: ./.github/actions/run-sdk-e2e-tests
with:
NETWORK: devnet
GCP_DOCKER_ARTIFACT_REPO: ${{ secrets.GCP_DOCKER_ARTIFACT_REPO }}

run-tests-testnet:
runs-on: high-perf-docker
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # pin@v3
- uses: aptos-labs/aptos-core/.github/actions/docker-setup@main
with:
GCP_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
GCP_SERVICE_ACCOUNT_EMAIL: ${{ secrets.GCP_SERVICE_ACCOUNT_EMAIL }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DOCKER_ARTIFACT_REPO: ${{ secrets.AWS_DOCKER_ARTIFACT_REPO }}
GIT_CREDENTIALS: ${{ secrets.GIT_CREDENTIALS }}
- uses: ./.github/actions/run-sdk-e2e-tests
with:
NETWORK: testnet
GCP_DOCKER_ARTIFACT_REPO: ${{ secrets.GCP_DOCKER_ARTIFACT_REPO }}

run-tests-mainnet:
runs-on: high-perf-docker
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # pin@v3
- uses: aptos-labs/aptos-core/.github/actions/docker-setup@main
with:
GCP_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
GCP_SERVICE_ACCOUNT_EMAIL: ${{ secrets.GCP_SERVICE_ACCOUNT_EMAIL }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DOCKER_ARTIFACT_REPO: ${{ secrets.AWS_DOCKER_ARTIFACT_REPO }}
GIT_CREDENTIALS: ${{ secrets.GIT_CREDENTIALS }}
- uses: ./.github/actions/run-sdk-e2e-tests
with:
NETWORK: mainnet
GCP_DOCKER_ARTIFACT_REPO: ${{ secrets.GCP_DOCKER_ARTIFACT_REPO }}

# Run the TS SDK indexer tests. Note: Unlike the above tests where everything is self
# contained because we run a local testnet, these tests operate against the
# production indexer service. This service can be flaky so we don't want those tests
# to be land blocking for any PR on the aptos repo. This is why we run those tests
# separate from test-sdk-confirm-client-generated-publish.
run-indexer-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # pin@v3
with:
ref: ${{ env.GIT_SHA }}
- uses: actions/setup-node@969bd2663942d722d85b6a8626225850c2f7be4b # pin@v3
with:
node-version-file: .node-version
registry-url: "https://registry.npmjs.org"
- uses: pnpm/action-setup@537643d491d20c2712d11533497cb47b2d0eb9d5 # pin https://github.com/pnpm/action-setup/releases/tag/v2.2.3

# Run package install. If install fails, it probably means the lockfile
# was not included in the commit.
- run: cd ./ecosystem/typescript/sdk && pnpm install --frozen-lockfile

# Run indexer tests.
- uses: nick-fields/retry@7f8f3d9f0f62fe5925341be21c2e8314fd4f7c7c # pin@v2
name: ts-sdk-indexer-test
with:
max_attempts: 3
timeout_minutes: 20
command: cd ./ecosystem/typescript/sdk && pnpm run test:indexer

13 changes: 7 additions & 6 deletions ecosystem/typescript/sdk/scripts/publish_ans_contract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ const ANS_TEST_ACCOUNT_ADDRESS =
process.env.ANS_TEST_ACCOUNT_ADDRESS || "585fc9f0f0c54183b039ffc770ca282ebd87307916c215a3e692f2f8e4305e82";

try {
deleteAnsFolder();
deleteAnsFolder(ANS_REPO_LOCATION);
// 1. Clone ANS repository into the current directory
console.log("---clone ANS repository---");
console.log("---cloning ANS repository---");
execSync(`git clone https://github.com/aptos-labs/aptos-names-contracts.git ${ANS_REPO_LOCATION}`, {
stdio: "inherit",
});
Expand All @@ -48,16 +48,17 @@ try {

// 4. Delete aptos-names-contracts folder created by the git clone command
console.log("---module published, deleting aptos-names-contracts folder---");
deleteAnsFolder();
deleteAnsFolder(ANS_REPO_LOCATION);
} catch (error: any) {
console.error("An error occurred:");
console.error("Status", error?.status);
console.error("parsed stdout", error?.stdout?.toString("utf8"));
console.error("parsed stderr", error?.stderr?.toString("utf8"));
deleteAnsFolder();
deleteAnsFolder(ANS_REPO_LOCATION);
process.exit(1);
}

function deleteAnsFolder() {
execSync("rm -rf /tmp/ans", { stdio: "inherit" });
function deleteAnsFolder(ansFolder: string) {
console.log("---deleting local ANS directory if present---");
execSync(`rm -rf ${ansFolder}`, { stdio: "inherit" });
}
Loading

0 comments on commit aad288d

Please sign in to comment.