version: 2.1
orbs:
  aws-cli: circleci/aws-cli@4.1.1
  docker: circleci/docker@2.3.0

executors:
  golang:
    docker:
      # Must match GO_VERSION_MIN in project root
      - image: cimg/go:1.20.7
    resource_class: medium+
  golang-2xl:
    docker:
      # Must match GO_VERSION_MIN in project root
      - image: cimg/go:1.20.7
    resource_class: 2xlarge
  ubuntu:
    docker:
      - image: ubuntu:20.04

commands:
  build-platform-specific:
    parameters:
      linux:
        default: true
        description: is a linux build environment?
        type: boolean
      darwin:
        default: false
        description: is a darwin build environment?
        type: boolean
      darwin-architecture:
        default: "amd64"
        description: which darwin architecture is being used?
        type: string
    steps:
      - checkout
      - git_fetch_all_tags
      - run: git submodule sync
      - run: git submodule update --init
      - when:
          condition: <<parameters.linux>>
          steps:
            - install-ubuntu-deps
            - check-go-version
      - when:
          condition: <<parameters.darwin>>
          steps:
            - run:
                name: Install Go
                command: |
                  curl https://dl.google.com/go/go`cat GO_VERSION_MIN`.darwin-<<parameters.darwin-architecture>>.pkg -o /tmp/go.pkg && \
                  sudo installer -pkg /tmp/go.pkg -target /
            - run:
                name: Export Go
                command: |
                  echo 'export GOPATH="${HOME}/go"' >> $BASH_ENV
            - run: go version
            - run:
                name: Install dependencies with Homebrew
                command: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config coreutils jq hwloc
            - run:
                name: Install Rust
                command: |
                  curl https://sh.rustup.rs -sSf | sh -s -- -y
      - run: make deps
  download-params:
    steps:
      - restore_cache:
          name: Restore parameters cache
          keys:
            - 'v26-2k-lotus-params'
      - run: ./lotus fetch-params 2048
      - save_cache:
          name: Save parameters cache
          key: 'v26-2k-lotus-params'
          paths:
            - /var/tmp/filecoin-proof-parameters/
  install_ipfs:
    steps:
      - run: |
          curl -O https://dist.ipfs.tech/kubo/v0.16.0/kubo_v0.16.0_linux-amd64.tar.gz
          tar -xvzf kubo_v0.16.0_linux-amd64.tar.gz
          pushd kubo
          sudo bash install.sh
          popd
          rm -rf kubo
          rm kubo_v0.16.0_linux-amd64.tar.gz
  git_fetch_all_tags:
    steps:
      - run:
          name: fetch all tags
          command: |
            git fetch --all
  install-ubuntu-deps:
    steps:
      - run: sudo apt install curl ca-certificates gnupg
      - run: sudo apt-get update
      - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev
  check-go-version:
    steps:
      - run: |
          v=`go version | { read _ _ v _; echo ${v#go}; }`
          if [[ $v != `cat GO_VERSION_MIN` ]]; then
            echo "GO_VERSION_MIN file does not match the go version being used."
            echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v."
            exit 1
          fi

jobs:
  build:
    executor: golang
    working_directory: ~/lotus
    steps:
      - checkout
      - git_fetch_all_tags
      - run: git submodule sync
      - run: git submodule update --init
      - install-ubuntu-deps
      - check-go-version
      - run: make deps lotus
      - persist_to_workspace:
          root: ~/
          paths:
            - "lotus"
  mod-tidy-check:
    executor: golang
    working_directory: ~/lotus
    steps:
      - install-ubuntu-deps
      - attach_workspace:
          at: ~/
      - run: go mod tidy -v
      - run:
          name: Check git diff
          command: |
            git --no-pager diff go.mod go.sum
            git --no-pager diff --quiet go.mod go.sum

  test:
    description: |
      Run tests with gotestsum.
    working_directory: ~/lotus
    parameters: &test-params
      resource_class:
        type: string
        default: medium+
      go-test-flags:
        type: string
        default: "-timeout 20m"
        description: Flags passed to go test.
      target:
        type: string
        default: "./..."
        description: Import paths of packages to be tested.
      proofs-log-test:
        type: string
        default: "0"
      get-params:
        type: boolean
        default: false
      suite:
        type: string
        default: unit
        description: Test suite name to report to CircleCI.
    docker:
      - image: cimg/go:1.20
        environment:
          LOTUS_HARMONYDB_HOSTS: yugabyte
      - image: yugabytedb/yugabyte:2.18.0.0-b65
        command: bin/yugabyted start --daemon=false
        name: yugabyte
    resource_class: << parameters.resource_class >>
    steps:
      - install-ubuntu-deps
      - attach_workspace:
          at: ~/
      - when:
          condition: << parameters.get-params >>
          steps:
            - download-params
      - run:
          name: go test
          environment:
            TEST_RUSTPROOFS_LOGS: << parameters.proofs-log-test >>
            SKIP_CONFORMANCE: "1"
            LOTUS_SRC_DIR: /home/circleci/project
          command: |
            mkdir -p /tmp/test-reports/<< parameters.suite >>
            mkdir -p /tmp/test-artifacts
            dockerize -wait tcp://yugabyte:5433 -timeout 3m
            env
            gotestsum \
              --format standard-verbose \
              --junitfile /tmp/test-reports/<< parameters.suite >>/junit.xml \
              --jsonfile /tmp/test-artifacts/<< parameters.suite >>.json \
              --packages="<< parameters.target >>" \
              -- << parameters.go-test-flags >>
          no_output_timeout: 30m
      - store_test_results:
          path: /tmp/test-reports
      - store_artifacts:
          path: /tmp/test-artifacts/<< parameters.suite >>.json

  test-conformance:
    working_directory: ~/lotus
    description: |
      Run tests using a corpus of interoperable test vectors for Filecoin
      implementations to test their correctness and compliance with the Filecoin
      specifications.
    parameters:
      <<: *test-params
      vectors-branch:
        type: string
        default: ""
        description: |
          Branch on github.com/filecoin-project/test-vectors to checkout and
          test with. If empty (the default) the commit defined by the git
          submodule is used.
    docker:
      - image: cimg/go:1.20
    resource_class: << parameters.resource_class >>
    steps:
      - install-ubuntu-deps
      - attach_workspace:
          at: ~/
      - download-params
      - when:
          condition:
            not:
              equal: [ "", << parameters.vectors-branch >> ]
          steps:
            - run:
                name: checkout vectors branch
                command: |
                  cd extern/test-vectors
                  git fetch
                  git checkout origin/<< parameters.vectors-branch >>
      - run:
          name: install statediff globally
          command: |
            ## statediff is optional; we succeed even if compilation fails.
            mkdir -p /tmp/statediff
            git clone https://github.com/filecoin-project/statediff.git /tmp/statediff
            cd /tmp/statediff
            go install ./cmd/statediff || exit 0
      - run:
          name: go test
          environment:
            SKIP_CONFORMANCE: "0"
          command: |
            mkdir -p /tmp/test-reports
            mkdir -p /tmp/test-artifacts
            gotestsum \
              --format pkgname-and-test-fails \
              --junitfile /tmp/test-reports/junit.xml \
              -- \
              -v -coverpkg ./chain/vm/,github.com/filecoin-project/specs-actors/... -coverprofile=/tmp/conformance.out ./conformance/
            go tool cover -html=/tmp/conformance.out -o /tmp/test-artifacts/conformance-coverage.html
          no_output_timeout: 30m
      - store_test_results:
          path: /tmp/test-reports
      - store_artifacts:
          path: /tmp/test-artifacts/conformance-coverage.html

  build-linux-amd64:
    executor: golang
    steps:
      - build-platform-specific
      - run: make lotus lotus-miner lotus-worker
      - run:
          name: check tag and version output match
          command: ./scripts/version-check.sh ./lotus
      - run: |
          mkdir -p /tmp/workspace/linux_amd64_v1 && \
          mv lotus lotus-miner lotus-worker /tmp/workspace/linux_amd64_v1/
      - persist_to_workspace:
          root: /tmp/workspace
          paths:
            - linux_amd64_v1

  build-darwin-amd64:
    description: build darwin lotus binary
    working_directory: ~/go/src/github.com/filecoin-project/lotus
    macos:
      xcode: "13.4.1"
    steps:
      - build-platform-specific:
          linux: false
          darwin: true
          darwin-architecture: amd64
      - run: make lotus lotus-miner lotus-worker
      - run: otool -hv lotus
      - run:
          name: check tag and version output match
          command: ./scripts/version-check.sh ./lotus
      - run: |
          mkdir -p /tmp/workspace/darwin_amd64_v1 && \
          mv lotus lotus-miner lotus-worker /tmp/workspace/darwin_amd64_v1/
      - persist_to_workspace:
          root: /tmp/workspace
          paths:
            - darwin_amd64_v1

  build-darwin-arm64:
    description: self-hosted m1 runner
    working_directory: ~/go/src/github.com/filecoin-project/lotus
    machine: true
    resource_class: filecoin-project/self-hosted-m1
    steps:
      - run: echo 'export PATH=/opt/homebrew/bin:"$PATH"' >> "$BASH_ENV"
      - build-platform-specific:
          linux: false
          darwin: true
          darwin-architecture: arm64
      - run: |
          export CPATH=$(brew --prefix)/include && export LIBRARY_PATH=$(brew --prefix)/lib && make lotus lotus-miner lotus-worker
      - run: otool -hv lotus
      - run:
          name: check tag and version output match
          command: ./scripts/version-check.sh ./lotus
      - run: |
          mkdir -p /tmp/workspace/darwin_arm64 && \
          mv lotus lotus-miner lotus-worker /tmp/workspace/darwin_arm64/
      - persist_to_workspace:
          root: /tmp/workspace
          paths:
            - darwin_arm64
      - run:
          command: make clean
          when: always
      - run:
          name: cleanup homebrew
          command: HOMEBREW_NO_AUTO_UPDATE=1 brew uninstall pkg-config coreutils jq hwloc
          when: always

  release:
    executor: golang
    parameters:
      dry-run:
        default: false
        description: should this release actually publish it's artifacts?
        type: boolean
    steps:
      - checkout
      - run: |
          echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' | sudo tee /etc/apt/sources.list.d/goreleaser.list
          sudo apt update
          sudo apt install goreleaser-pro
      - install_ipfs
      - attach_workspace:
          at: /tmp/workspace
      - when:
          condition: << parameters.dry-run >>
          steps:
            - run: goreleaser release --rm-dist --snapshot --debug
            - run: ./scripts/generate-checksums.sh
      - when:
          condition:
            not: << parameters.dry-run >>
          steps:
            - run: goreleaser release --rm-dist --debug
            - run: ./scripts/generate-checksums.sh
            - run: ./scripts/publish-checksums.sh

  gofmt:
    executor: golang
    working_directory: ~/lotus
    steps:
      - run:
          command: "! go fmt ./... 2>&1 | read"

  gen-check:
    executor: golang
    working_directory: ~/lotus
    steps:
      - install-ubuntu-deps
      - attach_workspace:
          at: ~/
      - run: go install golang.org/x/tools/cmd/goimports
      - run: go install github.com/hannahhoward/cbor-gen-for
      - run: make gen
      - run: git --no-pager diff && git --no-pager diff --quiet
      - run: make docsgen-cli
      - run: git --no-pager diff && git --no-pager diff --quiet

  docs-check:
    executor: golang
    working_directory: ~/lotus
    steps:
      - install-ubuntu-deps
      - attach_workspace:
          at: ~/
      - run: go install golang.org/x/tools/cmd/goimports
      - run: zcat build/openrpc/full.json.gz | jq > ../pre-openrpc-full
      - run: zcat build/openrpc/miner.json.gz | jq > ../pre-openrpc-miner
      - run: zcat build/openrpc/worker.json.gz | jq > ../pre-openrpc-worker
      - run: make docsgen
      - run: zcat build/openrpc/full.json.gz | jq > ../post-openrpc-full
      - run: zcat build/openrpc/miner.json.gz | jq > ../post-openrpc-miner
      - run: zcat build/openrpc/worker.json.gz | jq > ../post-openrpc-worker
      - run: diff ../pre-openrpc-full ../post-openrpc-full && diff ../pre-openrpc-miner ../post-openrpc-miner && diff ../pre-openrpc-worker ../post-openrpc-worker && git --no-pager diff && git --no-pager diff --quiet

  lint-all:
    description: |
      Run golangci-lint.
    working_directory: ~/lotus
    parameters:
      args:
        type: string
        default: ''
        description: |
          Arguments to pass to golangci-lint
    docker:
      - image: cimg/go:1.20
    resource_class: medium+
    steps:
      - install-ubuntu-deps
      - attach_workspace:
          at: ~/
      - run:
          name: Lint
          command: |
            golangci-lint run -v --timeout 10m \
              --concurrency 4 << parameters.args >>

  build-docker:
    description: >
      Publish to Dockerhub
    executor: docker/docker
    parameters:
      image:
        type: string
        default: lotus
        description: >
          Passed to the docker build process to determine which image in the
          Dockerfile should be built. Expected values are `lotus`,
          `lotus-all-in-one`
      network:
        type: string
        default: "mainnet"
        description: >
          Passed to the docker build process using GOFLAGS+=-tags=<<network>>.
          Expected values are `debug`, `2k`, `calibnet`, `butterflynet`,
          `interopnet`.
      channel:
        type: string
        default: ""
        description: >
          The release channel to use for this image.
      push:
        type: boolean
        default: false
        description: >
          When true, pushes the image to Dockerhub
    steps:
      - setup_remote_docker
      - checkout
      - git_fetch_all_tags
      - run: git submodule sync
      - run: git submodule update --init

      - docker/check:
          docker-username: DOCKERHUB_USERNAME
          docker-password: DOCKERHUB_PASSWORD
      - when:
          condition:
            equal: [ mainnet, <<parameters.network>> ]
          steps:
            - when:
                condition: <<parameters.push>>
                steps:
                  - docker/build:
                      image: filecoin/<<parameters.image>>
                      extra_build_args: --target <<parameters.image>>
                      tag: <<parameters.channel>>
                  - run:
                      name: Docker push
                      command: |
                        docker push filecoin/<<parameters.image>>:<<parameters.channel>>
                        if [[ ! -z $CIRCLE_SHA ]]; then
                          docker image tag filecoin/<<parameters.image>>:<<parameters.channel>> filecoin/<<parameters.image>>:"${CIRCLE_SHA:0:7}"
                          docker push filecoin/<<parameters.image>>:"${CIRCLE_SHA:0:7}"
                        fi
                        if [[ ! -z $CIRCLE_TAG ]]; then
                          docker image tag filecoin/<<parameters.image>>:<<parameters.channel>> filecoin/<<parameters.image>>:"${CIRCLE_TAG}"
                          docker push filecoin/<<parameters.image>>:"${CIRCLE_TAG}"
                        fi
            - unless:
                condition: <<parameters.push>>
                steps:
                  - docker/build:
                      image: filecoin/<<parameters.image>>
                      extra_build_args: --target <<parameters.image>>
      - when:
          condition:
            not:
              equal: [ mainnet, <<parameters.network>> ]
          steps:
            - when:
                condition: <<parameters.push>>
                steps:
                  - docker/build:
                      image: filecoin/<<parameters.image>>
                      extra_build_args: --target <<parameters.image>> --build-arg GOFLAGS=-tags=<<parameters.network>>
                      tag: <<parameters.channel>>-<<parameters.network>>
                  - run:
                      name: Docker push
                      command: |
                        docker push filecoin/<<parameters.image>>:<<parameters.channel>>-<<parameters.network>>
                        if [[ ! -z $CIRCLE_SHA ]]; then
                          docker image tag filecoin/<<parameters.image>>:<<parameters.channel>>-<<parameters.network>> filecoin/<<parameters.image>>:"${CIRCLE_SHA:0:7}"-<<parameters.network>>
                          docker push filecoin/<<parameters.image>>:"${CIRCLE_SHA:0:7}"-<<parameters.network>>
                        fi
                        if [[ ! -z $CIRCLE_TAG ]]; then
                          docker image tag filecoin/<<parameters.image>>:<<parameters.channel>>-<<parameters.network>> filecoin/<<parameters.image>>:"${CIRCLE_TAG}"-<<parameters.network>>
                          docker push filecoin/<<parameters.image>>:"${CIRCLE_TAG}"-<<parameters.network>>
                        fi
            - unless:
                condition: <<parameters.push>>
                steps:
                  - docker/build:
                      image: filecoin/<<parameters.image>>
                      extra_build_args: --target <<parameters.image>> --build-arg GOFLAGS=-tags=<<parameters.network>>

workflows:
  ci:
    jobs:
      - build
      - lint-all:
          requires:
            - build
      - mod-tidy-check:
          requires:
            - build
      - gofmt:
          requires:
            - build
      - gen-check:
          requires:
            - build
      - docs-check:
          requires:
            - build
      - test:
          name: test-itest-api
          requires:
            - build
          suite: itest-api
          target: "./itests/api_test.go"
      - test:
          name: test-itest-batch_deal
          requires:
            - build
          suite: itest-batch_deal
          target: "./itests/batch_deal_test.go"
      - test:
          name: test-itest-cli
          requires:
            - build
          suite: itest-cli
          target: "./itests/cli_test.go"
      - test:
          name: test-itest-deadlines
          requires:
            - build
          suite: itest-deadlines
          target: "./itests/deadlines_test.go"
      - test:
          name: test-itest-deals_512mb
          requires:
            - build
          suite: itest-deals_512mb
          target: "./itests/deals_512mb_test.go"
      - test:
          name: test-itest-deals_anycid
          requires:
            - build
          suite: itest-deals_anycid
          target: "./itests/deals_anycid_test.go"
      - test:
          name: test-itest-deals_concurrent
          requires:
            - build
          suite: itest-deals_concurrent
          target: "./itests/deals_concurrent_test.go"
          resource_class: 2xlarge
      - test:
          name: test-itest-deals_invalid_utf8_label
          requires:
            - build
          suite: itest-deals_invalid_utf8_label
          target: "./itests/deals_invalid_utf8_label_test.go"
      - test:
          name: test-itest-deals_max_staging_deals
          requires:
            - build
          suite: itest-deals_max_staging_deals
          target: "./itests/deals_max_staging_deals_test.go"
      - test:
          name: test-itest-deals_offline
          requires:
            - build
          suite: itest-deals_offline
          target: "./itests/deals_offline_test.go"
      - test:
          name: test-itest-deals_padding
          requires:
            - build
          suite: itest-deals_padding
          target: "./itests/deals_padding_test.go"
      - test:
          name: test-itest-deals_partial_retrieval_dm-level
          requires:
            - build
          suite: itest-deals_partial_retrieval_dm-level
          target: "./itests/deals_partial_retrieval_dm-level_test.go"
      - test:
          name: test-itest-deals_partial_retrieval
          requires:
            - build
          suite: itest-deals_partial_retrieval
          target: "./itests/deals_partial_retrieval_test.go"
      - test:
          name: test-itest-deals_power
          requires:
            - build
          suite: itest-deals_power
          target: "./itests/deals_power_test.go"
      - test:
          name: test-itest-deals_pricing
          requires:
            - build
          suite: itest-deals_pricing
          target: "./itests/deals_pricing_test.go"
      - test:
          name: test-itest-deals_publish
          requires:
            - build
          suite: itest-deals_publish
          target: "./itests/deals_publish_test.go"
      - test:
          name: test-itest-deals_remote_retrieval
          requires:
            - build
          suite: itest-deals_remote_retrieval
          target: "./itests/deals_remote_retrieval_test.go"
      - test:
          name: test-itest-deals_retry_deal_no_funds
          requires:
            - build
          suite: itest-deals_retry_deal_no_funds
          target: "./itests/deals_retry_deal_no_funds_test.go"
      - test:
          name: test-itest-deals
          requires:
            - build
          suite: itest-deals
          target: "./itests/deals_test.go"
      - test:
          name: test-itest-decode_params
          requires:
            - build
          suite: itest-decode_params
          target: "./itests/decode_params_test.go"
      - test:
          name: test-itest-direct_data_onboard
          requires:
            - build
          suite: itest-direct_data_onboard
          target: "./itests/direct_data_onboard_test.go"
      - test:
          name: test-itest-direct_data_onboard_verified
          requires:
            - build
          suite: itest-direct_data_onboard_verified
          target: "./itests/direct_data_onboard_verified_test.go"
      - test:
          name: test-itest-dup_mpool_messages
          requires:
            - build
          suite: itest-dup_mpool_messages
          target: "./itests/dup_mpool_messages_test.go"
      - test:
          name: test-itest-eth_account_abstraction
          requires:
            - build
          suite: itest-eth_account_abstraction
          target: "./itests/eth_account_abstraction_test.go"
      - test:
          name: test-itest-eth_api
          requires:
            - build
          suite: itest-eth_api
          target: "./itests/eth_api_test.go"
      - test:
          name: test-itest-eth_balance
          requires:
            - build
          suite: itest-eth_balance
          target: "./itests/eth_balance_test.go"
      - test:
          name: test-itest-eth_block_hash
          requires:
            - build
          suite: itest-eth_block_hash
          target: "./itests/eth_block_hash_test.go"
      - test:
          name: test-itest-eth_bytecode
          requires:
            - build
          suite: itest-eth_bytecode
          target: "./itests/eth_bytecode_test.go"
      - test:
          name: test-itest-eth_config
          requires:
            - build
          suite: itest-eth_config
          target: "./itests/eth_config_test.go"
      - test:
          name: test-itest-eth_conformance
          requires:
            - build
          suite: itest-eth_conformance
          target: "./itests/eth_conformance_test.go"
      - test:
          name: test-itest-eth_deploy
          requires:
            - build
          suite: itest-eth_deploy
          target: "./itests/eth_deploy_test.go"
      - test:
          name: test-itest-eth_fee_history
          requires:
            - build
          suite: itest-eth_fee_history
          target: "./itests/eth_fee_history_test.go"
      - test:
          name: test-itest-eth_filter
          requires:
            - build
          suite: itest-eth_filter
          target: "./itests/eth_filter_test.go"
      - test:
          name: test-itest-eth_hash_lookup
          requires:
            - build
          suite: itest-eth_hash_lookup
          target: "./itests/eth_hash_lookup_test.go"
      - test:
          name: test-itest-eth_transactions
          requires:
            - build
          suite: itest-eth_transactions
          target: "./itests/eth_transactions_test.go"
      - test:
          name: test-itest-fevm_address
          requires:
            - build
          suite: itest-fevm_address
          target: "./itests/fevm_address_test.go"
      - test:
          name: test-itest-fevm_events
          requires:
            - build
          suite: itest-fevm_events
          target: "./itests/fevm_events_test.go"
      - test:
          name: test-itest-fevm
          requires:
            - build
          suite: itest-fevm
          target: "./itests/fevm_test.go"
      - test:
          name: test-itest-gas_estimation
          requires:
            - build
          suite: itest-gas_estimation
          target: "./itests/gas_estimation_test.go"
      - test:
          name: test-itest-gateway
          requires:
            - build
          suite: itest-gateway
          target: "./itests/gateway_test.go"
      - test:
          name: test-itest-get_messages_in_ts
          requires:
            - build
          suite: itest-get_messages_in_ts
          target: "./itests/get_messages_in_ts_test.go"
      - test:
          name: test-itest-harmonydb
          requires:
            - build
          suite: itest-harmonydb
          target: "./itests/harmonydb_test.go"
      - test:
          name: test-itest-harmonytask
          requires:
            - build
          suite: itest-harmonytask
          target: "./itests/harmonytask_test.go"
      - test:
          name: test-itest-lite_migration
          requires:
            - build
          suite: itest-lite_migration
          target: "./itests/lite_migration_test.go"
      - test:
          name: test-itest-lookup_robust_address
          requires:
            - build
          suite: itest-lookup_robust_address
          target: "./itests/lookup_robust_address_test.go"
      - test:
          name: test-itest-mempool
          requires:
            - build
          suite: itest-mempool
          target: "./itests/mempool_test.go"
      - test:
          name: test-itest-migration
          requires:
            - build
          suite: itest-migration
          target: "./itests/migration_test.go"
      - test:
          name: test-itest-mpool_msg_uuid
          requires:
            - build
          suite: itest-mpool_msg_uuid
          target: "./itests/mpool_msg_uuid_test.go"
      - test:
          name: test-itest-mpool_push_with_uuid
          requires:
            - build
          suite: itest-mpool_push_with_uuid
          target: "./itests/mpool_push_with_uuid_test.go"
      - test:
          name: test-itest-msgindex
          requires:
            - build
          suite: itest-msgindex
          target: "./itests/msgindex_test.go"
      - test:
          name: test-itest-multisig
          requires:
            - build
          suite: itest-multisig
          target: "./itests/multisig_test.go"
      - test:
          name: test-itest-net
          requires:
            - build
          suite: itest-net
          target: "./itests/net_test.go"
      - test:
          name: test-itest-nonce
          requires:
            - build
          suite: itest-nonce
          target: "./itests/nonce_test.go"
      - test:
          name: test-itest-path_detach_redeclare
          requires:
            - build
          suite: itest-path_detach_redeclare
          target: "./itests/path_detach_redeclare_test.go"
      - test:
          name: test-itest-path_type_filters
          requires:
            - build
          suite: itest-path_type_filters
          target: "./itests/path_type_filters_test.go"
      - test:
          name: test-itest-paych_api
          requires:
            - build
          suite: itest-paych_api
          target: "./itests/paych_api_test.go"
      - test:
          name: test-itest-paych_cli
          requires:
            - build
          suite: itest-paych_cli
          target: "./itests/paych_cli_test.go"
      - test:
          name: test-itest-pending_deal_allocation
          requires:
            - build
          suite: itest-pending_deal_allocation
          target: "./itests/pending_deal_allocation_test.go"
      - test:
          name: test-itest-raft_messagesigner
          requires:
            - build
          suite: itest-raft_messagesigner
          target: "./itests/raft_messagesigner_test.go"
      - test:
          name: test-itest-remove_verifreg_datacap
          requires:
            - build
          suite: itest-remove_verifreg_datacap
          target: "./itests/remove_verifreg_datacap_test.go"
      - test:
          name: test-itest-sealing_resources
          requires:
            - build
          suite: itest-sealing_resources
          target: "./itests/sealing_resources_test.go"
      - test:
          name: test-itest-sector_finalize_early
          requires:
            - build
          suite: itest-sector_finalize_early
          target: "./itests/sector_finalize_early_test.go"
      - test:
          name: test-itest-sector_import_full
          requires:
            - build
          suite: itest-sector_import_full
          target: "./itests/sector_import_full_test.go"
      - test:
          name: test-itest-sector_import_simple
          requires:
            - build
          suite: itest-sector_import_simple
          target: "./itests/sector_import_simple_test.go"
      - test:
          name: test-itest-sector_miner_collateral
          requires:
            - build
          suite: itest-sector_miner_collateral
          target: "./itests/sector_miner_collateral_test.go"
      - test:
          name: test-itest-sector_numassign
          requires:
            - build
          suite: itest-sector_numassign
          target: "./itests/sector_numassign_test.go"
      - test:
          name: test-itest-sector_pledge
          requires:
            - build
          suite: itest-sector_pledge
          target: "./itests/sector_pledge_test.go"
          resource_class: 2xlarge
          get-params: true
          
      - test:
          name: test-itest-sector_terminate
          requires:
            - build
          suite: itest-sector_terminate
          target: "./itests/sector_terminate_test.go"
      - test:
          name: test-itest-sector_unseal
          requires:
            - build
          suite: itest-sector_unseal
          target: "./itests/sector_unseal_test.go"
      - test:
          name: test-itest-self_sent_txn
          requires:
            - build
          suite: itest-self_sent_txn
          target: "./itests/self_sent_txn_test.go"
      - test:
          name: test-itest-splitstore
          requires:
            - build
          suite: itest-splitstore
          target: "./itests/splitstore_test.go"
      - test:
          name: test-itest-verifreg
          requires:
            - build
          suite: itest-verifreg
          target: "./itests/verifreg_test.go"
      - test:
          name: test-itest-wdpost_config
          requires:
            - build
          suite: itest-wdpost_config
          target: "./itests/wdpost_config_test.go"
      - test:
          name: test-itest-wdpost_dispute
          requires:
            - build
          suite: itest-wdpost_dispute
          target: "./itests/wdpost_dispute_test.go"
      - test:
          name: test-itest-wdpost_no_miner_storage
          requires:
            - build
          suite: itest-wdpost_no_miner_storage
          target: "./itests/wdpost_no_miner_storage_test.go"
      - test:
          name: test-itest-wdpost
          requires:
            - build
          suite: itest-wdpost
          target: "./itests/wdpost_test.go"
          get-params: true
          
      - test:
          name: test-itest-wdpost_worker_config
          requires:
            - build
          suite: itest-wdpost_worker_config
          target: "./itests/wdpost_worker_config_test.go"
          resource_class: 2xlarge
      - test:
          name: test-itest-worker
          requires:
            - build
          suite: itest-worker
          target: "./itests/worker_test.go"
          resource_class: 2xlarge
      - test:
          name: test-itest-worker_upgrade
          requires:
            - build
          suite: itest-worker_upgrade
          target: "./itests/worker_upgrade_test.go"
      - test:
          name: test-unit-cli
          requires:
            - build
          suite: utest-unit-cli
          target: "./cli/... ./cmd/... ./api/..."
          resource_class: 2xlarge
          get-params: true
      - test:
          name: test-unit-node
          requires:
            - build
          suite: utest-unit-node
          target: "./node/..."
      - test:
          name: test-unit-rest
          requires:
            - build
          suite: utest-unit-rest
          target: "./blockstore/... ./build/... ./chain/... ./conformance/... ./gateway/... ./journal/... ./lib/... ./markets/... ./paychmgr/... ./tools/..."
          resource_class: 2xlarge
      - test:
          name: test-unit-storage
          requires:
            - build
          suite: utest-unit-storage
          target: "./storage/... ./extern/..."
          get-params: true
      - test:
          go-test-flags: "-run=TestMulticoreSDR"
          requires:
            - build
          suite: multicore-sdr-check
          target: "./storage/sealer/ffiwrapper"
          proofs-log-test: "1"
      - test-conformance:
          requires:
            - build
          suite: conformance
          target: "./conformance"

  release:
    jobs:
      - build-linux-amd64:
          name: "Build ( linux / amd64 )"
          filters:
            branches:
              only:
                - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
                - /^ci\/.*$/
            tags:
              only:
                - /^v\d+\.\d+\.\d+(-rc\d+)?$/
      - build-darwin-amd64:
          name: "Build ( darwin / amd64 )"
          filters:
            branches:
              only:
                - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
                - /^ci\/.*$/
            tags:
              only:
                - /^v\d+\.\d+\.\d+(-rc\d+)?$/
      - build-darwin-arm64:
          name: "Build ( darwin / arm64 )"
          filters:
            branches:
              only:
                - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
                - /^ci\/.*$/
            tags:
              only:
                - /^v\d+\.\d+\.\d+(-rc\d+)?$/
      - release:
          name: "Release"
          requires:
            - "Build ( darwin / amd64 )"
            - "Build ( linux / amd64 )"
            - "Build ( darwin / arm64 )"
          filters:
            branches:
              ignore:
                - /^.*$/
            tags:
              only:
                - /^v\d+\.\d+\.\d+(-rc\d+)?$/
      - release:
          name: "Release (dry-run)"
          dry-run: true
          requires:
            - "Build ( darwin / amd64 )"
            - "Build ( linux / amd64 )"
            - "Build ( darwin / arm64 )"
          filters:
            branches:
              only:
                - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
                - /^ci\/.*$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / stable / mainnet)"
          image: lotus-all-in-one
          channel: stable
          network: mainnet
          push: true
          filters:
            branches:
              ignore:
                - /.*/
            tags:
              only:
                - /^v\d+\.\d+\.\d+$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / candidate / mainnet)"
          image: lotus-all-in-one
          channel: candidate
          network: mainnet
          push: true
          filters:
            branches:
              ignore:
                - /.*/
            tags:
              only:
                - /^v\d+\.\d+\.\d+-rc\d+$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / edge / mainnet)"
          image: lotus-all-in-one
          channel: master
          network: mainnet
          push: true
          filters:
            branches:
              only:
                - master
      - build-docker:
          name: "Docker build (lotus-all-in-one / mainnet)"
          image: lotus-all-in-one
          network: mainnet
          push: false
          filters:
            branches:
              only:
                - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / stable / butterflynet)"
          image: lotus-all-in-one
          channel: stable
          network: butterflynet
          push: true
          filters:
            branches:
              ignore:
                - /.*/
            tags:
              only:
                - /^v\d+\.\d+\.\d+$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / candidate / butterflynet)"
          image: lotus-all-in-one
          channel: candidate
          network: butterflynet
          push: true
          filters:
            branches:
              ignore:
                - /.*/
            tags:
              only:
                - /^v\d+\.\d+\.\d+-rc\d+$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / edge / butterflynet)"
          image: lotus-all-in-one
          channel: master
          network: butterflynet
          push: true
          filters:
            branches:
              only:
                - master
      - build-docker:
          name: "Docker build (lotus-all-in-one / butterflynet)"
          image: lotus-all-in-one
          network: butterflynet
          push: false
          filters:
            branches:
              only:
                - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / stable / calibnet)"
          image: lotus-all-in-one
          channel: stable
          network: calibnet
          push: true
          filters:
            branches:
              ignore:
                - /.*/
            tags:
              only:
                - /^v\d+\.\d+\.\d+$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / candidate / calibnet)"
          image: lotus-all-in-one
          channel: candidate
          network: calibnet
          push: true
          filters:
            branches:
              ignore:
                - /.*/
            tags:
              only:
                - /^v\d+\.\d+\.\d+-rc\d+$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / edge / calibnet)"
          image: lotus-all-in-one
          channel: master
          network: calibnet
          push: true
          filters:
            branches:
              only:
                - master
      - build-docker:
          name: "Docker build (lotus-all-in-one / calibnet)"
          image: lotus-all-in-one
          network: calibnet
          push: false
          filters:
            branches:
              only:
                - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / stable / debug)"
          image: lotus-all-in-one
          channel: stable
          network: debug
          push: true
          filters:
            branches:
              ignore:
                - /.*/
            tags:
              only:
                - /^v\d+\.\d+\.\d+$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / candidate / debug)"
          image: lotus-all-in-one
          channel: candidate
          network: debug
          push: true
          filters:
            branches:
              ignore:
                - /.*/
            tags:
              only:
                - /^v\d+\.\d+\.\d+-rc\d+$/
      - build-docker:
          name: "Docker push (lotus-all-in-one / edge / debug)"
          image: lotus-all-in-one
          channel: master
          network: debug
          push: true
          filters:
            branches:
              only:
                - master
      - build-docker:
          name: "Docker build (lotus-all-in-one / debug)"
          image: lotus-all-in-one
          network: debug
          push: false
          filters:
            branches:
              only:
                - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/
      - build-docker:
          name: "Docker push (lotus / stable / mainnet)"
          image: lotus
          channel: stable
          network: mainnet
          push: true
          filters:
            branches:
              ignore:
                - /.*/
            tags:
              only:
                - /^v\d+\.\d+\.\d+$/
      - build-docker:
          name: "Docker push (lotus / candidate / mainnet)"
          image: lotus
          channel: candidate
          network: mainnet
          push: true
          filters:
            branches:
              ignore:
                - /.*/
            tags:
              only:
                - /^v\d+\.\d+\.\d+-rc\d+$/
      - build-docker:
          name: "Docker push (lotus / master / mainnet)"
          image: lotus
          channel: master
          network: mainnet
          push: true
          filters:
            branches:
              only:
                - master
      - build-docker:
          name: "Docker build (lotus / mainnet)"
          image: lotus
          network: mainnet
          push: false
          filters:
            branches:
              only:
                - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/

  nightly:
    triggers:
      - schedule:
          cron: "0 0 * * *"
          filters:
            branches:
              only:
                - master
    jobs:
      - build-docker:
          name: "Docker (lotus-all-in-one / nightly / mainnet)"
          image: lotus-all-in-one
          channel: nightly
          network: mainnet
          push: true
      - build-docker:
          name: "Docker (lotus-all-in-one / nightly / butterflynet)"
          image: lotus-all-in-one
          channel: nightly
          network: butterflynet
          push: true
      - build-docker:
          name: "Docker (lotus-all-in-one / nightly / calibnet)"
          image: lotus-all-in-one
          channel: nightly
          network: calibnet
          push: true
      - build-docker:
          name: "Docker (lotus-all-in-one / nightly / debug)"
          image: lotus-all-in-one
          channel: nightly
          network: debug
          push: true