version: 2.1
|
|
|
|
executors:
|
|
golang:
|
|
docker:
|
|
- image: tendermintdev/docker-tendermint-build
|
|
working_directory: /go/src/github.com/tendermint/tendermint
|
|
environment:
|
|
GOBIN: /tmp/bin
|
|
release:
|
|
machine: true
|
|
docs:
|
|
docker:
|
|
- image: tendermintdev/jq_curl
|
|
environment:
|
|
AWS_REGION: us-east-1
|
|
|
|
commands:
|
|
run_test:
|
|
parameters:
|
|
script_path:
|
|
type: string
|
|
steps:
|
|
- attach_workspace:
|
|
at: /tmp/bin
|
|
- restore_cache:
|
|
name: "Restore source code cache"
|
|
keys:
|
|
- go-src-v1-{{ .Revision }}
|
|
- checkout
|
|
- restore_cache:
|
|
name: "Restore go modules cache"
|
|
keys:
|
|
- go-mod-v1-{{ checksum "go.sum" }}
|
|
- run:
|
|
name: "Running test"
|
|
command: |
|
|
bash << parameters.script_path >>
|
|
|
|
jobs:
|
|
setup_dependencies:
|
|
executor: golang
|
|
steps:
|
|
- checkout
|
|
- restore_cache:
|
|
name: "Restore go modules cache"
|
|
keys:
|
|
- go-mod-v1-{{ checksum "go.sum" }}
|
|
- run:
|
|
command: |
|
|
mkdir -p /tmp/bin
|
|
- run:
|
|
name: Cache go modules
|
|
command: make go-mod-cache
|
|
- run:
|
|
name: tools
|
|
command: make tools
|
|
- run:
|
|
name: "Build binaries"
|
|
command: make install install_abci
|
|
- save_cache:
|
|
name: "Save go modules cache"
|
|
key: go-mod-v1-{{ checksum "go.sum" }}
|
|
paths:
|
|
- "/go/pkg/mod"
|
|
- save_cache:
|
|
name: "Save source code cache"
|
|
key: go-src-v1-{{ .Revision }}
|
|
paths:
|
|
- ".git"
|
|
- persist_to_workspace:
|
|
root: "/tmp/bin"
|
|
paths:
|
|
- "."
|
|
|
|
test_abci_apps:
|
|
executor: golang
|
|
steps:
|
|
- run_test:
|
|
script_path: abci/tests/test_app/test.sh
|
|
|
|
# if this test fails, fix it and update the docs at:
|
|
# https://github.com/tendermint/tendermint/blob/master/docs/abci-cli.md
|
|
test_abci_cli:
|
|
executor: golang
|
|
steps:
|
|
- run_test:
|
|
script_path: abci/tests/test_cli/test.sh
|
|
|
|
test_apps:
|
|
executor: golang
|
|
steps:
|
|
- run_test:
|
|
script_path: test/app/test.sh
|
|
|
|
test_persistence:
|
|
executor: golang
|
|
steps:
|
|
- run_test:
|
|
script_path: test/persist/test_failure_indices.sh
|
|
|
|
test_cover:
|
|
executor: golang
|
|
parallelism: 4
|
|
steps:
|
|
- restore_cache:
|
|
name: "Restore source code cache"
|
|
keys:
|
|
- go-src-v1-{{ .Revision }}
|
|
- checkout
|
|
- restore_cache:
|
|
name: "Restore go module cache"
|
|
keys:
|
|
- go-mod-v2-{{ checksum "go.sum" }}
|
|
- run:
|
|
name: "Run tests"
|
|
command: |
|
|
export VERSION="$(git describe --tags --long | sed 's/v\(.*\)/\1/')"
|
|
export GO111MODULE=on
|
|
mkdir -p /tmp/logs /tmp/workspace/profiles
|
|
for pkg in $(go list github.com/tendermint/tendermint/... | circleci tests split --split-by=timings); do
|
|
id=$(basename "$pkg")
|
|
go test -v -timeout 5m -mod=readonly -race -coverprofile=/tmp/workspace/profiles/$id.out -covermode=atomic "$pkg" | tee "/tmp/logs/$id-$RANDOM.log"
|
|
done
|
|
- persist_to_workspace:
|
|
root: /tmp/workspace
|
|
paths:
|
|
- "profiles/*"
|
|
- store_artifacts:
|
|
path: /tmp/logs
|
|
|
|
localnet:
|
|
working_directory: /home/circleci/.go_workspace/src/github.com/tendermint/tendermint
|
|
machine:
|
|
image: circleci/classic:latest
|
|
environment:
|
|
GOBIN: /home/circleci/.go_workspace/bin
|
|
GOPATH: /home/circleci/.go_workspace/
|
|
GOOS: linux
|
|
GOARCH: amd64
|
|
parallelism: 1
|
|
steps:
|
|
- checkout
|
|
- run:
|
|
name: run localnet and exit on failure
|
|
command: |
|
|
set -x
|
|
docker run --rm -v "$PWD":/go/src/github.com/tendermint/tendermint -w /go/src/github.com/tendermint/tendermint golang make build-linux
|
|
make localnet-start &
|
|
./scripts/localnet-blocks-test.sh 40 5 10 localhost
|
|
|
|
test_p2p:
|
|
environment:
|
|
GOBIN: /home/circleci/.go_workspace/bin
|
|
GOPATH: /home/circleci/.go_workspace
|
|
machine:
|
|
image: circleci/classic:latest
|
|
steps:
|
|
- checkout
|
|
- run: mkdir -p $GOPATH/src/github.com/tendermint
|
|
- run: ln -sf /home/circleci/project $GOPATH/src/github.com/tendermint/tendermint
|
|
- run: bash test/p2p/circleci.sh
|
|
- store_artifacts:
|
|
path: /home/circleci/project/test/p2p/logs
|
|
|
|
upload_coverage:
|
|
executor: golang
|
|
steps:
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- restore_cache:
|
|
name: "Restore source code cache"
|
|
keys:
|
|
- go-src-v1-{{ .Revision }}
|
|
- checkout
|
|
- restore_cache:
|
|
name: "Restore go module cache"
|
|
keys:
|
|
- go-mod-v2-{{ checksum "go.sum" }}
|
|
- run:
|
|
name: gather
|
|
command: |
|
|
echo "mode: atomic" > coverage.txt
|
|
for prof in $(ls /tmp/workspace/profiles/); do
|
|
tail -n +2 /tmp/workspace/profiles/"$prof" >> coverage.txt
|
|
done
|
|
- run:
|
|
name: upload
|
|
command: bash .circleci/codecov.sh -f coverage.txt
|
|
|
|
deploy_docs:
|
|
executor: docs
|
|
steps:
|
|
- restore_cache:
|
|
name: "Restore source code cache"
|
|
keys:
|
|
- go-src-v1-{{ .Revision }}
|
|
- checkout
|
|
- run:
|
|
name: Trigger website build
|
|
command: |
|
|
curl --silent \
|
|
--show-error \
|
|
-X POST \
|
|
--header "Content-Type: application/json" \
|
|
-d "{\"branch\": \"$CIRCLE_BRANCH\"}" \
|
|
"https://circleci.com/api/v1.1/project/github/$CIRCLE_PROJECT_USERNAME/$WEBSITE_REPO_NAME/build?circle-token=$TENDERBOT_API_TOKEN" > response.json
|
|
|
|
RESULT=`jq -r '.status' response.json`
|
|
MESSAGE=`jq -r '.message' response.json`
|
|
|
|
if [[ ${RESULT} == "null" ]] || [[ ${RESULT} -ne "200" ]]; then
|
|
echo "CircleCI API call failed: $MESSAGE"
|
|
exit 1
|
|
else
|
|
echo "Website build started"
|
|
fi
|
|
|
|
prepare_build:
|
|
executor: golang
|
|
steps:
|
|
- restore_cache:
|
|
name: "Restore source code cache"
|
|
keys:
|
|
- go-src-v1-{{ .Revision }}
|
|
- checkout
|
|
- run:
|
|
name: Get next release number
|
|
command: |
|
|
export LAST_TAG="`git describe --tags --abbrev=0 --match "${CIRCLE_BRANCH}.*"`"
|
|
echo "Last tag: ${LAST_TAG}"
|
|
if [ -z "${LAST_TAG}" ]; then
|
|
export LAST_TAG="${CIRCLE_BRANCH}"
|
|
echo "Last tag not found. Possibly fresh branch or feature branch. Setting ${LAST_TAG} as tag."
|
|
fi
|
|
export NEXT_TAG="`python -u scripts/release_management/bump-semver.py --version "${LAST_TAG}"`"
|
|
echo "Next tag: ${NEXT_TAG}"
|
|
echo "export CIRCLE_TAG=\"${NEXT_TAG}\"" > release-version.source
|
|
- run:
|
|
name: Build dependencies
|
|
command: make tools
|
|
- persist_to_workspace:
|
|
root: .
|
|
paths:
|
|
- "release-version.source"
|
|
- save_cache:
|
|
key: v2-release-deps-{{ checksum "go.sum" }}
|
|
paths:
|
|
- "/go/pkg/mod"
|
|
|
|
build_artifacts:
|
|
executor: golang
|
|
parallelism: 4
|
|
steps:
|
|
- restore_cache:
|
|
name: "Restore source code cache"
|
|
keys:
|
|
- go-src-v1-{{ .Revision }}
|
|
- checkout
|
|
- restore_cache:
|
|
name: "Restore release dependencies cache"
|
|
keys:
|
|
- v2-release-deps-{{ checksum "go.sum" }}
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- run:
|
|
name: Build artifact
|
|
command: |
|
|
# Setting CIRCLE_TAG because we do not tag the release ourselves.
|
|
source /tmp/workspace/release-version.source
|
|
if test ${CIRCLE_NODE_INDEX:-0} == 0 ;then export GOOS=linux GOARCH=amd64 && export OUTPUT=build/tendermint_${GOOS}_${GOARCH} && make build && python -u scripts/release_management/zip-file.py ;fi
|
|
if test ${CIRCLE_NODE_INDEX:-0} == 1 ;then export GOOS=darwin GOARCH=amd64 && export OUTPUT=build/tendermint_${GOOS}_${GOARCH} && make build && python -u scripts/release_management/zip-file.py ;fi
|
|
if test ${CIRCLE_NODE_INDEX:-0} == 2 ;then export GOOS=windows GOARCH=amd64 && export OUTPUT=build/tendermint_${GOOS}_${GOARCH} && make build && python -u scripts/release_management/zip-file.py ;fi
|
|
if test ${CIRCLE_NODE_INDEX:-0} == 3 ;then export GOOS=linux GOARCH=arm && export OUTPUT=build/tendermint_${GOOS}_${GOARCH} && make build && python -u scripts/release_management/zip-file.py ;fi
|
|
- persist_to_workspace:
|
|
root: build
|
|
paths:
|
|
- "*.zip"
|
|
- "tendermint_linux_amd64"
|
|
|
|
release_artifacts:
|
|
executor: golang
|
|
steps:
|
|
- restore_cache:
|
|
name: "Restore source code cache"
|
|
keys:
|
|
- go-src-v1-{{ .Revision }}
|
|
- checkout
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- run:
|
|
name: "Deploy to GitHub"
|
|
command: |
|
|
# Setting CIRCLE_TAG because we do not tag the release ourselves.
|
|
source /tmp/workspace/release-version.source
|
|
echo "---"
|
|
ls -la /tmp/workspace/*.zip
|
|
echo "---"
|
|
python -u scripts/release_management/sha-files.py
|
|
echo "---"
|
|
cat /tmp/workspace/SHA256SUMS
|
|
echo "---"
|
|
export RELEASE_ID="`python -u scripts/release_management/github-draft.py`"
|
|
echo "Release ID: ${RELEASE_ID}"
|
|
#Todo: Parallelize uploads
|
|
export GOOS=linux GOARCH=amd64 && python -u scripts/release_management/github-upload.py --id "${RELEASE_ID}"
|
|
export GOOS=darwin GOARCH=amd64 && python -u scripts/release_management/github-upload.py --id "${RELEASE_ID}"
|
|
export GOOS=windows GOARCH=amd64 && python -u scripts/release_management/github-upload.py --id "${RELEASE_ID}"
|
|
export GOOS=linux GOARCH=arm && python -u scripts/release_management/github-upload.py --id "${RELEASE_ID}"
|
|
python -u scripts/release_management/github-upload.py --file "/tmp/workspace/SHA256SUMS" --id "${RELEASE_ID}"
|
|
python -u scripts/release_management/github-publish.py --id "${RELEASE_ID}"
|
|
|
|
release_docker:
|
|
machine:
|
|
image: ubuntu-1604:201903-01
|
|
steps:
|
|
- restore_cache:
|
|
name: "Restore source code cache"
|
|
keys:
|
|
- go-src-v1-{{ .Revision }}
|
|
- checkout
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- run:
|
|
name: "Deploy to Docker Hub"
|
|
command: |
|
|
# Setting CIRCLE_TAG because we do not tag the release ourselves.
|
|
source /tmp/workspace/release-version.source
|
|
cp /tmp/workspace/tendermint_linux_amd64 DOCKER/tendermint
|
|
docker build --label="tendermint" --tag="tendermint/tendermint:${CIRCLE_TAG}" --tag="tendermint/tendermint:latest" "DOCKER"
|
|
docker login -u "${DOCKERHUB_USER}" --password-stdin \<<< "${DOCKERHUB_PASS}"
|
|
docker push "tendermint/tendermint"
|
|
docker logout
|
|
|
|
reproducible_builds:
|
|
executor: golang
|
|
steps:
|
|
- attach_workspace:
|
|
at: /tmp/workspace
|
|
- restore_cache:
|
|
name: "Restore source code cache"
|
|
keys:
|
|
- go-src-v1-{{ .Revision }}
|
|
- checkout
|
|
- setup_remote_docker:
|
|
docker_layer_caching: true
|
|
- run:
|
|
name: Build tendermint
|
|
no_output_timeout: 20m
|
|
command: |
|
|
sudo apt-get install -y ruby
|
|
bash -x ./scripts/gitian-build.sh all
|
|
for os in darwin linux windows; do
|
|
cp gitian-build-${os}/result/tendermint-${os}-res.yml .
|
|
cp gitian-build-${os}/build/out/tendermint-*.tar.gz .
|
|
rm -rf gitian-build-${os}/
|
|
done
|
|
- store_artifacts:
|
|
path: /go/src/github.com/tendermint/tendermint/tendermint-darwin-res.yml
|
|
- store_artifacts:
|
|
path: /go/src/github.com/tendermint/tendermint/tendermint-linux-res.yml
|
|
- store_artifacts:
|
|
path: /go/src/github.com/tendermint/tendermint/tendermint-windows-res.yml
|
|
- store_artifacts:
|
|
path: /go/src/github.com/tendermint/tendermint/tendermint-*.tar.gz
|
|
|
|
# Test RPC implementation against the swagger documented specs
|
|
contract_tests:
|
|
working_directory: /home/circleci/.go_workspace/src/github.com/tendermint/tendermint
|
|
machine:
|
|
image: circleci/classic:latest
|
|
environment:
|
|
GOBIN: /home/circleci/.go_workspace/bin
|
|
GOPATH: /home/circleci/.go_workspace/
|
|
GOOS: linux
|
|
GOARCH: amd64
|
|
parallelism: 1
|
|
steps:
|
|
- checkout
|
|
- run:
|
|
name: Test RPC endpoints against swagger documentation
|
|
command: |
|
|
set -x
|
|
export PATH=~/.local/bin:$PATH
|
|
|
|
# install node and dredd
|
|
./scripts/get_nodejs.sh
|
|
|
|
# build the binaries with a proper version of Go
|
|
docker run --rm -v "$PWD":/go/src/github.com/tendermint/tendermint -w /go/src/github.com/tendermint/tendermint golang make build-linux build-contract-tests-hooks
|
|
|
|
# This docker image works with go 1.7, we can install here the hook handler that contract-tests is going to use
|
|
go get github.com/snikch/goodman/cmd/goodman
|
|
make contract-tests
|
|
|
|
workflows:
|
|
version: 2
|
|
test-suite:
|
|
jobs:
|
|
- deploy_docs:
|
|
filters:
|
|
branches:
|
|
only:
|
|
- master
|
|
- setup_dependencies
|
|
- test_abci_apps:
|
|
requires:
|
|
- setup_dependencies
|
|
- test_abci_cli:
|
|
requires:
|
|
- setup_dependencies
|
|
- test_apps:
|
|
requires:
|
|
- setup_dependencies
|
|
- test_cover:
|
|
requires:
|
|
- setup_dependencies
|
|
- test_persistence:
|
|
requires:
|
|
- setup_dependencies
|
|
- localnet:
|
|
requires:
|
|
- setup_dependencies
|
|
- test_p2p
|
|
- upload_coverage:
|
|
requires:
|
|
- test_cover
|
|
- reproducible_builds:
|
|
filters:
|
|
branches:
|
|
only:
|
|
- master
|
|
- /v[0-9]+\.[0-9]+/
|
|
- contract_tests:
|
|
requires:
|
|
- setup_dependencies
|
|
|
|
release:
|
|
jobs:
|
|
- prepare_build
|
|
- build_artifacts:
|
|
requires:
|
|
- prepare_build
|
|
- release_artifacts:
|
|
requires:
|
|
- prepare_build
|
|
- build_artifacts
|
|
filters:
|
|
branches:
|
|
only:
|
|
- /v[0-9]+\.[0-9]+/
|
|
- release_docker:
|
|
requires:
|
|
- prepare_build
|
|
- build_artifacts
|
|
filters:
|
|
branches:
|
|
only:
|
|
- /v[0-9]+\.[0-9]+/
|