version: 2.1

orbs:
  browser-tools: circleci/browser-tools@1.2.2

workflows:
  version: 2
  workflow:
    # Keep those job names in sync with .mergify.yml
    jobs:
      - build
      - docs-build:
          requires:
            - build
      - docs-deploy:
          requires:
            - docs-build
            - build
            - lint
          filters:
            branches:
              only: main
      - lint:
          requires:
            - build
      - test-backends:
          requires:
            - build
          matrix:
            parameters:
              simapp: ["simapp42", "simapp44"]
      - test-node:
          requires:
            - build
          matrix:
            parameters:
              node-version: ["12", "14", "16"]
      - test-chrome:
          requires:
            - build
      - coverage:
          requires:
            - build
      - faucet-docker

jobs:
  build:
    docker:
      - image: circleci/node:16.13-bullseye
    steps:
      - run:
          name: Install Git Large File Storage (LFS)
          command: sudo apt-get install git-lfs
      - checkout
      - run:
          name: Version information
          command: echo "node $(node --version)"; echo "yarn $(yarn --version)"
      - run:
          name: Install libusb
          command: sudo apt-get install libusb-1.0-0-dev
      - run:
          name: Install Dependencies
          command: yarn install --immutable --immutable-cache --check-cache
      - run:
          command: yarn build
      - persist_to_workspace:
          root: .
          paths:
            - packages/*/build/*
  test-backends:
    parameters:
      simapp:
        type: string
    machine:
      # We can't use a containerized environment since it requires remote docker to start custom containers.
      # However, we can't access the remote docker's network from the primary container. This is a
      # feature, as documented in https://circleci.com/docs/2.0/building-docker-images/#separation-of-environments
      # As a consequence, we cannot use the circleci CLI for this job because "You cannot use the machine
      # executor in local jobs." (https://circleci.com/docs/2.0/local-cli/#limitations-of-running-jobs-locally)
      #
      # Available images: https://circleci.com/docs/2.0/configuration-reference/#available-machine-images
      image: ubuntu-2004:202107-02
    steps:
      - run:
          name: Install Git Large File Storage (LFS)
          # In the current image, `sudo apt install git-lfs` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/git-lfs.deb" https://packagecloud.io/github/git-lfs/packages/ubuntu/focal/git-lfs_2.12.1_amd64.deb/download.deb
            sudo dpkg -i "$HOME/git-lfs.deb"
      - checkout
      - run: # start early for less wait time below
          name: Start wasmd
          command: ./scripts/wasmd/start.sh
          background: true
      - run:
          name: Start simapp
          command: ./scripts/<< parameters.simapp >>/start.sh
          background: true
      - run:
          name: Start slow simapp
          command: ./scripts/<< parameters.simapp >>/slow_start.sh
          background: true
      - run:
          name: Start Tendermint blockchains
          command: ./scripts/tendermint/all_start.sh
          background: true
      - attach_workspace:
          at: /tmp/builds
      - run:
          name: Merge build folders into project (merge with hardlinks)
          command: cp --recursive --link /tmp/builds/* .
      - run:
          # The images comes with preinstalled nvm, which does not work well with non-login shells
          name: Uninstall nvm
          # Moving to trash is faster than deleting (gvfs-trash is not installed on this image)
          command: |
            nvm --version && nvm ls
            mkdir -p ~/.local/share/Trash && mv "$NVM_DIR" ~/.npm ~/.local/share/Trash
      - run:
          name: Install nodejs
          # In the current image, `sudo apt install nodejs` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/nodejs.deb" https://deb.nodesource.com/node_12.x/pool/main/n/nodejs/nodejs_12.22.1-deb-1nodesource1_amd64.deb
            sudo dpkg -i "$HOME/nodejs.deb"
      - run:
          name: Install yarn
          command: |
            wget -O "$HOME/yarn.deb" https://dl.yarnpkg.com/debian/pool/main/y/yarn/yarn_1.22.15_all.deb
            sudo dpkg -i "$HOME/yarn.deb"
      - run:
          name: Version information
          command: echo "node $(node --version)"; echo "yarn $(yarn --version)"
      - run:
          name: Install libusb
          # In the current image, `sudo apt install libusb-1.0-0-dev` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/libusb.deb" http://de.archive.ubuntu.com/ubuntu/pool/main/libu/libusb-1.0/libusb-1.0-0-dev_1.0.23-2build1_amd64.deb
            sudo dpkg -i "$HOME/libusb.deb"
      - run:
          name: Install Dependencies
          command: yarn install --immutable --immutable-cache --check-cache
      - run:
          name: Initialize wasmd (deploy contracts and friends)
          command: ./scripts/wasmd/init.sh
      - run:
          name: Start socket server
          command: ./scripts/socketserver/start.sh
      - run:
          name: Run tests
          environment:
            TENDERMINT_ENABLED: 1
            SOCKETSERVER_ENABLED: 1
            SKIP_BUILD: 1
            WASMD_ENABLED: 1
          command: |
            [ "<< parameters.simapp >>" = "simapp42" ] && export SIMAPP42_ENABLED=1 SLOW_SIMAPP42_ENABLED=1
            [ "<< parameters.simapp >>" = "simapp44" ] && export SIMAPP44_ENABLED=1 SLOW_SIMAPP44_ENABLED=1
            yarn test --stream
      - run:
          name: Run CLI selftest
          working_directory: packages/cli
          environment:
            SKIP_BUILD: 1
          command: yarn selftest
      - run:
          name: Run CLI examples
          working_directory: packages/cli
          environment:
            TENDERMINT_ENABLED: 1
            SOCKETSERVER_ENABLED: 1
            SKIP_BUILD: 1
            WASMD_ENABLED: 1
          command: |
            [ "<< parameters.simapp >>" = "simapp42" ] && export SIMAPP42_ENABLED=1 SLOW_SIMAPP42_ENABLED=1
            [ "<< parameters.simapp >>" = "simapp44" ] && export SIMAPP44_ENABLED=1 SLOW_SIMAPP44_ENABLED=1
            ./run_examples.sh
      - run:
          name: Stop chains
          command: |
            ./scripts/socketserver/stop.sh
            ./scripts/tendermint/all_stop.sh
            ./scripts/<< parameters.simapp >>/stop.sh
            ./scripts/<< parameters.simapp >>/slow_stop.sh
            ./scripts/wasmd/stop.sh
  test-node:
    parameters:
      node-version:
        type: string
    machine:
      # We can't use a containerized environment since it requires remote docker to start custom containers.
      # However, we can't access the remote docker's network from the primary container. This is a
      # feature, as documented in https://circleci.com/docs/2.0/building-docker-images/#separation-of-environments
      # As a consequence, we cannot use the circleci CLI for this job because "You cannot use the machine
      # executor in local jobs." (https://circleci.com/docs/2.0/local-cli/#limitations-of-running-jobs-locally)
      #
      # Available images: https://circleci.com/docs/2.0/configuration-reference/#available-machine-images
      image: ubuntu-2004:202107-02
    steps:
      - run:
          name: Install Git Large File Storage (LFS)
          # In the current image, `sudo apt install git-lfs` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/git-lfs.deb" https://packagecloud.io/github/git-lfs/packages/ubuntu/focal/git-lfs_2.12.1_amd64.deb/download.deb
            sudo dpkg -i "$HOME/git-lfs.deb"
      - checkout
      - run: # start early for less wait time below
          name: Start wasmd
          command: ./scripts/wasmd/start.sh
          background: true
      - run:
          name: Start simapp
          command: ./scripts/simapp42/start.sh
          background: true
      - run:
          name: Start slow simapp
          command: ./scripts/simapp42/slow_start.sh
          background: true
      - run:
          name: Start Tendermint blockchains
          command: ./scripts/tendermint/all_start.sh
          background: true
      - attach_workspace:
          at: /tmp/builds
      - run:
          name: Merge build folders into project (merge with hardlinks)
          command: cp --recursive --link /tmp/builds/* .
      - run:
          # The images comes with preinstalled nvm, which does not work well with non-login shells
          name: Uninstall nvm
          # Moving to trash is faster than deleting (gvfs-trash is not installed on this image)
          command: |
            nvm --version && nvm ls
            mkdir -p ~/.local/share/Trash && mv "$NVM_DIR" ~/.npm ~/.local/share/Trash
      - run:
          name: Install nodejs
          # In the current image, `sudo apt install nodejs` requires `sudo apt update` which is too slow
          command: |
            declare -A node_links=(
              ["12"]="https://deb.nodesource.com/node_12.x/pool/main/n/nodejs/nodejs_12.22.1-deb-1nodesource1_amd64.deb"
              ["14"]="https://deb.nodesource.com/node_14.x/pool/main/n/nodejs/nodejs_14.18.0-deb-1nodesource1_amd64.deb"
              ["16"]="https://deb.nodesource.com/node_16.x/pool/main/n/nodejs/nodejs_16.13.2-deb-1nodesource1_amd64.deb"
            )
            wget -O "$HOME/nodejs.deb" "${node_links[<< parameters.node-version >>]}"
            sudo dpkg -i "$HOME/nodejs.deb"
      - run:
          name: Install yarn
          command: |
            wget -O "$HOME/yarn.deb" https://dl.yarnpkg.com/debian/pool/main/y/yarn/yarn_1.22.15_all.deb
            sudo dpkg -i "$HOME/yarn.deb"
      - run:
          name: Version information
          command: echo "node $(node --version)"; echo "yarn $(yarn --version)"
      - run:
          name: Install libusb
          # In the current image, `sudo apt install libusb-1.0-0-dev` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/libusb.deb" http://de.archive.ubuntu.com/ubuntu/pool/main/libu/libusb-1.0/libusb-1.0-0-dev_1.0.23-2build1_amd64.deb
            sudo dpkg -i "$HOME/libusb.deb"
      - run:
          name: Install Dependencies
          command: yarn install --immutable --immutable-cache --check-cache
      - run:
          name: Initialize wasmd (deploy contracts and friends)
          command: ./scripts/wasmd/init.sh
      - run:
          name: Start socket server
          command: ./scripts/socketserver/start.sh
      - run:
          environment:
            SIMAPP42_ENABLED: 1
            SLOW_SIMAPP42_ENABLED: 1
            TENDERMINT_ENABLED: 1
            SOCKETSERVER_ENABLED: 1
            SKIP_BUILD: 1
            WASMD_ENABLED: 1
            SES_ENABLED: 1
          command: yarn test --stream
      - run:
          name: Run CLI selftest
          working_directory: packages/cli
          environment:
            SKIP_BUILD: 1
          command: yarn selftest
      - run:
          name: Run CLI examples
          working_directory: packages/cli
          environment:
            SIMAPP42_ENABLED: 1
            SLOW_SIMAPP42_ENABLED: 1
            TENDERMINT_ENABLED: 1
            SOCKETSERVER_ENABLED: 1
            SKIP_BUILD: 1
            WASMD_ENABLED: 1
          command: ./run_examples.sh
      - run:
          name: Stop chains
          command: |
            ./scripts/socketserver/stop.sh
            ./scripts/tendermint/all_stop.sh
            ./scripts/simapp42/stop.sh
            ./scripts/simapp42/slow_stop.sh
            ./scripts/wasmd/stop.sh
  test-chrome:
    machine:
      # We can't use a containerized environment since it requires remote docker to start custom containers.
      # However, we can't access the remote docker's network from the primary container. This is a
      # feature, as documented in https://circleci.com/docs/2.0/building-docker-images/#separation-of-environments
      # As a consequence, we cannot use the circleci CLI for this job because "You cannot use the machine
      # executor in local jobs." (https://circleci.com/docs/2.0/local-cli/#limitations-of-running-jobs-locally)
      #
      # Available images: https://circleci.com/docs/2.0/configuration-reference/#available-machine-images
      image: ubuntu-2004:202107-02
    steps:
      - browser-tools/install-chrome # Slow because apt update but what can you do 🤷‍
      - run:
          name: Install Git Large File Storage (LFS)
          # In the current image, `sudo apt install git-lfs` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/git-lfs.deb" https://packagecloud.io/github/git-lfs/packages/ubuntu/focal/git-lfs_2.12.1_amd64.deb/download.deb
            sudo dpkg -i "$HOME/git-lfs.deb"
      - checkout
      - run: # start early for less wait time below
          name: Start wasmd
          command: ./scripts/wasmd/start.sh
          background: true
      - run:
          name: Start simapp
          command: ./scripts/simapp42/start.sh
          background: true
      - run:
          name: Start slow simapp
          command: ./scripts/simapp42/slow_start.sh
          background: true
      - run:
          name: Start Tendermint blockchains
          command: ./scripts/tendermint/all_start.sh
          background: true
      - attach_workspace:
          at: /tmp/builds
      - run:
          name: Merge build folders into project (merge with hardlinks)
          command: cp --recursive --link /tmp/builds/* .
      - run:
          # The images comes with preinstalled nvm, which does not work well with non-login shells
          name: Uninstall nvm
          # Moving to trash is faster than deleting (gvfs-trash is not installed on this image)
          command: |
            nvm --version && nvm ls
            mkdir -p ~/.local/share/Trash && mv "$NVM_DIR" ~/.npm ~/.local/share/Trash
      - run:
          name: Install nodejs
          # In the current image, `sudo apt install nodejs` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/nodejs.deb" https://deb.nodesource.com/node_12.x/pool/main/n/nodejs/nodejs_12.22.1-deb-1nodesource1_amd64.deb
            sudo dpkg -i "$HOME/nodejs.deb"
      - run:
          name: Install yarn
          command: |
            wget -O "$HOME/yarn.deb" https://dl.yarnpkg.com/debian/pool/main/y/yarn/yarn_1.22.15_all.deb
            sudo dpkg -i "$HOME/yarn.deb"
      - run:
          name: Version information
          command: echo "node $(node --version)"; echo "yarn $(yarn --version)"
      - run:
          name: Install libusb
          # In the current image, `sudo apt install libusb-1.0-0-dev` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/libusb.deb" http://de.archive.ubuntu.com/ubuntu/pool/main/libu/libusb-1.0/libusb-1.0-0-dev_1.0.23-2build1_amd64.deb
            sudo dpkg -i "$HOME/libusb.deb"
      - run:
          name: Install Dependencies
          command: yarn install --immutable --immutable-cache --check-cache
      - run:
          name: Initialize wasmd (deploy contracts and friends)
          command: ./scripts/wasmd/init.sh
      - run:
          name: Start socket server
          command: ./scripts/socketserver/start.sh
      - run:
          environment:
            SIMAPP42_ENABLED: 1
            SLOW_SIMAPP42_ENABLED: 1
            TENDERMINT_ENABLED: 1
            SOCKETSERVER_ENABLED: 1
            SKIP_BUILD: 1
            WASMD_ENABLED: 1
          command: yarn test-chrome
      - run:
          name: Stop chains
          command: |
            ./scripts/socketserver/stop.sh
            ./scripts/tendermint/all_stop.sh
            ./scripts/simapp42/stop.sh
            ./scripts/simapp42/slow_stop.sh
            ./scripts/wasmd/stop.sh
  coverage:
    machine:
      # We can't use a containerized environment since it requires remote docker to start custom containers.
      # However, we can't access the remote docker's network from the primary container. This is a
      # feature, as documented in https://circleci.com/docs/2.0/building-docker-images/#separation-of-environments
      # As a consequence, we cannot use the circleci CLI for this job because "You cannot use the machine
      # executor in local jobs." (https://circleci.com/docs/2.0/local-cli/#limitations-of-running-jobs-locally)
      #
      # Available images: https://circleci.com/docs/2.0/configuration-reference/#available-machine-images
      image: ubuntu-2004:202107-02
    steps:
      - run:
          name: Install Git Large File Storage (LFS)
          # In the current image, `sudo apt install git-lfs` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/git-lfs.deb" https://packagecloud.io/github/git-lfs/packages/ubuntu/focal/git-lfs_2.12.1_amd64.deb/download.deb
            sudo dpkg -i "$HOME/git-lfs.deb"
      - checkout
      - run: # start early for less wait time below
          name: Start wasmd
          command: ./scripts/wasmd/start.sh
          background: true
      - run:
          name: Start simapp
          command: ./scripts/simapp42/start.sh
          background: true
      - run:
          name: Start slow simapp
          command: ./scripts/simapp42/slow_start.sh
          background: true
      - run:
          name: Start Tendermint blockchains
          command: ./scripts/tendermint/all_start.sh
          background: true
      - attach_workspace:
          at: /tmp/builds
      - run:
          name: Merge build folders into project (merge with hardlinks)
          command: cp --recursive --link /tmp/builds/* .
      - run:
          # The images comes with preinstalled nvm, which does not work well with non-login shells
          name: Uninstall nvm
          # Moving to trash is faster than deleting (gvfs-trash is not installed on this image)
          command: |
            nvm --version && nvm ls
            mkdir -p ~/.local/share/Trash && mv "$NVM_DIR" ~/.npm ~/.local/share/Trash
      - run:
          name: Install nodejs
          # In the current image, `sudo apt install nodejs` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/nodejs.deb" https://deb.nodesource.com/node_12.x/pool/main/n/nodejs/nodejs_12.22.1-deb-1nodesource1_amd64.deb
            sudo dpkg -i "$HOME/nodejs.deb"
      - run:
          name: Install yarn
          command: |
            wget -O "$HOME/yarn.deb" https://dl.yarnpkg.com/debian/pool/main/y/yarn/yarn_1.22.15_all.deb
            sudo dpkg -i "$HOME/yarn.deb"
      - run:
          name: Version information
          command: echo "node $(node --version)"; echo "yarn $(yarn --version)"
      - run:
          name: Install libusb
          # In the current image, `sudo apt install libusb-1.0-0-dev` requires `sudo apt update` which is too slow
          command: |
            wget -O "$HOME/libusb.deb" http://de.archive.ubuntu.com/ubuntu/pool/main/libu/libusb-1.0/libusb-1.0-0-dev_1.0.23-2build1_amd64.deb
            sudo dpkg -i "$HOME/libusb.deb"
      - run:
          name: Install Dependencies
          command: yarn install --immutable --immutable-cache --check-cache
      - run:
          name: Initialize wasmd (deploy contracts and friends)
          command: ./scripts/wasmd/init.sh
      - run:
          name: Start socket server
          command: ./scripts/socketserver/start.sh
      - run:
          environment:
            SIMAPP42_ENABLED: 1
            SLOW_SIMAPP42_ENABLED: 1
            TENDERMINT_ENABLED: 1
            SOCKETSERVER_ENABLED: 1
            SKIP_BUILD: 1
            WASMD_ENABLED: 1
          command: yarn coverage
      - run:
          name: Upload coverage report
          command: npx codecov
      - run:
          name: Stop chains
          command: |
            ./scripts/socketserver/stop.sh
            ./scripts/tendermint/all_stop.sh
            ./scripts/simapp42/stop.sh
            ./scripts/simapp42/slow_stop.sh
            ./scripts/wasmd/stop.sh
  docs-build:
    docker:
      - image: circleci/node:16.13-bullseye
    steps:
      - run:
          name: Install Git Large File Storage (LFS)
          command: sudo apt-get install git-lfs
      - checkout
      - attach_workspace:
          at: /tmp/builds
      - run:
          name: Merge build folders into project (merge with hardlinks)
          command: cp --recursive --link /tmp/builds/* .
      - run:
          name: Version information
          command: echo "node $(node --version)"; echo "yarn $(yarn --version)"
      - run:
          name: Install libusb
          command: sudo apt-get install libusb-1.0-0-dev
      - run:
          name: Install Dependencies
          command: yarn install --immutable --immutable-cache --check-cache
      - run:
          name: Build package docs
          command: yarn docs
      - run:
          name: Copy docs into deployment folder
          command: ./scripts/docs/copy_docs.sh
      - persist_to_workspace:
          root: .
          paths: docs_deployment
  docs-deploy:
    docker:
      - image: circleci/node:16.13-bullseye
    steps:
      - attach_workspace:
          at: .
      - add_ssh_keys:
          fingerprints:
            - "a7:b3:94:4a:9e:e1:30:fa:ca:22:d1:db:a1:78:d6:e4"
      - run:
          name: Add GitHub to known hosts
          command: |
            mkdir -p ~/.ssh
            echo 'github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==' >> ~/.ssh/known_hosts
      - run:
          name: Deploy to GitHub pages
          # Version pinned to 3.0.0 because of https://github.com/tschaub/gh-pages/issues/354
          command: npx gh-pages@3.0.0 --message "Update docs [skip ci]" --dist docs_deployment --user "CI deployment <ci@cosmwasm.com>" --repo "git@github.com:cosmos/cosmjs.git"
  lint:
    docker:
      - image: circleci/node:16.13-bullseye
    steps:
      - run:
          name: Install Git Large File Storage (LFS)
          command: sudo apt-get install git-lfs
      - checkout
      - attach_workspace:
          at: /tmp/builds
      - run:
          name: Merge build folders into project (merge with hardlinks)
          command: cp --recursive --link /tmp/builds/* .
      - run:
          name: Install shfmt
          command: |
            sudo wget https://github.com/mvdan/sh/releases/download/v3.2.1/shfmt_v3.2.1_linux_amd64 -O /usr/local/bin/shfmt
            sudo chmod +x /usr/local/bin/shfmt
            shfmt --version
      - run:
          name: Version information
          command: echo "node $(node --version)"; echo "yarn $(yarn --version)"
      - run:
          name: Install libusb
          command: sudo apt-get install libusb-1.0-0-dev
      - run:
          name: Install Dependencies
          command: yarn install --immutable --immutable-cache --check-cache
      - run:
          name: Lint
          command: yarn lint
      - run:
          name: Format text
          command: yarn format-text
      - run:
          name: Format shell scripts
          command: yarn format-shell
  faucet-docker:
    docker:
      - image: cimg/go:1.17.8
    steps:
      - run:
          name: Install Git Large File Storage (LFS)
          command: |
            sudo apt update
            sudo apt install git-lfs
      - checkout
      - setup_remote_docker:
          # >= v20.10 https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.14.0#faccessat2
          version: 20.10.11
      - run:
          name: Build faucet Docker image
          # Use ${CIRCLE_TAG}
          command: |
            docker build --pull -t "confio/faucet:$CIRCLE_SHA1" -f packages/faucet/Dockerfile .
      - run:
          name: Check docker image can be executed
          command: |
            docker run --rm "confio/faucet:$CIRCLE_SHA1" version
            docker run --rm "confio/faucet:$CIRCLE_SHA1" generate
      # - run:
      #     name: Push image to Docker Hub
      #     command: |
      #       docker login --password-stdin -u "$DOCKER_USER" \<<<"$DOCKER_PASS"
      #       docker push "confio/faucet:$CIRCLE_SHA1"
      #       docker logout
