From df1a34f7de8eb6b6eb186e57ff64c78c7eb753b9 Mon Sep 17 00:00:00 2001 From: armaniferrante Date: Fri, 18 Sep 2020 15:42:08 -0700 Subject: [PATCH] Run wholeshebang in CI --- .travis.yml | 48 +++++++++++++++++++++++++---------- docker/Makefile | 2 +- docker/development/Dockerfile | 15 +++++++---- scripts/travis/e2e-tests.sh | 46 +++++++++++++++++++++++++++++++++ scripts/travis/run-docker.sh | 42 ++++++++++++++++++++++++++++++ scripts/travis/stop-docker.sh | 20 +++++++++++++++ 6 files changed, 154 insertions(+), 19 deletions(-) create mode 100755 scripts/travis/e2e-tests.sh create mode 100755 scripts/travis/run-docker.sh create mode 100755 scripts/travis/stop-docker.sh diff --git a/.travis.yml b/.travis.yml index 878eb15..0873e28 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,36 @@ -language: minimal +language: shell +os: linux -sudo: required - -services: - - docker - -before_install: -- docker pull projectserum/development:latest -- docker run -it -d --name dev projectserum/development:latest bash -- docker exec dev git clone https://github.com/project-serum/serum-dex.git - -script: - - docker exec dev serum-dex/do.sh test dex +_defaults: &defaults + cache: + directories: + - $TRAVIS_HOME/.cargo + - $TRAVIS_HOME/.rustup + - $TRAVIS_HOME/.cache + - $TRAVIS_BUILD_DIR/crank/target + - $TRAVIS_BUILD_DIR/dex/target + services: + - docker + before_install: + - scripts/travis/run-docker.sh + install: + - mkdir -p bin && ./bpf-sdk-install.sh bin + before_cache: + - scripts/travis/stop-docker.sh + - rm -rf "$TRAVIS_HOME/.cargo/registry/src" +jobs: + include: + - <<: *defaults + name: Unit tests + script: + - docker exec dev ./do.sh test dex + - <<: *defaults + name: Integration tests + language: node_js + node_js: + - "node" + script: + - npm install -g @solana/web3.js + - npx solana-localnet update + - npx solana-localnet up + - docker exec dev ./scripts/travis/e2e-tests.sh diff --git a/docker/Makefile b/docker/Makefile index 9f41349..c5131a2 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -14,6 +14,6 @@ development-push: @docker push $(IMG_ORG)/development:$(IMG_VER) development-shell: - @docker run -ti --rm \ + @docker run -ti --rm --net=host \ -v $(WORKDIR)/..:/workdir \ $(IMG_ORG)/development:$(IMG_VER) bash diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile index 32d1c8c..f29efb2 100644 --- a/docker/development/Dockerfile +++ b/docker/development/Dockerfile @@ -3,14 +3,17 @@ FROM ubuntu:18.04 ARG DEBIAN_FRONTEND=noninteractive ARG SOLANA_CHANNEL=v1.2.17 +ARG SOLANA_CLI=v1.3.9 + +ENV HOME="/root" +ENV PATH="${HOME}/.cargo/bin:${PATH}" +ENV PATH="${HOME}/.local/share/solana/install/active_release/bin:${PATH}" # Install base utilities. RUN mkdir -p /workdir && mkdir -p /tmp && \ apt-get update -qq && apt-get upgrade -qq && apt-get install -qq \ - build-essential git curl - -ENV HOME="/root" -ENV PATH="${HOME}/.cargo/bin:${PATH}" + build-essential git curl wget jq pkg-config python3-pip \ + libssl-dev libudev-dev # Install rust. RUN curl "https://sh.rustup.rs" -sfo rustup.sh && \ @@ -18,7 +21,9 @@ RUN curl "https://sh.rustup.rs" -sfo rustup.sh && \ rustup component add rustfmt clippy # Install Solana tools. -RUN curl -L --retry 5 --retry-delay 2 -o bpf-sdk.tar.bz2 http://solana-sdk.s3.amazonaws.com/${SOLANA_CHANNEL}/bpf-sdk.tar.bz2 && \ +RUN curl -sSf https://raw.githubusercontent.com/solana-labs/solana/${SOLANA_CLI}/install/solana-install-init.sh | sh -s - ${SOLANA_CLI} && \ + # BPF sdk. + curl -L --retry 5 --retry-delay 2 -o bpf-sdk.tar.bz2 http://solana-sdk.s3.amazonaws.com/${SOLANA_CHANNEL}/bpf-sdk.tar.bz2 && \ rm -rf bpf-sdk && \ mkdir -p bpf-sdk && \ tar jxf bpf-sdk.tar.bz2 && \ diff --git a/scripts/travis/e2e-tests.sh b/scripts/travis/e2e-tests.sh new file mode 100755 index 0000000..dce922d --- /dev/null +++ b/scripts/travis/e2e-tests.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +set -euxo pipefail + +CLUSTER=localnet +KEYPAIR_FILE=$HOME/.config/solana/id.json +CLUSTER_URL=http://localhost:8899 + +# +# Assumes the current working directory is top-level serum-dex dir. +# +main() { + # + # Create a keypair for the tests. + # + set +e + yes | solana-keygen new --outfile $KEYPAIR_FILE + # + # Fund the keypair. + # + yes | solana airdrop --url $CLUSTER_URL 100 + set -e + # + # Run the tests. + # + dex_whole_shebang +} + +dex_whole_shebang() { + # + # Build the program. + # + ./do.sh build dex + # + # Deploy the program. + # + local dex_program_id="$(solana deploy --url ${CLUSTER_URL} dex/target/bpfel-unknown-unknown/release/serum_dex.so --use-deprecated-loader | jq .programId -r)" + # + # Run the whole-shebang. + # + pushd crank + cargo run -- $CLUSTER whole-shebang $KEYPAIR_FILE $dex_program_id + popd +} + +main diff --git a/scripts/travis/run-docker.sh b/scripts/travis/run-docker.sh new file mode 100755 index 0000000..fcad0e2 --- /dev/null +++ b/scripts/travis/run-docker.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +set -euxo pipefail + +main() { + docker pull projectserum/development:latest + # + # Bind the relevant host directories to the docker image so that the + # relevant files are synced. + # + docker volume create --driver local \ + --opt type=none \ + --opt device=$TRAVIS_HOME/.cargo \ + --opt o=bind \ + cargodir + docker volume create --driver local \ + --opt type=none \ + --opt device=$TRAVIS_HOME/.rustup \ + --opt o=bind \ + rustupdir + docker volume create --driver local \ + --opt type=none \ + --opt device=$TRAVIS_HOME/.cache \ + --opt o=bind \ + cachedir + docker volume create --driver local \ + --opt type=none \ + --opt device=$TRAVIS_BUILD_DIR \ + --opt o=bind \ + workdir + # + # Start the container. + # + docker run -it -d --net host --name dev \ + -v cargodir:/root/.cargo \ + -v rustupdir:/root/.rustup \ + -v cachedir:/root/.cache \ + -v workdir:/workdir \ + projectserum/development:latest bash +} + +main diff --git a/scripts/travis/stop-docker.sh b/scripts/travis/stop-docker.sh new file mode 100755 index 0000000..06c3dd8 --- /dev/null +++ b/scripts/travis/stop-docker.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +set -euxo pipefail + +main() { + # + # Files created within a docker container can't be used outside + # by the host without root. So Change file permissions so that + # travis can create a cache archive. + # + sudo chown -R travis:travis $TRAVIS_HOME/.cargo + sudo chown -R travis:travis $TRAVIS_HOME/.rustup + sudo chown -R travis:travis $TRAVIS_HOME/.cache + sudo chown -R travis:travis $TRAVIS_BUILD_DIR/dex/target + sudo chown -R travis:travis $TRAVIS_BUILD_DIR/crank/target + + docker stop dev +} + +main