mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-03 03:35:19 +00:00
Prepare main to become new default branch (#9095)
* Update Makefile with changes from #7372 Signed-off-by: Thane Thomson <connect@thanethomson.com> * Sync main GitHub config with master and update Signed-off-by: Thane Thomson <connect@thanethomson.com> * Remove unnecesary dot folders Signed-off-by: Thane Thomson <connect@thanethomson.com> * Sync dotfiles Signed-off-by: Thane Thomson <connect@thanethomson.com> * Remove unused Jepsen tests for now Signed-off-by: Thane Thomson <connect@thanethomson.com> * tools: remove k8s (#6625) Remove mintnet as discussed on team call. closes #1941 * Restore nightly fuzz testing of P2P addrbook and pex Signed-off-by: Thane Thomson <connect@thanethomson.com> * Fix YAML lints Signed-off-by: Thane Thomson <connect@thanethomson.com> * Fix YAML formatting nits Signed-off-by: Thane Thomson <connect@thanethomson.com> * More YAML nits Signed-off-by: Thane Thomson <connect@thanethomson.com> * github: fix linter configuration errors and occluded errors (#6400) * Minor fixes to OpenAPI spec to sync with structs on main Signed-off-by: Thane Thomson <connect@thanethomson.com> * Remove .github/auto-comment.yml - does not appear to be used Signed-off-by: Thane Thomson <connect@thanethomson.com> * Add issue config with link to discussions Signed-off-by: Thane Thomson <connect@thanethomson.com> * Adjust issue/PR templates to suit current process Signed-off-by: Thane Thomson <connect@thanethomson.com> * Remove unused RC branch config from release workflow Signed-off-by: Thane Thomson <connect@thanethomson.com> * Fix wildcard matching in build jobs config Signed-off-by: Thane Thomson <connect@thanethomson.com> * Document markdownlint config Signed-off-by: Thane Thomson <connect@thanethomson.com> * Restore manual E2E test group config Signed-off-by: Thane Thomson <connect@thanethomson.com> * Document linter workflow with local execution instructions Signed-off-by: Thane Thomson <connect@thanethomson.com> * Document and fix minor nit in Super-Linter markdownlint config Signed-off-by: Thane Thomson <connect@thanethomson.com> * Update .github/ISSUE_TEMPLATE/bug-report.md Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com> * Update pull request template to add language around discussions/issues Signed-off-by: Thane Thomson <connect@thanethomson.com> * .golangci.yml: Deleted commented-out lines Signed-off-by: Thane Thomson <connect@thanethomson.com> * ci: Drop "-2" from e2e-nightly-fail workflow Signed-off-by: Thane Thomson <connect@thanethomson.com> * Address triviality concern in PR template Signed-off-by: Thane Thomson <connect@thanethomson.com> Co-authored-by: Marko <marbar3778@yahoo.com> Co-authored-by: Sam Kleinman <garen@tychoish.com> Co-authored-by: William Banfield <4561443+williambanfield@users.noreply.github.com>
This commit is contained in:
@@ -1,168 +0,0 @@
|
|||||||
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/docker-website-deployment
|
|
||||||
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:
|
|
||||||
- "."
|
|
||||||
|
|
||||||
deploy_docs:
|
|
||||||
executor: docs
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: "Pull versions"
|
|
||||||
command: git fetch origin v0.32 v0.33
|
|
||||||
- run:
|
|
||||||
name: "Build docs"
|
|
||||||
command: make build-docs
|
|
||||||
- run:
|
|
||||||
name: "Sync to S3"
|
|
||||||
command: make sync-docs
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
||||||
# # 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
|
|
||||||
docs:
|
|
||||||
jobs:
|
|
||||||
- deploy_docs:
|
|
||||||
context: tendermint-docs
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
tags:
|
|
||||||
only:
|
|
||||||
- /^v.*/
|
|
||||||
- deploy_docs:
|
|
||||||
context: tendermint-docs-staging
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- docs-staging
|
|
||||||
# - contract_tests:
|
|
||||||
# requires:
|
|
||||||
# - setup_dependencies
|
|
||||||
11
.github/ISSUE_TEMPLATE/bug-report.md
vendored
11
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@@ -1,13 +1,18 @@
|
|||||||
---
|
---
|
||||||
name: Bug Report
|
name: Bug report
|
||||||
about: Create a report to help us squash bugs!
|
about: Create a report to help us squash bugs!
|
||||||
|
|
||||||
---
|
---
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
Please fill in as much of the template below as you can.
|
Please fill in as much of the template below as you can.
|
||||||
|
|
||||||
Be ready for followup questions, and please respond in a timely
|
If you have general questions, please create a new discussion:
|
||||||
manner. We might ask you to provide additional logs and data (tendermint & app).
|
https://github.com/tendermint/tendermint/discussions
|
||||||
|
|
||||||
|
Be ready for followup questions, and please respond in a timely manner. We might
|
||||||
|
ask you to provide additional logs and data (tendermint & app).
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
**Tendermint version** (use `tendermint version` or `git rev-parse --verify HEAD` if installed from source):
|
**Tendermint version** (use `tendermint version` or `git rev-parse --verify HEAD` if installed from source):
|
||||||
|
|||||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: Ask a question
|
||||||
|
url: https://github.com/tendermint/tendermint/discussions
|
||||||
|
about: Please ask and answer questions here
|
||||||
11
.github/ISSUE_TEMPLATE/feature-request.md
vendored
11
.github/ISSUE_TEMPLATE/feature-request.md
vendored
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
name: Feature Request
|
name: Feature request
|
||||||
about: Create a proposal to request a feature
|
about: Create a proposal to request a feature
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -25,12 +25,3 @@ Are there any disadvantages of including this feature? -->
|
|||||||
## Proposal
|
## Proposal
|
||||||
|
|
||||||
<!-- Detailed description of requirements of implementation -->
|
<!-- Detailed description of requirements of implementation -->
|
||||||
|
|
||||||
____
|
|
||||||
|
|
||||||
#### For Admin Use
|
|
||||||
|
|
||||||
- [ ] Not duplicate issue
|
|
||||||
- [ ] Appropriate labels applied
|
|
||||||
- [ ] Appropriate contributors tagged
|
|
||||||
- [ ] Contributor assigned/self-assigned
|
|
||||||
|
|||||||
11
.github/ISSUE_TEMPLATE/proposal.md
vendored
11
.github/ISSUE_TEMPLATE/proposal.md
vendored
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
name: Protocol Change Proposal
|
name: Protocol change proposal
|
||||||
about: Create a proposal to request a change to the protocol
|
about: Create a proposal to request a change to the protocol
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -26,12 +26,3 @@ Are there any disadvantages of including this change? -->
|
|||||||
## Proposal
|
## Proposal
|
||||||
|
|
||||||
<!-- Detailed description of requirements of implementation -->
|
<!-- Detailed description of requirements of implementation -->
|
||||||
|
|
||||||
____
|
|
||||||
|
|
||||||
#### For Admin Use
|
|
||||||
|
|
||||||
- [ ] Not duplicate issue
|
|
||||||
- [ ] Appropriate labels applied
|
|
||||||
- [ ] Appropriate contributors tagged
|
|
||||||
- [ ] Contributor assigned/self-assigned
|
|
||||||
|
|||||||
33
.github/PULL_REQUEST_TEMPLATE.md
vendored
33
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,7 +1,32 @@
|
|||||||
## Description
|
<!--
|
||||||
|
|
||||||
_Please add a description of the changes that this PR introduces and the files that
|
Please add a reference to the issue that this PR addresses and indicate which
|
||||||
are the most critical to review._
|
files are most critical to review. If it fully addresses a particular issue,
|
||||||
|
please include "Closes #XXX" (where "XXX" is the issue number).
|
||||||
|
|
||||||
Closes: #XXX
|
If this PR is non-trivial/large/complex, please ensure that you have either
|
||||||
|
created an issue that the team's had a chance to respond to, or had some
|
||||||
|
discussion with the team prior to submitting substantial pull requests. The team
|
||||||
|
can be reached via GitHub Discussions or the Cosmos Network Discord server in
|
||||||
|
the #tendermint-core channel. GitHub Discussions is preferred over Discord as it
|
||||||
|
allows us to keep track of conversations topically.
|
||||||
|
https://github.com/tendermint/tendermint/discussions
|
||||||
|
|
||||||
|
If the work in this PR is not aligned with the team's current priorities, please
|
||||||
|
be advised that it may take some time before it is merged - especially if it has
|
||||||
|
not yet been discussed with the team.
|
||||||
|
|
||||||
|
See the project board for the team's current priorities:
|
||||||
|
https://github.com/orgs/tendermint/projects/15/views/5
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### PR checklist
|
||||||
|
|
||||||
|
- [ ] Tests written/updated, or no tests needed
|
||||||
|
- [ ] `CHANGELOG_PENDING.md` updated, or no changelog entry needed
|
||||||
|
- [ ] Updated relevant documentation (`docs/`) and code comments, or no
|
||||||
|
documentation updates needed
|
||||||
|
|
||||||
|
|||||||
16
.github/auto-comment.yml
vendored
16
.github/auto-comment.yml
vendored
@@ -1,16 +0,0 @@
|
|||||||
pullRequestOpened: |
|
|
||||||
:wave: Thanks for creating a PR!
|
|
||||||
|
|
||||||
Before we can merge this PR, please make sure that all the following items have been
|
|
||||||
checked off. If any of the checklist items are not applicable, please leave them but
|
|
||||||
write a little note why.
|
|
||||||
|
|
||||||
- [ ] Wrote tests
|
|
||||||
- [ ] Updated CHANGELOG_PENDING.md
|
|
||||||
- [ ] Linked to Github issue with discussion and accepted design OR link to spec that describes this work.
|
|
||||||
- [ ] Updated relevant documentation (`docs/`) and code comments
|
|
||||||
- [ ] Re-reviewed `Files changed` in the Github PR explorer
|
|
||||||
- [ ] Applied Appropriate Labels
|
|
||||||
|
|
||||||
|
|
||||||
Thank you for your contribution to Tendermint! :rocket:
|
|
||||||
25
.github/codecov.yml
vendored
Normal file
25
.github/codecov.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
coverage:
|
||||||
|
precision: 2
|
||||||
|
round: down
|
||||||
|
range: "70...100"
|
||||||
|
status:
|
||||||
|
project:
|
||||||
|
default:
|
||||||
|
threshold: 20%
|
||||||
|
patch: off
|
||||||
|
changes: off
|
||||||
|
|
||||||
|
github_checks:
|
||||||
|
annotations: false
|
||||||
|
|
||||||
|
comment: false
|
||||||
|
|
||||||
|
ignore:
|
||||||
|
- "docs"
|
||||||
|
- "DOCKER"
|
||||||
|
- "scripts"
|
||||||
|
- "**/*.pb.go"
|
||||||
|
- "libs/pubsub/query/query.peg.go"
|
||||||
|
- "*.md"
|
||||||
|
- "*.rst"
|
||||||
|
- "*.yml"
|
||||||
51
.github/dependabot.yml
vendored
Normal file
51
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
target-branch: "main"
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
labels:
|
||||||
|
- T:dependencies
|
||||||
|
- S:automerge
|
||||||
|
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
target-branch: "v0.34.x"
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
labels:
|
||||||
|
- T:dependencies
|
||||||
|
- S:automerge
|
||||||
|
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: "/docs"
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
|
||||||
|
###################################
|
||||||
|
##
|
||||||
|
## Update All Go Dependencies
|
||||||
|
|
||||||
|
- package-ecosystem: gomod
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
target-branch: "main"
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
labels:
|
||||||
|
- T:dependencies
|
||||||
|
- S:automerge
|
||||||
|
|
||||||
|
- package-ecosystem: gomod
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
target-branch: "v0.34.x"
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
labels:
|
||||||
|
- T:dependencies
|
||||||
|
- S:automerge
|
||||||
6
.github/issue_template.md
vendored
Normal file
6
.github/issue_template.md
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
If you want to ask a general question, please create a new discussion instead of
|
||||||
|
an issue: https://github.com/tendermint/tendermint/discussions
|
||||||
|
|
||||||
|
-->
|
||||||
15
.github/linters/markdownlint.yml
vendored
Normal file
15
.github/linters/markdownlint.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# markdownlint configuration for Super-Linter
|
||||||
|
# - https://github.com/DavidAnson/markdownlint
|
||||||
|
# - https://github.com/github/super-linter
|
||||||
|
|
||||||
|
# Default state for all rules
|
||||||
|
default: true
|
||||||
|
|
||||||
|
# See https://github.com/DavidAnson/markdownlint#rules--aliases for rules
|
||||||
|
MD007: {"indent": 4}
|
||||||
|
MD013: false
|
||||||
|
MD024: {siblings_only: true}
|
||||||
|
MD025: false
|
||||||
|
MD033: {no-inline-html: false}
|
||||||
|
no-hard-tabs: false
|
||||||
|
whitespace: false
|
||||||
9
.github/linters/yaml-lint.yml
vendored
Normal file
9
.github/linters/yaml-lint.yml
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
# Default rules for YAML linting from super-linter.
|
||||||
|
# See: See https://yamllint.readthedocs.io/en/stable/rules.html
|
||||||
|
extends: default
|
||||||
|
rules:
|
||||||
|
document-end: disable
|
||||||
|
document-start: disable
|
||||||
|
line-length: disable
|
||||||
|
truthy: disable
|
||||||
14
.github/mergify.yml
vendored
14
.github/mergify.yml
vendored
@@ -1,13 +1,13 @@
|
|||||||
queue_rules:
|
queue_rules:
|
||||||
- name: default
|
- name: default
|
||||||
conditions:
|
conditions:
|
||||||
- base=v0.34.x
|
- base=main
|
||||||
- label=S:automerge
|
- label=S:automerge
|
||||||
|
|
||||||
pull_request_rules:
|
pull_request_rules:
|
||||||
- name: Automerge to v0.34.x
|
- name: Automerge to main
|
||||||
conditions:
|
conditions:
|
||||||
- base=v0.34.x
|
- base=main
|
||||||
- label=S:automerge
|
- label=S:automerge
|
||||||
actions:
|
actions:
|
||||||
queue:
|
queue:
|
||||||
@@ -17,3 +17,11 @@ pull_request_rules:
|
|||||||
{{ title }} (#{{ number }})
|
{{ title }} (#{{ number }})
|
||||||
|
|
||||||
{{ body }}
|
{{ body }}
|
||||||
|
- name: backport patches to v0.34.x branch
|
||||||
|
conditions:
|
||||||
|
- base=main
|
||||||
|
- label=S:backport-to-v0.34.x
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- v0.34.x
|
||||||
|
|||||||
82
.github/workflows/build.yml
vendored
Normal file
82
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
name: Build
|
||||||
|
# Tests runs different tests (test_abci_apps, test_abci_cli, test_apps)
|
||||||
|
# This workflow runs on every push to main or release branch and every pull requests
|
||||||
|
# All jobs will pass without running if no *{.go, .mod, .sum} files have been modified
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- release/**
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
goarch: ["arm", "amd64"]
|
||||||
|
goos: ["linux"]
|
||||||
|
timeout-minutes: 5
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: "1.17"
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: technote-space/get-diff-action@v6
|
||||||
|
with:
|
||||||
|
PATTERNS: |
|
||||||
|
**/*.go
|
||||||
|
"!test/"
|
||||||
|
go.mod
|
||||||
|
go.sum
|
||||||
|
Makefile
|
||||||
|
- name: install
|
||||||
|
run: GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} make build
|
||||||
|
if: "env.GIT_DIFF != ''"
|
||||||
|
|
||||||
|
test_abci_cli:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: build
|
||||||
|
timeout-minutes: 5
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: "1.17"
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: technote-space/get-diff-action@v6
|
||||||
|
with:
|
||||||
|
PATTERNS: |
|
||||||
|
**/*.go
|
||||||
|
go.mod
|
||||||
|
go.sum
|
||||||
|
- name: install
|
||||||
|
run: make install_abci
|
||||||
|
if: "env.GIT_DIFF != ''"
|
||||||
|
- run: abci/tests/test_cli/test.sh
|
||||||
|
shell: bash
|
||||||
|
if: "env.GIT_DIFF != ''"
|
||||||
|
|
||||||
|
test_apps:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: build
|
||||||
|
timeout-minutes: 5
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: "1.17"
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: technote-space/get-diff-action@v6
|
||||||
|
with:
|
||||||
|
PATTERNS: |
|
||||||
|
**/*.go
|
||||||
|
go.mod
|
||||||
|
go.sum
|
||||||
|
- name: install
|
||||||
|
run: make install install_abci
|
||||||
|
if: "env.GIT_DIFF != ''"
|
||||||
|
- name: test_apps
|
||||||
|
run: test/app/test.sh
|
||||||
|
shell: bash
|
||||||
|
if: "env.GIT_DIFF != ''"
|
||||||
123
.github/workflows/coverage.yml
vendored
123
.github/workflows/coverage.yml
vendored
@@ -1,123 +0,0 @@
|
|||||||
name: Test Coverage
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- release/**
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
split-test-files:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Create a file with all the pkgs
|
|
||||||
run: go list ./... > pkgs.txt
|
|
||||||
- name: Split pkgs into 4 files
|
|
||||||
run: split -d -n l/4 pkgs.txt pkgs.txt.part.
|
|
||||||
# cache multiple
|
|
||||||
- uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: "${{ github.sha }}-00"
|
|
||||||
path: ./pkgs.txt.part.00
|
|
||||||
- uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: "${{ github.sha }}-01"
|
|
||||||
path: ./pkgs.txt.part.01
|
|
||||||
- uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: "${{ github.sha }}-02"
|
|
||||||
path: ./pkgs.txt.part.02
|
|
||||||
- uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: "${{ github.sha }}-03"
|
|
||||||
path: ./pkgs.txt.part.03
|
|
||||||
|
|
||||||
build-linux:
|
|
||||||
name: Build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
goarch: ["arm", "amd64"]
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: "^1.15.4"
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: technote-space/get-diff-action@v6
|
|
||||||
with:
|
|
||||||
PATTERNS: |
|
|
||||||
**/**.go
|
|
||||||
go.mod
|
|
||||||
go.sum
|
|
||||||
- name: install
|
|
||||||
run: GOOS=linux GOARCH=${{ matrix.goarch }} make build
|
|
||||||
if: "env.GIT_DIFF != ''"
|
|
||||||
|
|
||||||
tests:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: split-test-files
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
part: ["00", "01", "02", "03"]
|
|
||||||
steps:
|
|
||||||
- uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: "^1.15.4"
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: technote-space/get-diff-action@v6
|
|
||||||
with:
|
|
||||||
PATTERNS: |
|
|
||||||
**/**.go
|
|
||||||
go.mod
|
|
||||||
go.sum
|
|
||||||
- uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: "${{ github.sha }}-${{ matrix.part }}"
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- name: test & coverage report creation
|
|
||||||
run: |
|
|
||||||
cat pkgs.txt.part.${{ matrix.part }} | xargs go test -mod=readonly -timeout 8m -race -coverprofile=${{ matrix.part }}profile.out -covermode=atomic
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: "${{ github.sha }}-${{ matrix.part }}-coverage"
|
|
||||||
path: ./${{ matrix.part }}profile.out
|
|
||||||
|
|
||||||
upload-coverage-report:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: tests
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: technote-space/get-diff-action@v6
|
|
||||||
with:
|
|
||||||
PATTERNS: |
|
|
||||||
**/**.go
|
|
||||||
go.mod
|
|
||||||
go.sum
|
|
||||||
- uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: "${{ github.sha }}-00-coverage"
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: "${{ github.sha }}-01-coverage"
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: "${{ github.sha }}-02-coverage"
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: "${{ github.sha }}-03-coverage"
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- run: |
|
|
||||||
cat ./*profile.out | grep -v "mode: atomic" >> coverage.txt
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- uses: codecov/codecov-action@v3
|
|
||||||
with:
|
|
||||||
file: ./coverage.txt
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
21
.github/workflows/docker.yml
vendored
21
.github/workflows/docker.yml
vendored
@@ -1,14 +1,13 @@
|
|||||||
name: Build & Push
|
name: Docker
|
||||||
# Build & Push rebuilds the tendermint docker image on every push to master and creation of tags
|
# Build & Push rebuilds the Tendermint docker image on every push to main and creation of tags
|
||||||
# and pushes the image to https://hub.docker.com/r/interchainio/simapp/tags
|
# and pushes the image to https://hub.docker.com/r/tendermint/tendermint
|
||||||
on:
|
on:
|
||||||
pull_request:
|
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- main
|
||||||
tags:
|
tags:
|
||||||
- "v[0-9]+.[0-9]+.[0-9]+" # Push events to matching v*, i.e. v1.0, v20.15.10
|
- "v[0-9]+.[0-9]+.[0-9]+" # Push events to matching v*, i.e. v1.0, v20.15.10
|
||||||
- "v[0-9]+.[0-9]+.[0-9]+-rc*" # Push events to matching v*, i.e. v1.0-rc1, v20.15.10-rc5
|
- "v[0-9]+.[0-9]+.[0-9]+-rc*" # Push events to matching v*, i.e. v1.0-rc1, v20.15.10-rc5
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -39,18 +38,18 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
platforms: all
|
platforms: all
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Build
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
|
||||||
- name: Login to DockerHub
|
- name: Login to DockerHub
|
||||||
if: ${{ github.event_name != 'pull_request' }}
|
if: ${{ github.event_name != 'pull_request' }}
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v2.0.0
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Publish to Docker Hub
|
- name: Publish to Docker Hub
|
||||||
uses: docker/build-push-action@v3
|
uses: docker/build-push-action@v3.1.0
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: ./DOCKER/Dockerfile
|
file: ./DOCKER/Dockerfile
|
||||||
|
|||||||
62
.github/workflows/docs-deployment.yml
vendored
Normal file
62
.github/workflows/docs-deployment.yml
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# Build and deploy the docs.tendermint.com website content.
|
||||||
|
# The static content is published to GitHub Pages.
|
||||||
|
#
|
||||||
|
# For documentation build info, see docs/DOCS_README.md.
|
||||||
|
name: Build static documentation site
|
||||||
|
on:
|
||||||
|
workflow_dispatch: # allow manual updates
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- docs/**
|
||||||
|
- spec/**
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# This is split into two jobs so that the build, which runs npm, does not
|
||||||
|
# have write access to anything. The deploy requires write access to publish
|
||||||
|
# to the branch used by GitHub Pages, however, so we can't just make the
|
||||||
|
# whole workflow read-only.
|
||||||
|
build:
|
||||||
|
name: VuePress build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: alpine:latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
- name: Install generator dependencies
|
||||||
|
run: |
|
||||||
|
apk add --no-cache make bash git npm
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
# We need to fetch full history so the backport branches for previous
|
||||||
|
# versions will be available for the build.
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Build documentation
|
||||||
|
run: |
|
||||||
|
git config --global --add safe.directory "$PWD"
|
||||||
|
make build-docs
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: build-output
|
||||||
|
path: ~/output/
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
name: Deploy to GitHub Pages
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: build
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: build-output
|
||||||
|
path: ~/output
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
uses: JamesIves/github-pages-deploy-action@v4
|
||||||
|
with:
|
||||||
|
branch: 'docs-tendermint-com'
|
||||||
|
folder: ~/output
|
||||||
|
single-commit: true
|
||||||
21
.github/workflows/docs-toc.yml
vendored
Normal file
21
.github/workflows/docs-toc.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# TODO(thane): Re-enable once we've pulled in the ADRs and RFCs from master.
|
||||||
|
# Verify that important design docs have ToC entries.
|
||||||
|
#name: Check documentation ToC
|
||||||
|
#on:
|
||||||
|
# pull_request:
|
||||||
|
# push:
|
||||||
|
# branches:
|
||||||
|
# - main
|
||||||
|
#
|
||||||
|
#jobs:
|
||||||
|
# check:
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
# steps:
|
||||||
|
# - uses: actions/checkout@v3
|
||||||
|
# - uses: technote-space/get-diff-action@v6
|
||||||
|
# with:
|
||||||
|
# PATTERNS: |
|
||||||
|
# docs/architecture/**
|
||||||
|
# docs/rfc/**
|
||||||
|
# - run: ./docs/presubmit.sh
|
||||||
|
# if: env.GIT_DIFF
|
||||||
5
.github/workflows/e2e-manual.yml
vendored
5
.github/workflows/e2e-manual.yml
vendored
@@ -1,4 +1,5 @@
|
|||||||
# Manually run randomly generated E2E testnets (as nightly).
|
# Runs randomly generated E2E testnets nightly on main
|
||||||
|
# manually run e2e tests
|
||||||
name: e2e-manual
|
name: e2e-manual
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@@ -28,7 +29,7 @@ jobs:
|
|||||||
- name: Generate testnets
|
- name: Generate testnets
|
||||||
working-directory: test/e2e
|
working-directory: test/e2e
|
||||||
# When changing -g, also change the matrix groups above
|
# When changing -g, also change the matrix groups above
|
||||||
run: ./build/generator -g 4 -d networks/nightly/
|
run: ./build/generator -g 5 -d networks/nightly/
|
||||||
|
|
||||||
- name: Run ${{ matrix.p2p }} p2p testnets
|
- name: Run ${{ matrix.p2p }} p2p testnets
|
||||||
working-directory: test/e2e
|
working-directory: test/e2e
|
||||||
|
|||||||
32
.github/workflows/e2e-nightly-34x.yml
vendored
32
.github/workflows/e2e-nightly-34x.yml
vendored
@@ -1,12 +1,10 @@
|
|||||||
# Runs randomly generated E2E testnets nightly
|
# Runs randomly generated E2E testnets nightly on the 0.34.x branch.
|
||||||
# on the 0.34.x release branch
|
|
||||||
|
|
||||||
# !! If you change something in this file, you probably want
|
# !! This file should be kept in sync with the e2e-nightly-main.yml file,
|
||||||
# to update the e2e-nightly-master workflow as well!
|
# modulo changes to the version labels.
|
||||||
|
|
||||||
name: e2e-nightly-34x
|
name: e2e-nightly-34x
|
||||||
on:
|
on:
|
||||||
workflow_dispatch: # allow running workflow manually, in theory
|
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 2 * * *'
|
- cron: '0 2 * * *'
|
||||||
|
|
||||||
@@ -17,13 +15,13 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
group: ['00', '01', '02', '03']
|
group: ['00', '01', '02', '03', "04"]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '^1.15.4'
|
go-version: '1.17'
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -37,7 +35,7 @@ jobs:
|
|||||||
- name: Generate testnets
|
- name: Generate testnets
|
||||||
working-directory: test/e2e
|
working-directory: test/e2e
|
||||||
# When changing -g, also change the matrix groups above
|
# When changing -g, also change the matrix groups above
|
||||||
run: ./build/generator -g 4 -d networks/nightly
|
run: ./build/generator -g 2 -d networks/nightly
|
||||||
|
|
||||||
- name: Run testnets in group ${{ matrix.group }}
|
- name: Run testnets in group ${{ matrix.group }}
|
||||||
working-directory: test/e2e
|
working-directory: test/e2e
|
||||||
@@ -49,7 +47,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Notify Slack on failure
|
- name: Notify Slack on failure
|
||||||
uses: rtCamp/action-slack-notify@f565a63638bd3615e76249bffab00fcb9dab90f7
|
uses: rtCamp/action-slack-notify@12e36fc18b0689399306c2e0b3e0f2978b7f1ee7
|
||||||
env:
|
env:
|
||||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
||||||
SLACK_CHANNEL: tendermint-internal
|
SLACK_CHANNEL: tendermint-internal
|
||||||
@@ -58,19 +56,3 @@ jobs:
|
|||||||
SLACK_COLOR: danger
|
SLACK_COLOR: danger
|
||||||
SLACK_MESSAGE: Nightly E2E tests failed on v0.34.x
|
SLACK_MESSAGE: Nightly E2E tests failed on v0.34.x
|
||||||
SLACK_FOOTER: ''
|
SLACK_FOOTER: ''
|
||||||
|
|
||||||
e2e-nightly-success: # may turn this off once they seem to pass consistently
|
|
||||||
needs: e2e-nightly-test
|
|
||||||
if: ${{ success() }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Notify Slack on success
|
|
||||||
uses: rtCamp/action-slack-notify@f565a63638bd3615e76249bffab00fcb9dab90f7
|
|
||||||
env:
|
|
||||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
|
||||||
SLACK_CHANNEL: tendermint-internal
|
|
||||||
SLACK_USERNAME: Nightly E2E Tests
|
|
||||||
SLACK_ICON_EMOJI: ':white_check_mark:'
|
|
||||||
SLACK_COLOR: good
|
|
||||||
SLACK_MESSAGE: Nightly E2E tests passed on v0.34.x
|
|
||||||
SLACK_FOOTER: ''
|
|
||||||
|
|||||||
@@ -1,73 +1,73 @@
|
|||||||
# Runs randomly generated E2E testnets nightly on master
|
# Runs randomly generated E2E testnets nightly on main
|
||||||
|
|
||||||
# !! If you change something in this file, you probably want
|
# !! Relevant changes to this file should be propagated to the e2e-nightly-<V>x
|
||||||
# to update the e2e-nightly-34x workflow as well!
|
# files for the supported backport branches, when appropriate, modulo version
|
||||||
|
# markers.
|
||||||
|
|
||||||
name: e2e-nightly-master
|
name: e2e-nightly-main
|
||||||
on:
|
on:
|
||||||
workflow_dispatch: # allow running workflow manually
|
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 2 * * *'
|
- cron: '0 2 * * *'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
e2e-nightly-test-2:
|
e2e-nightly-test:
|
||||||
# Run parallel jobs for the listed testnet groups (must match the
|
# Run parallel jobs for the listed testnet groups (must match the
|
||||||
# ./build/generator -g flag)
|
# ./build/generator -g flag)
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
group: ['00', '01', '02', '03']
|
group: ['00', '01', '02', '03', "04"]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '1.15'
|
go-version: '1.17'
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
working-directory: test/e2e
|
working-directory: test/e2e
|
||||||
# Run make jobs in parallel, since we can't run steps in parallel.
|
# Run make jobs in parallel, since we can't run steps in parallel.
|
||||||
run: make -j2 docker generator runner
|
run: make -j2 docker generator runner tests
|
||||||
|
|
||||||
- name: Generate testnets
|
- name: Generate testnets
|
||||||
working-directory: test/e2e
|
working-directory: test/e2e
|
||||||
# When changing -g, also change the matrix groups above
|
# When changing -g, also change the matrix groups above
|
||||||
run: ./build/generator -g 4 -d networks/nightly
|
run: ./build/generator -g 5 -d networks/nightly/
|
||||||
|
|
||||||
- name: Run testnets in group ${{ matrix.group }}
|
- name: Run ${{ matrix.p2p }} p2p testnets
|
||||||
working-directory: test/e2e
|
working-directory: test/e2e
|
||||||
run: ./run-multiple.sh networks/nightly/*-group${{ matrix.group }}-*.toml
|
run: ./run-multiple.sh networks/nightly/*-group${{ matrix.group }}-*.toml
|
||||||
|
|
||||||
e2e-nightly-fail-2:
|
e2e-nightly-fail:
|
||||||
needs: e2e-nightly-test-2
|
needs: e2e-nightly-test
|
||||||
if: ${{ failure() }}
|
if: ${{ failure() }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Notify Slack on failure
|
- name: Notify Slack on failure
|
||||||
uses: rtCamp/action-slack-notify@f565a63638bd3615e76249bffab00fcb9dab90f7
|
uses: rtCamp/action-slack-notify@12e36fc18b0689399306c2e0b3e0f2978b7f1ee7
|
||||||
env:
|
env:
|
||||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
||||||
SLACK_CHANNEL: tendermint-internal
|
SLACK_CHANNEL: tendermint-internal
|
||||||
SLACK_USERNAME: Nightly E2E Tests
|
SLACK_USERNAME: Nightly E2E Tests
|
||||||
SLACK_ICON_EMOJI: ':skull:'
|
SLACK_ICON_EMOJI: ':skull:'
|
||||||
SLACK_COLOR: danger
|
SLACK_COLOR: danger
|
||||||
SLACK_MESSAGE: Nightly E2E tests failed on master
|
SLACK_MESSAGE: Nightly E2E tests failed on main
|
||||||
SLACK_FOOTER: ''
|
SLACK_FOOTER: ''
|
||||||
|
|
||||||
e2e-nightly-success: # may turn this off once they seem to pass consistently
|
e2e-nightly-success: # may turn this off once they seem to pass consistently
|
||||||
needs: e2e-nightly-test-2
|
needs: e2e-nightly-test
|
||||||
if: ${{ success() }}
|
if: ${{ success() }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Notify Slack on success
|
- name: Notify Slack on success
|
||||||
uses: rtCamp/action-slack-notify@f565a63638bd3615e76249bffab00fcb9dab90f7
|
uses: rtCamp/action-slack-notify@12e36fc18b0689399306c2e0b3e0f2978b7f1ee7
|
||||||
env:
|
env:
|
||||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
||||||
SLACK_CHANNEL: tendermint-internal
|
SLACK_CHANNEL: tendermint-internal
|
||||||
SLACK_USERNAME: Nightly E2E Tests
|
SLACK_USERNAME: Nightly E2E Tests
|
||||||
SLACK_ICON_EMOJI: ':white_check_mark:'
|
SLACK_ICON_EMOJI: ':white_check_mark:'
|
||||||
SLACK_COLOR: good
|
SLACK_COLOR: good
|
||||||
SLACK_MESSAGE: Nightly E2E tests passed on master
|
SLACK_MESSAGE: Nightly E2E tests passed on main
|
||||||
SLACK_FOOTER: ''
|
SLACK_FOOTER: ''
|
||||||
16
.github/workflows/e2e.yml
vendored
16
.github/workflows/e2e.yml
vendored
@@ -1,11 +1,12 @@
|
|||||||
name: e2e
|
name: e2e
|
||||||
# Runs the CI end-to-end test network on all pushes to master or release branches
|
# Runs the CI end-to-end test network on all pushes to main or release branches
|
||||||
# and every pull request, but only if any Go files have been changed.
|
# and every pull request, but only if any Go files have been changed.
|
||||||
on:
|
on:
|
||||||
|
workflow_dispatch: # allow running workflow manually
|
||||||
pull_request:
|
pull_request:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- main
|
||||||
- release/**
|
- release/**
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -15,7 +16,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '^1.15.4'
|
go-version: '1.17'
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: technote-space/get-diff-action@v6
|
- uses: technote-space/get-diff-action@v6
|
||||||
with:
|
with:
|
||||||
@@ -27,15 +28,10 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
working-directory: test/e2e
|
working-directory: test/e2e
|
||||||
# Run two make jobs in parallel, since we can't run steps in parallel.
|
# Run two make jobs in parallel, since we can't run steps in parallel.
|
||||||
run: make -j2 docker runner
|
run: make -j2 docker runner tests
|
||||||
if: "env.GIT_DIFF != ''"
|
if: "env.GIT_DIFF != ''"
|
||||||
|
|
||||||
- name: Run CI testnet
|
- name: Run CI testnet
|
||||||
working-directory: test/e2e
|
working-directory: test/e2e
|
||||||
run: ./build/runner -f networks/ci.toml
|
run: ./run-multiple.sh networks/ci.toml
|
||||||
if: "env.GIT_DIFF != ''"
|
if: "env.GIT_DIFF != ''"
|
||||||
|
|
||||||
- name: Emit logs on failure
|
|
||||||
if: ${{ failure() }}
|
|
||||||
working-directory: test/e2e
|
|
||||||
run: ./build/runner -f networks/ci.toml logs
|
|
||||||
|
|||||||
18
.github/workflows/fuzz-nightly.yml
vendored
18
.github/workflows/fuzz-nightly.yml
vendored
@@ -1,9 +1,13 @@
|
|||||||
# Runs fuzzing nightly.
|
# Runs fuzzing nightly.
|
||||||
name: fuzz-nightly
|
name: Fuzz Tests
|
||||||
on:
|
on:
|
||||||
workflow_dispatch: # allow running workflow manually
|
workflow_dispatch: # allow running workflow manually
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 3 * * *'
|
- cron: '0 3 * * *'
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
paths:
|
||||||
|
- "test/fuzz/**/*.go"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
fuzz-nightly-test:
|
fuzz-nightly-test:
|
||||||
@@ -11,13 +15,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '1.15'
|
go-version: '1.17'
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install go-fuzz
|
- name: Install go-fuzz
|
||||||
working-directory: test/fuzz
|
working-directory: test/fuzz
|
||||||
run: go get -u github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build
|
run: go install github.com/dvyukov/go-fuzz/go-fuzz@latest github.com/dvyukov/go-fuzz/go-fuzz-build@latest
|
||||||
|
|
||||||
- name: Fuzz mempool
|
- name: Fuzz mempool
|
||||||
working-directory: test/fuzz
|
working-directory: test/fuzz
|
||||||
@@ -49,14 +53,14 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: crashers
|
name: crashers
|
||||||
path: test/fuzz/**/crashers
|
path: test/fuzz/**/crashers
|
||||||
retention-days: 1
|
retention-days: 3
|
||||||
|
|
||||||
- name: Archive suppressions
|
- name: Archive suppressions
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: suppressions
|
name: suppressions
|
||||||
path: test/fuzz/**/suppressions
|
path: test/fuzz/**/suppressions
|
||||||
retention-days: 1
|
retention-days: 3
|
||||||
|
|
||||||
- name: Set crashers count
|
- name: Set crashers count
|
||||||
working-directory: test/fuzz
|
working-directory: test/fuzz
|
||||||
@@ -72,7 +76,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Notify Slack if any crashers
|
- name: Notify Slack if any crashers
|
||||||
uses: rtCamp/action-slack-notify@f565a63638bd3615e76249bffab00fcb9dab90f7
|
uses: rtCamp/action-slack-notify@12e36fc18b0689399306c2e0b3e0f2978b7f1ee7
|
||||||
env:
|
env:
|
||||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
||||||
SLACK_CHANNEL: tendermint-internal
|
SLACK_CHANNEL: tendermint-internal
|
||||||
|
|||||||
16
.github/workflows/janitor.yml
vendored
Normal file
16
.github/workflows/janitor.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
name: Janitor
|
||||||
|
# Janitor cleans up previous runs of various workflows
|
||||||
|
# To add more workflows to cancel visit https://api.github.com/repos/tendermint/tendermint/actions/workflows and find the actions name
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cancel:
|
||||||
|
name: "Cancel Previous Runs"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 3
|
||||||
|
steps:
|
||||||
|
- uses: styfle/cancel-workflow-action@0.10.0
|
||||||
|
with:
|
||||||
|
workflow_id: 1041851,1401230,2837803
|
||||||
|
access_token: ${{ github.token }}
|
||||||
12
.github/workflows/linkchecker.yml
vendored
12
.github/workflows/linkchecker.yml
vendored
@@ -1,12 +0,0 @@
|
|||||||
name: Check Markdown links
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '* */24 * * *'
|
|
||||||
jobs:
|
|
||||||
markdown-link-check:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: creachadair/github-action-markdown-link-check@master
|
|
||||||
with:
|
|
||||||
folder-path: "docs"
|
|
||||||
22
.github/workflows/lint.yml
vendored
22
.github/workflows/lint.yml
vendored
@@ -1,12 +1,18 @@
|
|||||||
name: Lint
|
name: Golang Linter
|
||||||
# Lint runs golangci-lint over the entire Tendermint repository
|
# Lint runs golangci-lint over the entire Tendermint repository.
|
||||||
# This workflow is run on every pull request and push to master
|
#
|
||||||
# The `golangci` job will pass without running if no *.{go, mod, sum} files have been modified.
|
# This workflow is run on every pull request and push to main.
|
||||||
|
#
|
||||||
|
# The `golangci` job will pass without running if no *.{go, mod, sum}
|
||||||
|
# files have been modified.
|
||||||
|
#
|
||||||
|
# To run this locally, simply run `make lint` from the root of the repo.
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- main
|
||||||
jobs:
|
jobs:
|
||||||
golangci:
|
golangci:
|
||||||
name: golangci-lint
|
name: golangci-lint
|
||||||
@@ -16,7 +22,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '^1.16'
|
go-version: '1.17'
|
||||||
- uses: technote-space/get-diff-action@v6
|
- uses: technote-space/get-diff-action@v6
|
||||||
with:
|
with:
|
||||||
PATTERNS: |
|
PATTERNS: |
|
||||||
@@ -25,7 +31,9 @@ jobs:
|
|||||||
go.sum
|
go.sum
|
||||||
- uses: golangci/golangci-lint-action@v3
|
- uses: golangci/golangci-lint-action@v3
|
||||||
with:
|
with:
|
||||||
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
|
# Required: the version of golangci-lint is required and
|
||||||
|
# must be specified without patch version: we always use the
|
||||||
|
# latest patch version.
|
||||||
version: v1.45
|
version: v1.45
|
||||||
args: --timeout 10m
|
args: --timeout 10m
|
||||||
github-token: ${{ secrets.github_token }}
|
github-token: ${{ secrets.github_token }}
|
||||||
|
|||||||
12
.github/workflows/linter.yml
vendored
12
.github/workflows/linter.yml
vendored
@@ -1,14 +1,14 @@
|
|||||||
name: Lint
|
name: Markdown Linter
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- main
|
||||||
paths:
|
paths:
|
||||||
- "**.md"
|
- "**.md"
|
||||||
- "**.yml"
|
- "**.yml"
|
||||||
- "**.yaml"
|
- "**.yaml"
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [master]
|
branches: [main]
|
||||||
paths:
|
paths:
|
||||||
- "**.md"
|
- "**.md"
|
||||||
- "**.yml"
|
- "**.yml"
|
||||||
@@ -21,12 +21,12 @@ jobs:
|
|||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Lint Code Base
|
- name: Lint Code Base
|
||||||
uses: docker://github/super-linter:v3
|
uses: docker://github/super-linter:v4
|
||||||
env:
|
env:
|
||||||
LINTER_RULES_PATH: .
|
|
||||||
VALIDATE_ALL_CODEBASE: true
|
VALIDATE_ALL_CODEBASE: true
|
||||||
DEFAULT_BRANCH: master
|
DEFAULT_BRANCH: main
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
VALIDATE_MD: true
|
VALIDATE_MD: true
|
||||||
VALIDATE_OPENAPI: true
|
VALIDATE_OPENAPI: true
|
||||||
VALIDATE_YAML: true
|
VALIDATE_YAML: true
|
||||||
|
YAML_CONFIG_FILE: yaml-lint.yml
|
||||||
|
|||||||
23
.github/workflows/markdown-links.yml
vendored
Normal file
23
.github/workflows/markdown-links.yml
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
name: Check Markdown links
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
markdown-link-check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: technote-space/get-diff-action@v6
|
||||||
|
with:
|
||||||
|
PATTERNS: |
|
||||||
|
**/**.md
|
||||||
|
- uses: creachadair/github-action-markdown-link-check@master
|
||||||
|
with:
|
||||||
|
check-modified-files-only: 'yes'
|
||||||
|
config-file: '.md-link-check.json'
|
||||||
|
if: env.GIT_DIFF
|
||||||
2
.github/workflows/proto-lint.yml
vendored
2
.github/workflows/proto-lint.yml
vendored
@@ -5,7 +5,7 @@ on:
|
|||||||
- 'proto/**'
|
- 'proto/**'
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- v0.34.x
|
- main
|
||||||
paths:
|
paths:
|
||||||
- 'proto/**'
|
- 'proto/**'
|
||||||
|
|
||||||
|
|||||||
22
.github/workflows/proto.yml
vendored
22
.github/workflows/proto.yml
vendored
@@ -1,22 +0,0 @@
|
|||||||
name: Protobuf
|
|
||||||
# Protobuf runs buf (https://buf.build/) lint and check-breakage
|
|
||||||
# This workflow is only run when a .proto file has been modified
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- "**.proto"
|
|
||||||
jobs:
|
|
||||||
proto-lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 4
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: lint
|
|
||||||
run: make proto-lint
|
|
||||||
proto-breakage:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 4
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: check-breakage
|
|
||||||
run: make proto-check-breaking-ci
|
|
||||||
18
.github/workflows/release.yml
vendored
18
.github/workflows/release.yml
vendored
@@ -3,7 +3,7 @@ name: "Release"
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- "v[0-9]+.[0-9]+.[0-9]+" # Push events to matching v*, i.e. v1.0, v20.15.10
|
- "v[0-9]+.[0-9]+.[0-9]+" # Push events to matching v*, i.e. v1.0, v20.15.10
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
goreleaser:
|
goreleaser:
|
||||||
@@ -16,12 +16,20 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '^1.15.4'
|
go-version: '1.17'
|
||||||
|
|
||||||
- run: echo https://github.com/tendermint/tendermint/blob/${GITHUB_REF#refs/tags/}/CHANGELOG.md#${GITHUB_REF#refs/tags/} > ../release_notes.md
|
- name: Build
|
||||||
|
|
||||||
- name: Run GoReleaser
|
|
||||||
uses: goreleaser/goreleaser-action@v3
|
uses: goreleaser/goreleaser-action@v3
|
||||||
|
if: ${{ github.event_name == 'pull_request' }}
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
args: build --skip-validate # skip validate skips initial sanity checks in order to be able to fully run
|
||||||
|
|
||||||
|
- run: echo https://github.com/tendermint/tendermint/blob/${GITHUB_REF#refs/tags/}/CHANGELOG.md#${GITHUB_REF#refs/tags/} > ../release_notes.md
|
||||||
|
|
||||||
|
- name: Release
|
||||||
|
uses: goreleaser/goreleaser-action@v3
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
with:
|
with:
|
||||||
version: latest
|
version: latest
|
||||||
args: release --rm-dist --release-notes=../release_notes.md
|
args: release --rm-dist --release-notes=../release_notes.md
|
||||||
|
|||||||
6
.github/workflows/stale.yml
vendored
6
.github/workflows/stale.yml
vendored
@@ -13,6 +13,8 @@ jobs:
|
|||||||
stale-pr-message: "This pull request has been automatically marked as stale because it has not had
|
stale-pr-message: "This pull request has been automatically marked as stale because it has not had
|
||||||
recent activity. It will be closed if no further activity occurs. Thank you
|
recent activity. It will be closed if no further activity occurs. Thank you
|
||||||
for your contributions."
|
for your contributions."
|
||||||
days-before-stale: 10
|
days-before-stale: -1
|
||||||
days-before-close: 4
|
days-before-close: -1
|
||||||
|
days-before-pr-stale: 10
|
||||||
|
days-before-pr-close: 4
|
||||||
exempt-pr-labels: "S:wip"
|
exempt-pr-labels: "S:wip"
|
||||||
|
|||||||
142
.github/workflows/tests.yml
vendored
142
.github/workflows/tests.yml
vendored
@@ -1,146 +1,34 @@
|
|||||||
name: Tests
|
name: Test
|
||||||
# Tests runs different tests (test_abci_apps, test_abci_cli, test_apps)
|
|
||||||
# This workflow runs on every push to master or release branch and every pull requests
|
|
||||||
# All jobs will pass without running if no *{.go, .mod, .sum} files have been modified
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
push:
|
push:
|
||||||
|
paths:
|
||||||
|
- "**.go"
|
||||||
branches:
|
branches:
|
||||||
- master
|
- main
|
||||||
- release/**
|
- release/**
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
cleanup-runs:
|
tests:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
strategy:
|
||||||
- uses: rokroskar/workflow-run-cleanup-action@master
|
fail-fast: false
|
||||||
env:
|
matrix:
|
||||||
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
part: ["00", "01", "02", "03", "04", "05"]
|
||||||
if: "!startsWith(github.ref, 'refs/tags/') && github.ref != 'refs/heads/master'"
|
|
||||||
|
|
||||||
build:
|
|
||||||
name: Build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: "^1.15.4"
|
go-version: "1.17"
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: technote-space/get-diff-action@v6
|
- uses: technote-space/get-diff-action@v6
|
||||||
with:
|
with:
|
||||||
PATTERNS: |
|
PATTERNS: |
|
||||||
**/**.go
|
**/**.go
|
||||||
|
"!test/"
|
||||||
go.mod
|
go.mod
|
||||||
go.sum
|
go.sum
|
||||||
- name: install
|
Makefile
|
||||||
run: make install install_abci
|
- name: Run Go Tests
|
||||||
if: "env.GIT_DIFF != ''"
|
run: |
|
||||||
- uses: actions/cache@v3
|
make test-group-${{ matrix.part }} NUM_SPLIT=6
|
||||||
with:
|
|
||||||
path: ~/go/pkg/mod
|
|
||||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-go-
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
# Cache binaries for use by other jobs
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/go/bin
|
|
||||||
key: ${{ runner.os }}-${{ github.sha }}-tm-binary
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
|
|
||||||
test_abci_apps:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: "^1.15.4"
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: technote-space/get-diff-action@v6
|
|
||||||
with:
|
|
||||||
PATTERNS: |
|
|
||||||
**/**.go
|
|
||||||
go.mod
|
|
||||||
go.sum
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/go/pkg/mod
|
|
||||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-go-
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/go/bin
|
|
||||||
key: ${{ runner.os }}-${{ github.sha }}-tm-binary
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- name: test_abci_apps
|
|
||||||
run: abci/tests/test_app/test.sh
|
|
||||||
shell: bash
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
|
|
||||||
test_abci_cli:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: "^1.15.4"
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: technote-space/get-diff-action@v6
|
|
||||||
with:
|
|
||||||
PATTERNS: |
|
|
||||||
**/**.go
|
|
||||||
go.mod
|
|
||||||
go.sum
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/go/pkg/mod
|
|
||||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-go-
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/go/bin
|
|
||||||
key: ${{ runner.os }}-${{ github.sha }}-tm-binary
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- run: abci/tests/test_cli/test.sh
|
|
||||||
shell: bash
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
|
|
||||||
test_apps:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: "^1.15.4"
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: technote-space/get-diff-action@v6
|
|
||||||
with:
|
|
||||||
PATTERNS: |
|
|
||||||
**/**.go
|
|
||||||
go.mod
|
|
||||||
go.sum
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/go/pkg/mod
|
|
||||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-go-
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/go/bin
|
|
||||||
key: ${{ runner.os }}-${{ github.sha }}-tm-binary
|
|
||||||
if: env.GIT_DIFF
|
|
||||||
- name: test_apps
|
|
||||||
run: test/app/test.sh
|
|
||||||
shell: bash
|
|
||||||
if: env.GIT_DIFF
|
if: env.GIT_DIFF
|
||||||
|
|||||||
63
.gitignore
vendored
63
.gitignore
vendored
@@ -1,64 +1,57 @@
|
|||||||
*.swp
|
|
||||||
*.swo
|
|
||||||
.bak
|
|
||||||
*.bak
|
*.bak
|
||||||
|
*.iml
|
||||||
|
*.log
|
||||||
|
*.swo
|
||||||
|
*.swp
|
||||||
|
*/.glide
|
||||||
|
*/vendor
|
||||||
.DS_Store
|
.DS_Store
|
||||||
build/*
|
.bak
|
||||||
rpc/test/.tendermint
|
.idea/
|
||||||
.tendermint
|
|
||||||
remote_dump
|
|
||||||
.revision
|
.revision
|
||||||
vendor
|
.tendermint
|
||||||
|
.tendermint-lite
|
||||||
|
.terraform
|
||||||
.vagrant
|
.vagrant
|
||||||
test/e2e/build
|
.vendor-new/
|
||||||
test/maverick/maverick
|
.vscode/
|
||||||
test/e2e/networks/*/
|
abci/abci-cli
|
||||||
test/p2p/data/
|
addrbook.json
|
||||||
test/logs
|
artifacts/*
|
||||||
|
build/*
|
||||||
coverage.txt
|
coverage.txt
|
||||||
|
docs/.vuepress/dist
|
||||||
docs/_build
|
docs/_build
|
||||||
docs/dist
|
docs/dist
|
||||||
docs/.vuepress/dist
|
|
||||||
*.log
|
|
||||||
abci-cli
|
|
||||||
docs/node_modules/
|
docs/node_modules/
|
||||||
|
docs/spec
|
||||||
|
docs/.vuepress/public/rpc
|
||||||
index.html.md
|
index.html.md
|
||||||
|
|
||||||
scripts/wal2json/wal2json
|
|
||||||
scripts/cutWALUntil/cutWALUntil
|
|
||||||
|
|
||||||
.idea/
|
|
||||||
*.iml
|
|
||||||
|
|
||||||
.vscode/
|
|
||||||
|
|
||||||
libs/pubsub/query/fuzz_test/output
|
libs/pubsub/query/fuzz_test/output
|
||||||
|
profile\.out
|
||||||
|
remote_dump
|
||||||
|
rpc/test/.tendermint
|
||||||
|
scripts/cutWALUntil/cutWALUntil
|
||||||
|
scripts/wal2json/wal2json
|
||||||
shunit2
|
shunit2
|
||||||
|
|
||||||
.tendermint-lite
|
|
||||||
addrbook.json
|
|
||||||
|
|
||||||
*/vendor
|
|
||||||
.vendor-new/
|
|
||||||
*/.glide
|
|
||||||
.terraform
|
|
||||||
terraform.tfstate
|
terraform.tfstate
|
||||||
terraform.tfstate.backup
|
terraform.tfstate.backup
|
||||||
terraform.tfstate.d
|
terraform.tfstate.d
|
||||||
profile\.out
|
test/app/grpc_client
|
||||||
test/e2e/build
|
test/e2e/build
|
||||||
test/e2e/networks/*/
|
test/e2e/networks/*/
|
||||||
test/logs
|
test/logs
|
||||||
test/maverick/maverick
|
|
||||||
test/p2p/data/
|
test/p2p/data/
|
||||||
vendor
|
vendor
|
||||||
test/fuzz/**/corpus
|
test/fuzz/**/corpus
|
||||||
test/fuzz/**/crashers
|
test/fuzz/**/crashers
|
||||||
test/fuzz/**/suppressions
|
test/fuzz/**/suppressions
|
||||||
test/fuzz/**/*.zip
|
test/fuzz/**/*.zip
|
||||||
|
proto/spec/**/*.pb.go
|
||||||
*.aux
|
*.aux
|
||||||
*.bbl
|
*.bbl
|
||||||
*.blg
|
*.blg
|
||||||
|
*.log
|
||||||
*.pdf
|
*.pdf
|
||||||
*.gz
|
*.gz
|
||||||
*.dvi
|
*.dvi
|
||||||
|
|||||||
@@ -8,14 +8,7 @@ linters:
|
|||||||
- dupl
|
- dupl
|
||||||
- errcheck
|
- errcheck
|
||||||
- exportloopref
|
- exportloopref
|
||||||
# - funlen
|
|
||||||
# - gochecknoglobals
|
|
||||||
# - gochecknoinits
|
|
||||||
# - gocognit
|
|
||||||
- goconst
|
- goconst
|
||||||
# - gocritic
|
|
||||||
# - gocyclo
|
|
||||||
# - godox
|
|
||||||
- gofmt
|
- gofmt
|
||||||
- goimports
|
- goimports
|
||||||
- revive
|
- revive
|
||||||
@@ -23,48 +16,31 @@ linters:
|
|||||||
- gosimple
|
- gosimple
|
||||||
- govet
|
- govet
|
||||||
- ineffassign
|
- ineffassign
|
||||||
# - interfacer
|
- misspell
|
||||||
- lll
|
|
||||||
# - maligned
|
|
||||||
# - misspell
|
|
||||||
- nakedret
|
- nakedret
|
||||||
- nolintlint
|
- nolintlint
|
||||||
- prealloc
|
- prealloc
|
||||||
- staticcheck
|
- staticcheck
|
||||||
- structcheck
|
- structcheck
|
||||||
- stylecheck
|
- stylecheck
|
||||||
# - typecheck
|
- typecheck
|
||||||
- unconvert
|
- unconvert
|
||||||
# - unparam
|
|
||||||
- unused
|
- unused
|
||||||
- varcheck
|
- varcheck
|
||||||
# - whitespace
|
|
||||||
# - wsl
|
|
||||||
|
|
||||||
issues:
|
issues:
|
||||||
exclude-rules:
|
exclude-rules:
|
||||||
- path: _test\.go
|
- path: _test\.go
|
||||||
linters:
|
linters:
|
||||||
- gosec
|
- gosec
|
||||||
- linters:
|
|
||||||
- lll
|
|
||||||
source: "https://"
|
|
||||||
max-same-issues: 50
|
max-same-issues: 50
|
||||||
|
|
||||||
linters-settings:
|
linters-settings:
|
||||||
dogsled:
|
dogsled:
|
||||||
max-blank-identifiers: 3
|
max-blank-identifiers: 3
|
||||||
maligned:
|
golint:
|
||||||
suggest-new: true
|
|
||||||
# govet:
|
|
||||||
# check-shadowing: true
|
|
||||||
revive:
|
|
||||||
min-confidence: 0
|
min-confidence: 0
|
||||||
maligned:
|
maligned:
|
||||||
suggest-new: true
|
suggest-new: true
|
||||||
misspell:
|
misspell:
|
||||||
locale: US
|
locale: US
|
||||||
ignore-words:
|
|
||||||
- behaviour
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ env:
|
|||||||
- GO111MODULE=on
|
- GO111MODULE=on
|
||||||
|
|
||||||
builds:
|
builds:
|
||||||
- id: "Tendermint"
|
- id: "tendermint"
|
||||||
main: ./cmd/tendermint/main.go
|
main: ./cmd/tendermint/main.go
|
||||||
ldflags:
|
ldflags:
|
||||||
- -s -w -X github.com/tendermint/tendermint/version.TMCoreSemVer={{ .Version }}
|
- -s -w -X github.com/tendermint/tendermint/version.TMCoreSemVer={{ .Version }}
|
||||||
@@ -26,3 +26,11 @@ checksum:
|
|||||||
|
|
||||||
release:
|
release:
|
||||||
name_template: "{{.Version}} (WARNING: BETA SOFTWARE)"
|
name_template: "{{.Version}} (WARNING: BETA SOFTWARE)"
|
||||||
|
|
||||||
|
archives:
|
||||||
|
- files:
|
||||||
|
- LICENSE
|
||||||
|
- README.md
|
||||||
|
- UPGRADING.md
|
||||||
|
- SECURITY.md
|
||||||
|
- CHANGELOG.md
|
||||||
|
|||||||
@@ -1,4 +1,10 @@
|
|||||||
|
# markdownlint configuration
|
||||||
|
# https://github.com/DavidAnson/markdownlint
|
||||||
|
|
||||||
|
# Default state for all rules
|
||||||
default: true
|
default: true
|
||||||
|
|
||||||
|
# See https://github.com/DavidAnson/markdownlint#rules--aliases for rules
|
||||||
MD001: false
|
MD001: false
|
||||||
MD007: {indent: 4}
|
MD007: {indent: 4}
|
||||||
MD013: false
|
MD013: false
|
||||||
|
|||||||
6
.md-link-check.json
Normal file
6
.md-link-check.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"retryOn429": true,
|
||||||
|
"retryCount": 5,
|
||||||
|
"fallbackRetryDelay": "30s",
|
||||||
|
"aliveStatusCodes": [200, 206, 503]
|
||||||
|
}
|
||||||
10
.mergify.yml
10
.mergify.yml
@@ -1,10 +0,0 @@
|
|||||||
pull_request_rules:
|
|
||||||
- name: Automerge to master
|
|
||||||
conditions:
|
|
||||||
- base=master
|
|
||||||
- label=S:automerge
|
|
||||||
actions:
|
|
||||||
merge:
|
|
||||||
method: squash
|
|
||||||
strict: true
|
|
||||||
commit_message: title+body
|
|
||||||
8
.vscode/settings.json
vendored
8
.vscode/settings.json
vendored
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"protoc": {
|
|
||||||
"options": [
|
|
||||||
"--proto_path=${workspaceRoot}/proto",
|
|
||||||
"--proto_path=${workspaceRoot}/third_party/proto"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
25
Makefile
25
Makefile
@@ -1,5 +1,6 @@
|
|||||||
PACKAGES=$(shell go list ./...)
|
PACKAGES=$(shell go list ./...)
|
||||||
OUTPUT?=build/tendermint
|
BUILDDIR?=$(CURDIR)/build
|
||||||
|
OUTPUT?=$(BUILDDIR)/tendermint
|
||||||
|
|
||||||
BUILD_TAGS?=tendermint
|
BUILD_TAGS?=tendermint
|
||||||
|
|
||||||
@@ -286,3 +287,25 @@ endif
|
|||||||
contract-tests:
|
contract-tests:
|
||||||
dredd
|
dredd
|
||||||
.PHONY: contract-tests
|
.PHONY: contract-tests
|
||||||
|
|
||||||
|
# Implements test splitting and running. This is pulled directly from
|
||||||
|
# the github action workflows for better local reproducibility.
|
||||||
|
|
||||||
|
GO_TEST_FILES != find $(CURDIR) -name "*_test.go"
|
||||||
|
|
||||||
|
# default to four splits by default
|
||||||
|
NUM_SPLIT ?= 4
|
||||||
|
|
||||||
|
$(BUILDDIR):
|
||||||
|
mkdir -p $@
|
||||||
|
|
||||||
|
# The format statement filters out all packages that don't have tests.
|
||||||
|
# Note we need to check for both in-package tests (.TestGoFiles) and
|
||||||
|
# out-of-package tests (.XTestGoFiles).
|
||||||
|
$(BUILDDIR)/packages.txt:$(GO_TEST_FILES) $(BUILDDIR)
|
||||||
|
go list -f "{{ if (or .TestGoFiles .XTestGoFiles) }}{{ .ImportPath }}{{ end }}" ./... | sort > $@
|
||||||
|
|
||||||
|
split-test-packages:$(BUILDDIR)/packages.txt
|
||||||
|
split -d -n l/$(NUM_SPLIT) $< $<.
|
||||||
|
test-group-%:split-test-packages
|
||||||
|
cat $(BUILDDIR)/packages.txt.$* | xargs go test -mod=readonly -timeout=5m -race -coverprofile=$(BUILDDIR)/$*.profile.out
|
||||||
|
|||||||
10
appveyor.yml
10
appveyor.yml
@@ -1,12 +1,12 @@
|
|||||||
version: 1.0.{build}
|
version: 1.0.{build}
|
||||||
configuration: Release
|
configuration: Release
|
||||||
platform:
|
platform:
|
||||||
- x64
|
- x64
|
||||||
- x86
|
- x86
|
||||||
clone_folder: c:\go\path\src\github.com\tendermint\tendermint
|
clone_folder: c:\go\path\src\github.com\tendermint\tendermint
|
||||||
before_build:
|
before_build:
|
||||||
- cmd: set GOPATH=%GOROOT%\path
|
- cmd: set GOPATH=%GOROOT%\path
|
||||||
- cmd: set PATH=%GOPATH%\bin;%PATH%
|
- cmd: set PATH=%GOPATH%\bin;%PATH%
|
||||||
build_script:
|
build_script:
|
||||||
- cmd: make test
|
- cmd: make test
|
||||||
test: off
|
test: off
|
||||||
|
|||||||
@@ -63,6 +63,4 @@ networks:
|
|||||||
ipam:
|
ipam:
|
||||||
driver: default
|
driver: default
|
||||||
config:
|
config:
|
||||||
-
|
- subnet: 192.167.10.0/16
|
||||||
subnet: 192.167.10.0/16
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,4 +15,3 @@
|
|||||||
- config
|
- config
|
||||||
- unsafe_reset
|
- unsafe_reset
|
||||||
- start
|
- start
|
||||||
|
|
||||||
|
|||||||
@@ -8,4 +8,3 @@
|
|||||||
- service: tendermint
|
- service: tendermint
|
||||||
roles:
|
roles:
|
||||||
- install
|
- install
|
||||||
|
|
||||||
|
|||||||
@@ -11,4 +11,3 @@
|
|||||||
- JOURNALBEAT_BINARY: "{{lookup('env', 'GOPATH')}}/bin/journalbeat"
|
- JOURNALBEAT_BINARY: "{{lookup('env', 'GOPATH')}}/bin/journalbeat"
|
||||||
roles:
|
roles:
|
||||||
- logzio
|
- logzio
|
||||||
|
|
||||||
|
|||||||
@@ -10,5 +10,3 @@
|
|||||||
- stop
|
- stop
|
||||||
- unsafe_reset
|
- unsafe_reset
|
||||||
- start
|
- start
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,4 +9,3 @@
|
|||||||
roles:
|
roles:
|
||||||
- stop
|
- stop
|
||||||
- start
|
- start
|
||||||
|
|
||||||
|
|||||||
@@ -13,5 +13,4 @@
|
|||||||
dest: "/home/{{service}}/.{{service}}/"
|
dest: "/home/{{service}}/.{{service}}/"
|
||||||
owner: "{{service}}"
|
owner: "{{service}}"
|
||||||
group: "{{service}}"
|
group: "{{service}}"
|
||||||
loop: [ 0, 1, 2, 3, 4, 5, 6, 7 ]
|
loop: [0, 1, 2, 3, 4, 5, 6, 7]
|
||||||
|
|
||||||
|
|||||||
@@ -2,4 +2,3 @@
|
|||||||
|
|
||||||
- name: reload services
|
- name: reload services
|
||||||
systemd: "name={{service}} daemon_reload=yes enabled=yes"
|
systemd: "name={{service}} daemon_reload=yes enabled=yes"
|
||||||
|
|
||||||
|
|||||||
@@ -12,4 +12,3 @@
|
|||||||
- name: Create service
|
- name: Create service
|
||||||
template: "src=systemd.service.j2 dest=/etc/systemd/system/{{service}}.service"
|
template: "src=systemd.service.j2 dest=/etc/systemd/system/{{service}}.service"
|
||||||
notify: reload services
|
notify: reload services
|
||||||
|
|
||||||
|
|||||||
@@ -5,4 +5,3 @@
|
|||||||
|
|
||||||
- name: restart journalbeat
|
- name: restart journalbeat
|
||||||
service: name=journalbeat state=restarted
|
service: name=journalbeat state=restarted
|
||||||
|
|
||||||
|
|||||||
@@ -24,4 +24,3 @@
|
|||||||
notify:
|
notify:
|
||||||
- reload daemon
|
- reload daemon
|
||||||
- restart journalbeat
|
- restart journalbeat
|
||||||
|
|
||||||
|
|||||||
@@ -2,4 +2,3 @@
|
|||||||
|
|
||||||
- name: start service
|
- name: start service
|
||||||
service: "name={{service}} state=started"
|
service: "name={{service}} state=started"
|
||||||
|
|
||||||
|
|||||||
@@ -7,4 +7,3 @@
|
|||||||
|
|
||||||
- name: Result
|
- name: Result
|
||||||
debug: var=status.stdout_lines
|
debug: var=status.stdout_lines
|
||||||
|
|
||||||
|
|||||||
@@ -2,4 +2,3 @@
|
|||||||
|
|
||||||
- name: stop service
|
- name: stop service
|
||||||
service: "name={{service}} state=stopped"
|
service: "name={{service}} state=stopped"
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
- command: "{{service}} unsafe_reset_all {{ (service != 'tendermint') | ternary('node','') }} --home /home/{{service}}/.{{service}}"
|
- command: "{{service}} unsafe_reset_all {{ (service != 'tendermint') | ternary('node','') }} --home /home/{{service}}/.{{service}}"
|
||||||
become_user: "{{service}}"
|
become_user: "{{service}}"
|
||||||
become: yes
|
become: yes
|
||||||
|
|
||||||
|
|||||||
@@ -8,4 +8,3 @@
|
|||||||
- service: tendermint
|
- service: tendermint
|
||||||
roles:
|
roles:
|
||||||
- start
|
- start
|
||||||
|
|
||||||
|
|||||||
@@ -8,4 +8,3 @@
|
|||||||
- service: tendermint
|
- service: tendermint
|
||||||
roles:
|
roles:
|
||||||
- status
|
- status
|
||||||
|
|
||||||
|
|||||||
@@ -8,4 +8,3 @@
|
|||||||
- service: tendermint
|
- service: tendermint
|
||||||
roles:
|
roles:
|
||||||
- stop
|
- stop
|
||||||
|
|
||||||
|
|||||||
@@ -537,8 +537,7 @@ paths:
|
|||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
example:
|
example: "f9baeaa15fedf5e1ef7448dd60f46c01f1a9e9c4@1.2.3.4:26656"
|
||||||
["f9baeaa15fedf5e1ef7448dd60f46c01f1a9e9c4@1.2.3.4:26656"]
|
|
||||||
responses:
|
responses:
|
||||||
"200":
|
"200":
|
||||||
description: Dialing seeds in progress. See /net_info for details
|
description: Dialing seeds in progress. See /net_info for details
|
||||||
@@ -588,8 +587,7 @@ paths:
|
|||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
example:
|
example: "f9baeaa15fedf5e1ef7448dd60f46c01f1a9e9c4@1.2.3.4:26656"
|
||||||
["f9baeaa15fedf5e1ef7448dd60f46c01f1a9e9c4@1.2.3.4:26656"]
|
|
||||||
responses:
|
responses:
|
||||||
"200":
|
"200":
|
||||||
description: Dialing seeds in progress. See /net_info for details
|
description: Dialing seeds in progress. See /net_info for details
|
||||||
@@ -1674,7 +1672,7 @@ components:
|
|||||||
nullable: false
|
nullable: false
|
||||||
items:
|
items:
|
||||||
$ref: "#/components/schemas/Event"
|
$ref: "#/components/schemas/Event"
|
||||||
end_block:
|
end_block_events:
|
||||||
type: array
|
type: array
|
||||||
nullable: true
|
nullable: true
|
||||||
items:
|
items:
|
||||||
@@ -1709,7 +1707,7 @@ components:
|
|||||||
power:
|
power:
|
||||||
type: string
|
type: string
|
||||||
example: "300"
|
example: "300"
|
||||||
consensus_params_updates:
|
consensus_param_updates:
|
||||||
$ref: "#/components/schemas/ConsensusParams"
|
$ref: "#/components/schemas/ConsensusParams"
|
||||||
|
|
||||||
CommitResponse:
|
CommitResponse:
|
||||||
@@ -2742,6 +2740,33 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
example: "Dialing seeds in progress. See /net_info for details"
|
example: "Dialing seeds in progress. See /net_info for details"
|
||||||
|
|
||||||
|
BlockSearchResponse:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- "jsonrpc"
|
||||||
|
- "id"
|
||||||
|
- "result"
|
||||||
|
properties:
|
||||||
|
jsonrpc:
|
||||||
|
type: string
|
||||||
|
example: "2.0"
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
example: 0
|
||||||
|
result:
|
||||||
|
required:
|
||||||
|
- "blocks"
|
||||||
|
- "total_count"
|
||||||
|
properties:
|
||||||
|
blocks:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/BlockComplete"
|
||||||
|
total_count:
|
||||||
|
type: integer
|
||||||
|
example: 2
|
||||||
|
type: object
|
||||||
|
|
||||||
###### Reuseable types ######
|
###### Reuseable types ######
|
||||||
|
|
||||||
# Validator type with proposer prioirty
|
# Validator type with proposer prioirty
|
||||||
|
|||||||
@@ -5,4 +5,3 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- ./:/home/user/tendermint-proof:ro
|
- ./:/home/user/tendermint-proof:ro
|
||||||
- ./output:/home/user/tendermint-proof/output:rw
|
- ./output:/home/user/tendermint-proof/output:rw
|
||||||
|
|
||||||
|
|||||||
@@ -1,290 +0,0 @@
|
|||||||
Using Kubernetes
|
|
||||||
================
|
|
||||||
|
|
||||||
.. figure:: assets/t_plus_k.png
|
|
||||||
:alt: Tendermint plus Kubernetes
|
|
||||||
|
|
||||||
Tendermint plus Kubernetes
|
|
||||||
|
|
||||||
This should primarily be used for testing purposes or for
|
|
||||||
tightly-defined chains operated by a single stakeholder (see `the
|
|
||||||
security precautions <#security>`__). If your desire is to launch an
|
|
||||||
application with many stakeholders, consider using our set of Ansible
|
|
||||||
scripts.
|
|
||||||
|
|
||||||
Quick Start
|
|
||||||
-----------
|
|
||||||
|
|
||||||
For either platform, see the `requirements <https://github.com/kubernetes/minikube#requirements>`__
|
|
||||||
|
|
||||||
MacOS
|
|
||||||
^^^^^
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/kubectl
|
|
||||||
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.18.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
|
|
||||||
minikube start
|
|
||||||
|
|
||||||
git clone https://github.com/tendermint/tools.git && cd tools/mintnet-kubernetes/examples/basecoin && make create
|
|
||||||
|
|
||||||
Linux
|
|
||||||
^^^^^
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/kubectl
|
|
||||||
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.18.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
|
|
||||||
minikube start
|
|
||||||
|
|
||||||
git clone https://github.com/tendermint/tools.git && cd tools/mintnet-kubernetes/examples/basecoin && make create
|
|
||||||
|
|
||||||
Verify it worked
|
|
||||||
~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
**Using a shell:**
|
|
||||||
|
|
||||||
First wait until all the pods are ``Running``:
|
|
||||||
|
|
||||||
``kubectl get pods -w -o wide -L tm``
|
|
||||||
|
|
||||||
then query the Tendermint app logs from the first pod:
|
|
||||||
|
|
||||||
``kubectl logs -c tm -f tm-0``
|
|
||||||
|
|
||||||
finally, use our `Rest API <https://tendermint.com/docs/tendermint-core/rpc.html>`__ to fetch the status of the second pod's Tendermint app.
|
|
||||||
|
|
||||||
Note we are using ``kubectl exec`` because pods are not exposed (and should not be) to the
|
|
||||||
outer network:
|
|
||||||
|
|
||||||
``kubectl exec -c tm tm-0 -- curl -s http://tm-1.basecoin:26657/status | json_pp``
|
|
||||||
|
|
||||||
**Using the dashboard:**
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
minikube dashboard
|
|
||||||
|
|
||||||
Clean up
|
|
||||||
~~~~~~~~
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
make destroy
|
|
||||||
|
|
||||||
Usage
|
|
||||||
-----
|
|
||||||
|
|
||||||
Setup a Kubernetes cluster
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
- locally using `Minikube <https://github.com/kubernetes/minikube>`__
|
|
||||||
- on GCE with a single click in the web UI
|
|
||||||
- on AWS using `Kubernetes
|
|
||||||
Operations <https://github.com/kubernetes/kops/blob/master/docs/aws.md>`__
|
|
||||||
- on Linux machines (Digital Ocean) using
|
|
||||||
`kubeadm <https://kubernetes.io/docs/getting-started-guides/kubeadm/>`__
|
|
||||||
- on AWS, Azure, GCE or bare metal using `Kargo
|
|
||||||
(Ansible) <https://kubernetes.io/docs/getting-started-guides/kargo/>`__
|
|
||||||
|
|
||||||
Please refer to `the official
|
|
||||||
documentation <https://kubernetes.io/docs/getting-started-guides/>`__
|
|
||||||
for overview and comparison of different options.
|
|
||||||
|
|
||||||
Kubernetes on Digital Ocean
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Available options:
|
|
||||||
|
|
||||||
- `kubeadm (alpha) <https://kubernetes.io/docs/getting-started-guides/kubeadm/>`__
|
|
||||||
- `kargo <https://kubernetes.io/docs/getting-started-guides/kargo/>`__
|
|
||||||
- `rancher <http://rancher.com/>`__
|
|
||||||
- `terraform <https://github.com/hermanjunge/kubernetes-digitalocean-terraform>`__
|
|
||||||
|
|
||||||
As you can see, there is no single tool for creating a cluster on DO.
|
|
||||||
Therefore, choose the one you know and comfortable working with. If you know
|
|
||||||
and used `terraform <https://www.terraform.io/>`__ before, then choose it. If you
|
|
||||||
know Ansible, then pick kargo. If none of these seem familiar to you, go with
|
|
||||||
``kubeadm``. Rancher is a beautiful UI for deploying and managing containers in
|
|
||||||
production.
|
|
||||||
|
|
||||||
Kubernetes on Google Cloud Engine
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Review the `Official Documentation <https://kubernetes.io/docs/getting-started-guides/gce/>`__ for Kubernetes on Google Compute
|
|
||||||
Engine.
|
|
||||||
|
|
||||||
**Create a cluster**
|
|
||||||
|
|
||||||
The recommended way is to use `Google Container
|
|
||||||
Engine <https://cloud.google.com/container-engine/>`__. You should be able
|
|
||||||
to create a fully fledged cluster with just a few clicks.
|
|
||||||
|
|
||||||
**Connect to it**
|
|
||||||
|
|
||||||
Install ``gcloud`` as a part of `Google Cloud SDK <https://cloud.google.com/sdk/>`__.
|
|
||||||
|
|
||||||
Make sure you have credentials for GCloud by running ``gcloud auth login``.
|
|
||||||
|
|
||||||
In order to make API calls against GCE, you must also run ``gcloud auth
|
|
||||||
application-default login``.
|
|
||||||
|
|
||||||
Press ``Connect``:
|
|
||||||
|
|
||||||
.. figure:: assets/gce1.png
|
|
||||||
|
|
||||||
and execute the first command in your shell. Then start a proxy by
|
|
||||||
executing ``kubectl` proxy``.
|
|
||||||
|
|
||||||
.. figure:: assets/gce2.png
|
|
||||||
|
|
||||||
Now you should be able to run ``kubectl`` command to create resources, get
|
|
||||||
resource info, logs, etc.
|
|
||||||
|
|
||||||
**Make sure you have Kubernetes >= 1.5, because you will be using
|
|
||||||
StatefulSets, which is a beta feature in 1.5.**
|
|
||||||
|
|
||||||
Create a configuration file
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
Download a template:
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
curl -Lo app.yaml https://github.com/tendermint/tools/raw/master/mintnet-kubernetes/app.template.yaml
|
|
||||||
|
|
||||||
Open ``app.yaml`` in your favorite editor and configure your app
|
|
||||||
container (navigate to ``- name: app``). Kubernetes DSL (Domain Specific
|
|
||||||
Language) is very simple, so it should be easy. You will need to set
|
|
||||||
Docker image, command and/or run arguments. Replace variables prefixed
|
|
||||||
with ``YOUR_APP`` with corresponding values. Set genesis time to now and
|
|
||||||
preferable chain ID in ConfigMap.
|
|
||||||
|
|
||||||
Please note if you are changing ``replicas`` number, do not forget to
|
|
||||||
update ``validators`` set in ConfigMap. You will be able to scale the
|
|
||||||
cluster up or down later, but new pods (nodes) won't become validators
|
|
||||||
automatically.
|
|
||||||
|
|
||||||
Deploy your application
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
kubectl create -f ./app.yaml
|
|
||||||
|
|
||||||
Observe your cluster
|
|
||||||
^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
`web UI <https://github.com/kubernetes/dashboard>`__
|
|
||||||
|
|
||||||
The easiest way to access Dashboard is to use ``kubectl``. Run the following
|
|
||||||
command in your desktop environment:
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
kubectl proxy
|
|
||||||
|
|
||||||
``kubectl`` will handle authentication with apiserver and make Dashboard
|
|
||||||
available at http://localhost:8001/ui
|
|
||||||
|
|
||||||
**shell**
|
|
||||||
|
|
||||||
List all the pods:
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
kubectl get pods -o wide -L tm
|
|
||||||
|
|
||||||
StatefulSet details:
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
kubectl describe statefulsets tm
|
|
||||||
|
|
||||||
First pod details:
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
kubectl describe pod tm-0
|
|
||||||
|
|
||||||
Tendermint app logs from the first pod:
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
kubectl logs tm-0 -c tm -f
|
|
||||||
|
|
||||||
App logs from the first pod:
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
kubectl logs tm-0 -c app -f
|
|
||||||
|
|
||||||
Status of the second pod's Tendermint app:
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
kubectl exec -c tm tm-0 -- curl -s http://tm-1.<YOUR_APP_NAME>:26657/status | json_pp
|
|
||||||
|
|
||||||
Security
|
|
||||||
--------
|
|
||||||
|
|
||||||
Due to the nature of Kubernetes, where you typically have a single
|
|
||||||
master, the master could be a SPOF (Single Point Of Failure). Therefore,
|
|
||||||
you need to make sure only authorized people can access it. And these
|
|
||||||
people themselves had taken basic measures in order not to get hacked.
|
|
||||||
|
|
||||||
These are the best practices:
|
|
||||||
|
|
||||||
- all access to the master is over TLS
|
|
||||||
- access to the API Server is X.509 certificate or token based
|
|
||||||
- etcd is not exposed directly to the cluster
|
|
||||||
- ensure that images are free of vulnerabilities
|
|
||||||
(`1 <https://github.com/coreos/clair>`__)
|
|
||||||
- ensure that only authorized images are used in your environment
|
|
||||||
- disable direct access to Kubernetes nodes (no SSH)
|
|
||||||
- define resource quota
|
|
||||||
|
|
||||||
Resources:
|
|
||||||
|
|
||||||
- https://kubernetes.io/docs/admin/accessing-the-api/
|
|
||||||
- http://blog.kubernetes.io/2016/08/security-best-practices-kubernetes-deployment.html
|
|
||||||
- https://blog.openshift.com/securing-kubernetes/
|
|
||||||
|
|
||||||
Fault tolerance
|
|
||||||
---------------
|
|
||||||
|
|
||||||
Having a single master (API server) is a bad thing also because if
|
|
||||||
something happens to it, you risk being left without an access to the
|
|
||||||
application.
|
|
||||||
|
|
||||||
To avoid that you can `run Kubernetes in multiple
|
|
||||||
zones <https://kubernetes.io/docs/admin/multiple-zones/>`__, each zone
|
|
||||||
running an `API
|
|
||||||
server <https://kubernetes.io/docs/admin/high-availability/>`__ and load
|
|
||||||
balance requests between them. Do not forget to make sure only one
|
|
||||||
instance of scheduler and controller-manager are running at once.
|
|
||||||
|
|
||||||
Running in multiple zones is a lightweight version of a broader `Cluster
|
|
||||||
Federation feature <https://kubernetes.io/docs/admin/federation/>`__.
|
|
||||||
Federated deployments could span across multiple regions (not zones). We
|
|
||||||
haven't tried this feature yet, so any feedback is highly appreciated!
|
|
||||||
Especially, related to additional latency and cost of exchanging data
|
|
||||||
between the regions.
|
|
||||||
|
|
||||||
Resources:
|
|
||||||
|
|
||||||
- https://kubernetes.io/docs/admin/high-availability/
|
|
||||||
|
|
||||||
Starting process
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. figure:: assets/statefulset.png
|
|
||||||
:alt: StatefulSet
|
|
||||||
|
|
||||||
StatefulSet
|
|
||||||
|
|
||||||
Init containers (``tm-gen-validator``) are run before all other
|
|
||||||
containers, creating public-private key pair for each pod. Every ``tm``
|
|
||||||
container then asks other pods for their public keys, which are served
|
|
||||||
with nginx (``pub-key`` container). When ``tm`` container have all the
|
|
||||||
keys, it forms a genesis file and starts the Tendermint process.
|
|
||||||
@@ -1,265 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
annotations:
|
|
||||||
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
|
|
||||||
name: YOUR_APP_NAME
|
|
||||||
labels:
|
|
||||||
app: YOUR_APP_NAME
|
|
||||||
spec:
|
|
||||||
ports:
|
|
||||||
- port: 26656
|
|
||||||
name: p2p
|
|
||||||
- port: 26657
|
|
||||||
name: rpc
|
|
||||||
clusterIP: None
|
|
||||||
selector:
|
|
||||||
app: tm
|
|
||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ConfigMap
|
|
||||||
metadata:
|
|
||||||
name: tm-config
|
|
||||||
data:
|
|
||||||
seeds: "tm-0,tm-1,tm-2,tm-3"
|
|
||||||
validators: "tm-0,tm-1,tm-2,tm-3"
|
|
||||||
validator.power: "10"
|
|
||||||
genesis.json: |-
|
|
||||||
{
|
|
||||||
"genesis_time": "2017-01-02T10:10:10.164Z",
|
|
||||||
"chain_id": "chain-B5XXm5",
|
|
||||||
"validators": [],
|
|
||||||
"app_hash": ""
|
|
||||||
}
|
|
||||||
pub_key_nginx.conf: |-
|
|
||||||
server {
|
|
||||||
listen 80 default_server;
|
|
||||||
listen [::]:80 default_server ipv6only=on;
|
|
||||||
location /pub_key.json { root /usr/share/nginx/; }
|
|
||||||
}
|
|
||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodDisruptionBudget
|
|
||||||
metadata:
|
|
||||||
name: tm-budget
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: tm
|
|
||||||
minAvailable: 2
|
|
||||||
---
|
|
||||||
apiVersion: apps/v1beta1
|
|
||||||
kind: StatefulSet
|
|
||||||
metadata:
|
|
||||||
name: tm
|
|
||||||
spec:
|
|
||||||
serviceName: YOUR_APP_NAME
|
|
||||||
replicas: 4
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: tm
|
|
||||||
version: v1
|
|
||||||
annotations:
|
|
||||||
pod.beta.kubernetes.io/init-containers: '[{
|
|
||||||
"name": "tm-gen-validator",
|
|
||||||
"image": "tendermint/tendermint:0.10.0",
|
|
||||||
"imagePullPolicy": "IfNotPresent",
|
|
||||||
"command": ["bash", "-c", "
|
|
||||||
set -ex\n
|
|
||||||
if [ ! -f /tendermint/priv_validator.json ]; then\n
|
|
||||||
tendermint gen_validator > /tendermint/priv_validator.json\n
|
|
||||||
# pub_key.json will be served by pub-key container\n
|
|
||||||
cat /tendermint/priv_validator.json | jq \".pub_key\" > /tendermint/pub_key.json\n
|
|
||||||
fi\n
|
|
||||||
"],
|
|
||||||
"volumeMounts": [
|
|
||||||
{"name": "tmdir", "mountPath": "/tendermint"}
|
|
||||||
]
|
|
||||||
}]'
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: tm
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
image: tendermint/tendermint:0.10.0
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
cpu: 50m
|
|
||||||
memory: 128Mi
|
|
||||||
limits:
|
|
||||||
cpu: 100m
|
|
||||||
memory: 256Mi
|
|
||||||
ports:
|
|
||||||
- containerPort: 26656
|
|
||||||
name: p2p
|
|
||||||
- containerPort: 26657
|
|
||||||
name: rpc
|
|
||||||
env:
|
|
||||||
- name: SEEDS
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: tm-config
|
|
||||||
key: seeds
|
|
||||||
- name: VALIDATOR_POWER
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: tm-config
|
|
||||||
key: validator.power
|
|
||||||
- name: VALIDATORS
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: tm-config
|
|
||||||
key: validators
|
|
||||||
- name: TMHOME
|
|
||||||
value: /tendermint
|
|
||||||
command:
|
|
||||||
- bash
|
|
||||||
- "-c"
|
|
||||||
- |
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
# copy template
|
|
||||||
cp /etc/tendermint/genesis.json /tendermint/genesis.json
|
|
||||||
|
|
||||||
# fill genesis file with validators
|
|
||||||
IFS=',' read -ra VALS_ARR <<< "$VALIDATORS"
|
|
||||||
fqdn_suffix=$(hostname -f | sed 's#[^.]*\.\(\)#\1#')
|
|
||||||
for v in "${VALS_ARR[@]}"; do
|
|
||||||
# wait until validator generates priv/pub key pair
|
|
||||||
set +e
|
|
||||||
|
|
||||||
curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null
|
|
||||||
ERR=$?
|
|
||||||
while [ "$ERR" != 0 ]; do
|
|
||||||
sleep 5
|
|
||||||
curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null
|
|
||||||
ERR=$?
|
|
||||||
done
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# add validator to genesis file along with its pub_key
|
|
||||||
curl -s "http://$v.$fqdn_suffix/pub_key.json" | jq ". as \$k | {pub_key: \$k, amount: $VALIDATOR_POWER, name: \"$v\"}" > pub_validator.json
|
|
||||||
cat /tendermint/genesis.json | jq ".validators |= .+ [$(cat pub_validator.json)]" > tmpgenesis && mv tmpgenesis /tendermint/genesis.json
|
|
||||||
rm pub_validator.json
|
|
||||||
done
|
|
||||||
|
|
||||||
# construct seeds
|
|
||||||
IFS=',' read -ra SEEDS_ARR <<< "$SEEDS"
|
|
||||||
seeds=()
|
|
||||||
for s in "${SEEDS_ARR[@]}"; do
|
|
||||||
seeds+=("$s.$fqdn_suffix:26656")
|
|
||||||
done
|
|
||||||
seeds=$(IFS=','; echo "${seeds[*]}")
|
|
||||||
|
|
||||||
tendermint node --p2p.seeds="$seeds" --moniker="`hostname`" --proxy_app="unix:///socks/app.sock"
|
|
||||||
volumeMounts:
|
|
||||||
- name: tmdir
|
|
||||||
mountPath: /tendermint
|
|
||||||
- mountPath: /etc/tendermint/genesis.json
|
|
||||||
name: configdir
|
|
||||||
subPath: genesis.json
|
|
||||||
- name: socksdir
|
|
||||||
mountPath: /socks
|
|
||||||
|
|
||||||
- name: app
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
image: YOUR_APP_IMAGE
|
|
||||||
args: ["--addr=\"unix:///socks/app.sock\""]
|
|
||||||
volumeMounts:
|
|
||||||
- name: socksdir
|
|
||||||
mountPath: /socks
|
|
||||||
|
|
||||||
######## OR ########
|
|
||||||
#
|
|
||||||
# - name: app
|
|
||||||
# imagePullPolicy: IfNotPresent
|
|
||||||
# image: golang:1.7.5
|
|
||||||
# resources:
|
|
||||||
# requests:
|
|
||||||
# cpu: YOUR_APP_CPU_REQ
|
|
||||||
# memory: YOUR_APP_MEM_REQ
|
|
||||||
# limits:
|
|
||||||
# cpu: YOUR_APP_CPU_LIMIT
|
|
||||||
# memory: YOUR_APP_MEM_LIMIT
|
|
||||||
# command:
|
|
||||||
# - bash
|
|
||||||
# - "-c"
|
|
||||||
# - |
|
|
||||||
# set -ex
|
|
||||||
|
|
||||||
# go get -d YOUR_APP_PACKAGE
|
|
||||||
# cd $GOPATH/YOUR_APP_PACKAGE
|
|
||||||
# make install
|
|
||||||
#
|
|
||||||
# rm -f /socks/app.sock # remove old socket
|
|
||||||
|
|
||||||
# YOUR_APP_EXEC --addr="unix:///socks/app.sock"
|
|
||||||
# volumeMounts:
|
|
||||||
# - name: socksdir
|
|
||||||
# mountPath: /socks
|
|
||||||
|
|
||||||
######## OPTIONALLY ########
|
|
||||||
#
|
|
||||||
# - name: data
|
|
||||||
# imagePullPolicy: IfNotPresent
|
|
||||||
# image: golang:1.7.5
|
|
||||||
# command:
|
|
||||||
# - bash
|
|
||||||
# - "-c"
|
|
||||||
# - |
|
|
||||||
# set -ex
|
|
||||||
# go get github.com/tendermint/merkleeyes/cmd/merkleeyes
|
|
||||||
# rm -f /socks/data.sock # remove old socket
|
|
||||||
# merkleeyes server --address="unix:///socks/data.sock"
|
|
||||||
# volumeMounts:
|
|
||||||
# - name: socksdir
|
|
||||||
# mountPath: /socks
|
|
||||||
|
|
||||||
- name: pub-key
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
image: nginx:1.11.9
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
cpu: 10m
|
|
||||||
memory: 12Mi
|
|
||||||
limits:
|
|
||||||
cpu: 20m
|
|
||||||
memory: 24Mi
|
|
||||||
ports:
|
|
||||||
- containerPort: 80
|
|
||||||
name: pub-key
|
|
||||||
command:
|
|
||||||
- bash
|
|
||||||
- "-c"
|
|
||||||
- |
|
|
||||||
set -ex
|
|
||||||
# fixes 403 Permission Denied (open() "/tendermint/pub_key.json" failed (13: Permission denied))
|
|
||||||
# => we cannot serve from /tendermint, so we copy the file
|
|
||||||
mkdir -p /usr/share/nginx
|
|
||||||
cp /tendermint/pub_key.json /usr/share/nginx/pub_key.json
|
|
||||||
nginx -g "daemon off;"
|
|
||||||
volumeMounts:
|
|
||||||
- name: tmdir
|
|
||||||
mountPath: /tendermint
|
|
||||||
- mountPath: /etc/nginx/conf.d/pub_key.conf
|
|
||||||
name: configdir
|
|
||||||
subPath: pub_key_nginx.conf
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- name: configdir
|
|
||||||
configMap:
|
|
||||||
name: tm-config
|
|
||||||
- name: socksdir
|
|
||||||
emptyDir: {}
|
|
||||||
|
|
||||||
volumeClaimTemplates:
|
|
||||||
- metadata:
|
|
||||||
name: tmdir
|
|
||||||
annotations:
|
|
||||||
volume.alpha.kubernetes.io/storage-class: anything
|
|
||||||
spec:
|
|
||||||
accessModes: ["ReadWriteOnce"]
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
storage: 2Gi
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 30 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 17 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB |
@@ -1,10 +0,0 @@
|
|||||||
create:
|
|
||||||
@echo "==> Creating deployment"
|
|
||||||
@kubectl create -f app.yaml
|
|
||||||
|
|
||||||
destroy:
|
|
||||||
@echo "==> Destroying deployment"
|
|
||||||
@kubectl delete -f app.yaml
|
|
||||||
@kubectl delete pvc -l app=tm
|
|
||||||
|
|
||||||
.PHONY: create destroy
|
|
||||||
@@ -1,214 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
annotations:
|
|
||||||
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
|
|
||||||
name: counter
|
|
||||||
labels:
|
|
||||||
app: counter
|
|
||||||
spec:
|
|
||||||
ports:
|
|
||||||
- port: 26656
|
|
||||||
name: p2p
|
|
||||||
- port: 26657
|
|
||||||
name: rpc
|
|
||||||
clusterIP: None
|
|
||||||
selector:
|
|
||||||
app: tm
|
|
||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ConfigMap
|
|
||||||
metadata:
|
|
||||||
name: tm-config
|
|
||||||
data:
|
|
||||||
seeds: "tm-0,tm-1,tm-2,tm-3"
|
|
||||||
validators: "tm-0,tm-1,tm-2,tm-3"
|
|
||||||
validator.power: "10"
|
|
||||||
genesis.json: |-
|
|
||||||
{
|
|
||||||
"genesis_time": "2016-02-05T23:17:31.164Z",
|
|
||||||
"chain_id": "chain-B5XXm5",
|
|
||||||
"validators": [],
|
|
||||||
"app_hash": ""
|
|
||||||
}
|
|
||||||
pub_key_nginx.conf: |-
|
|
||||||
server {
|
|
||||||
listen 80 default_server;
|
|
||||||
listen [::]:80 default_server ipv6only=on;
|
|
||||||
location /pub_key.json { root /usr/share/nginx/; }
|
|
||||||
}
|
|
||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodDisruptionBudget
|
|
||||||
metadata:
|
|
||||||
name: tm-budget
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: tm
|
|
||||||
minAvailable: 2
|
|
||||||
---
|
|
||||||
apiVersion: apps/v1beta1
|
|
||||||
kind: StatefulSet
|
|
||||||
metadata:
|
|
||||||
name: tm
|
|
||||||
spec:
|
|
||||||
serviceName: counter
|
|
||||||
replicas: 4
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: tm
|
|
||||||
annotations:
|
|
||||||
pod.beta.kubernetes.io/init-containers: '[{
|
|
||||||
"name": "tm-gen-validator",
|
|
||||||
"image": "tendermint/tendermint:0.10.0",
|
|
||||||
"imagePullPolicy": "IfNotPresent",
|
|
||||||
"command": ["bash", "-c", "
|
|
||||||
set -ex\n
|
|
||||||
if [ ! -f /tendermint/priv_validator.json ]; then\n
|
|
||||||
tendermint gen_validator > /tendermint/priv_validator.json\n
|
|
||||||
# pub_key.json will be served by pub-key container\n
|
|
||||||
cat /tendermint/priv_validator.json | jq \".pub_key\" > /tendermint/pub_key.json\n
|
|
||||||
fi\n
|
|
||||||
"],
|
|
||||||
"volumeMounts": [
|
|
||||||
{"name": "tmdir", "mountPath": "/tendermint"}
|
|
||||||
]
|
|
||||||
}]'
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: tm
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
image: tendermint/tendermint:0.10.0
|
|
||||||
ports:
|
|
||||||
- containerPort: 26656
|
|
||||||
name: p2p
|
|
||||||
- containerPort: 26657
|
|
||||||
name: rpc
|
|
||||||
env:
|
|
||||||
- name: SEEDS
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: tm-config
|
|
||||||
key: seeds
|
|
||||||
- name: VALIDATOR_POWER
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: tm-config
|
|
||||||
key: validator.power
|
|
||||||
- name: VALIDATORS
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: tm-config
|
|
||||||
key: validators
|
|
||||||
- name: TMHOME
|
|
||||||
value: /tendermint
|
|
||||||
command:
|
|
||||||
- bash
|
|
||||||
- "-c"
|
|
||||||
- |
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
# copy template
|
|
||||||
cp /etc/tendermint/genesis.json /tendermint/genesis.json
|
|
||||||
|
|
||||||
# fill genesis file with validators
|
|
||||||
IFS=',' read -ra VALS_ARR <<< "$VALIDATORS"
|
|
||||||
fqdn_suffix=$(hostname -f | sed 's#[^.]*\.\(\)#\1#')
|
|
||||||
for v in "${VALS_ARR[@]}"; do
|
|
||||||
# wait until validator generates priv/pub key pair
|
|
||||||
set +e
|
|
||||||
|
|
||||||
curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null
|
|
||||||
ERR=$?
|
|
||||||
while [ "$ERR" != 0 ]; do
|
|
||||||
sleep 5
|
|
||||||
curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null
|
|
||||||
ERR=$?
|
|
||||||
done
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# add validator to genesis file along with its pub_key
|
|
||||||
curl -s "http://$v.$fqdn_suffix/pub_key.json" | jq ". as \$k | {pub_key: \$k, amount: $VALIDATOR_POWER, name: \"$v\"}" > pub_validator.json
|
|
||||||
cat /tendermint/genesis.json | jq ".validators |= .+ [$(cat pub_validator.json)]" > tmpgenesis && mv tmpgenesis /tendermint/genesis.json
|
|
||||||
rm pub_validator.json
|
|
||||||
done
|
|
||||||
|
|
||||||
# construct seeds
|
|
||||||
IFS=',' read -ra SEEDS_ARR <<< "$SEEDS"
|
|
||||||
seeds=()
|
|
||||||
for s in "${SEEDS_ARR[@]}"; do
|
|
||||||
seeds+=("$s.$fqdn_suffix:26656")
|
|
||||||
done
|
|
||||||
seeds=$(IFS=','; echo "${seeds[*]}")
|
|
||||||
|
|
||||||
tendermint node --p2p.seeds="$seeds" --moniker="`hostname`" --proxy_app="unix:///socks/app.sock"
|
|
||||||
volumeMounts:
|
|
||||||
- name: tmdir
|
|
||||||
mountPath: /tendermint
|
|
||||||
- mountPath: /etc/tendermint/genesis.json
|
|
||||||
name: tmconfigdir
|
|
||||||
subPath: genesis.json
|
|
||||||
- name: socksdir
|
|
||||||
mountPath: /socks
|
|
||||||
|
|
||||||
- name: app
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
image: golang:latest
|
|
||||||
command:
|
|
||||||
- bash
|
|
||||||
- "-c"
|
|
||||||
- |
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
go get github.com/tendermint/tendermint/abci/cmd/abci-cli
|
|
||||||
|
|
||||||
rm -f /socks/app.sock # remove old socket
|
|
||||||
|
|
||||||
abci-cli counter --serial=true --address="unix:///socks/app.sock"
|
|
||||||
volumeMounts:
|
|
||||||
- name: socksdir
|
|
||||||
mountPath: /socks
|
|
||||||
|
|
||||||
- name: pub-key
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
image: nginx:latest
|
|
||||||
ports:
|
|
||||||
- containerPort: 80
|
|
||||||
name: pub-key
|
|
||||||
command:
|
|
||||||
- bash
|
|
||||||
- "-c"
|
|
||||||
- |
|
|
||||||
set -ex
|
|
||||||
# fixes 403 Permission Denied (open() "/tendermint/pub_key.json" failed (13: Permission denied))
|
|
||||||
# => we cannot serve from /tendermint, so we copy the file
|
|
||||||
mkdir -p /usr/share/nginx
|
|
||||||
cp /tendermint/pub_key.json /usr/share/nginx/pub_key.json
|
|
||||||
nginx -g "daemon off;"
|
|
||||||
volumeMounts:
|
|
||||||
- name: tmdir
|
|
||||||
mountPath: /tendermint
|
|
||||||
- mountPath: /etc/nginx/conf.d/pub_key.conf
|
|
||||||
name: tmconfigdir
|
|
||||||
subPath: pub_key_nginx.conf
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- name: tmconfigdir
|
|
||||||
configMap:
|
|
||||||
name: tm-config
|
|
||||||
- name: socksdir
|
|
||||||
emptyDir: {}
|
|
||||||
|
|
||||||
volumeClaimTemplates:
|
|
||||||
- metadata:
|
|
||||||
name: tmdir
|
|
||||||
annotations:
|
|
||||||
volume.alpha.kubernetes.io/storage-class: anything
|
|
||||||
spec:
|
|
||||||
accessModes: ["ReadWriteOnce"]
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
storage: 2Gi
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
create:
|
|
||||||
@echo "==> Creating deployment"
|
|
||||||
@kubectl create -f app.yaml
|
|
||||||
@echo "==> Waiting 10s until it is probably ready"
|
|
||||||
@sleep 10
|
|
||||||
@echo "==> Creating monitor and transacter pods"
|
|
||||||
@kubectl create -f tm-monitor-pod.yaml
|
|
||||||
@kubectl create -f transacter-pod.yaml
|
|
||||||
|
|
||||||
destroy:
|
|
||||||
@echo "==> Destroying deployment"
|
|
||||||
@kubectl delete -f transacter-pod.yaml
|
|
||||||
@kubectl delete -f tm-monitor-pod.yaml
|
|
||||||
@kubectl delete -f app.yaml
|
|
||||||
@kubectl delete pvc -l app=tm
|
|
||||||
|
|
||||||
.PHONY: create destroy
|
|
||||||
@@ -1,196 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
annotations:
|
|
||||||
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
|
|
||||||
name: dummy
|
|
||||||
labels:
|
|
||||||
app: dummy
|
|
||||||
spec:
|
|
||||||
ports:
|
|
||||||
- port: 26656
|
|
||||||
name: p2p
|
|
||||||
- port: 26657
|
|
||||||
name: rpc
|
|
||||||
clusterIP: None
|
|
||||||
selector:
|
|
||||||
app: tm
|
|
||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ConfigMap
|
|
||||||
metadata:
|
|
||||||
name: tm-config
|
|
||||||
data:
|
|
||||||
seeds: "tm-0,tm-1,tm-2,tm-3"
|
|
||||||
validators: "tm-0,tm-1,tm-2,tm-3"
|
|
||||||
validator.power: "10"
|
|
||||||
genesis.json: |-
|
|
||||||
{
|
|
||||||
"genesis_time": "2016-02-05T23:17:31.164Z",
|
|
||||||
"chain_id": "chain-B5XXm5",
|
|
||||||
"validators": [],
|
|
||||||
"app_hash": ""
|
|
||||||
}
|
|
||||||
pub_key_nginx.conf: |-
|
|
||||||
server {
|
|
||||||
listen 80 default_server;
|
|
||||||
listen [::]:80 default_server ipv6only=on;
|
|
||||||
location /pub_key.json { root /usr/share/nginx/; }
|
|
||||||
}
|
|
||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodDisruptionBudget
|
|
||||||
metadata:
|
|
||||||
name: tm-budget
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: tm
|
|
||||||
minAvailable: 2
|
|
||||||
---
|
|
||||||
apiVersion: apps/v1beta1
|
|
||||||
kind: StatefulSet
|
|
||||||
metadata:
|
|
||||||
name: tm
|
|
||||||
spec:
|
|
||||||
serviceName: dummy
|
|
||||||
replicas: 4
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: tm
|
|
||||||
annotations:
|
|
||||||
pod.beta.kubernetes.io/init-containers: '[{
|
|
||||||
"name": "tm-gen-validator",
|
|
||||||
"image": "tendermint/tendermint:0.10.0",
|
|
||||||
"imagePullPolicy": "IfNotPresent",
|
|
||||||
"command": ["bash", "-c", "
|
|
||||||
set -ex\n
|
|
||||||
if [ ! -f /tendermint/priv_validator.json ]; then\n
|
|
||||||
tendermint gen_validator > /tendermint/priv_validator.json\n
|
|
||||||
# pub_key.json will be served by pub-key container\n
|
|
||||||
cat /tendermint/priv_validator.json | jq \".pub_key\" > /tendermint/pub_key.json\n
|
|
||||||
fi\n
|
|
||||||
"],
|
|
||||||
"volumeMounts": [
|
|
||||||
{"name": "tmdir", "mountPath": "/tendermint"}
|
|
||||||
]
|
|
||||||
}]'
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: tm
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
image: tendermint/tendermint:0.10.0
|
|
||||||
ports:
|
|
||||||
- containerPort: 26656
|
|
||||||
name: p2p
|
|
||||||
- containerPort: 26657
|
|
||||||
name: rpc
|
|
||||||
env:
|
|
||||||
- name: SEEDS
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: tm-config
|
|
||||||
key: seeds
|
|
||||||
- name: VALIDATOR_POWER
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: tm-config
|
|
||||||
key: validator.power
|
|
||||||
- name: VALIDATORS
|
|
||||||
valueFrom:
|
|
||||||
configMapKeyRef:
|
|
||||||
name: tm-config
|
|
||||||
key: validators
|
|
||||||
- name: TMHOME
|
|
||||||
value: /tendermint
|
|
||||||
command:
|
|
||||||
- bash
|
|
||||||
- "-c"
|
|
||||||
- |
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
# copy template
|
|
||||||
cp /etc/tendermint/genesis.json /tendermint/genesis.json
|
|
||||||
|
|
||||||
# fill genesis file with validators
|
|
||||||
IFS=',' read -ra VALS_ARR <<< "$VALIDATORS"
|
|
||||||
fqdn_suffix=$(hostname -f | sed 's#[^.]*\.\(\)#\1#')
|
|
||||||
for v in "${VALS_ARR[@]}"; do
|
|
||||||
# wait until validator generates priv/pub key pair
|
|
||||||
set +e
|
|
||||||
|
|
||||||
curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null
|
|
||||||
ERR=$?
|
|
||||||
while [ "$ERR" != 0 ]; do
|
|
||||||
sleep 5
|
|
||||||
curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null
|
|
||||||
ERR=$?
|
|
||||||
done
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# add validator to genesis file along with its pub_key
|
|
||||||
curl -s "http://$v.$fqdn_suffix/pub_key.json" | jq ". as \$k | {pub_key: \$k, amount: $VALIDATOR_POWER, name: \"$v\"}" > pub_validator.json
|
|
||||||
cat /tendermint/genesis.json | jq ".validators |= .+ [$(cat pub_validator.json)]" > tmpgenesis && mv tmpgenesis /tendermint/genesis.json
|
|
||||||
rm pub_validator.json
|
|
||||||
done
|
|
||||||
|
|
||||||
# construct seeds
|
|
||||||
IFS=',' read -ra SEEDS_ARR <<< "$SEEDS"
|
|
||||||
seeds=()
|
|
||||||
for s in "${SEEDS_ARR[@]}"; do
|
|
||||||
seeds+=("$s.$fqdn_suffix:26656")
|
|
||||||
done
|
|
||||||
seeds=$(IFS=','; echo "${seeds[*]}")
|
|
||||||
|
|
||||||
tendermint node --p2p.seeds="$seeds" --moniker="`hostname`" --proxy_app="dummy"
|
|
||||||
volumeMounts:
|
|
||||||
- name: tmdir
|
|
||||||
mountPath: /tendermint
|
|
||||||
- mountPath: /etc/tendermint/genesis.json
|
|
||||||
name: tmconfigdir
|
|
||||||
subPath: genesis.json
|
|
||||||
- name: socksdir
|
|
||||||
mountPath: /socks
|
|
||||||
|
|
||||||
- name: pub-key
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
image: nginx:latest
|
|
||||||
ports:
|
|
||||||
- containerPort: 80
|
|
||||||
name: pub-key
|
|
||||||
command:
|
|
||||||
- bash
|
|
||||||
- "-c"
|
|
||||||
- |
|
|
||||||
set -ex
|
|
||||||
# fixes 403 Permission Denied (open() "/tendermint/pub_key.json" failed (13: Permission denied))
|
|
||||||
# => we cannot serve from /tendermint, so we copy the file
|
|
||||||
mkdir -p /usr/share/nginx
|
|
||||||
cp /tendermint/pub_key.json /usr/share/nginx/pub_key.json
|
|
||||||
nginx -g "daemon off;"
|
|
||||||
volumeMounts:
|
|
||||||
- name: tmdir
|
|
||||||
mountPath: /tendermint
|
|
||||||
- mountPath: /etc/nginx/conf.d/pub_key.conf
|
|
||||||
name: tmconfigdir
|
|
||||||
subPath: pub_key_nginx.conf
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- name: tmconfigdir
|
|
||||||
configMap:
|
|
||||||
name: tm-config
|
|
||||||
- name: socksdir
|
|
||||||
emptyDir: {}
|
|
||||||
|
|
||||||
volumeClaimTemplates:
|
|
||||||
- metadata:
|
|
||||||
name: tmdir
|
|
||||||
annotations:
|
|
||||||
volume.alpha.kubernetes.io/storage-class: anything
|
|
||||||
spec:
|
|
||||||
accessModes: ["ReadWriteOnce"]
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
storage: 2Gi
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Pod
|
|
||||||
metadata:
|
|
||||||
name: monitor
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: monitor
|
|
||||||
image: tendermint/monitor
|
|
||||||
args: ["-listen-addr=tcp://0.0.0.0:26670", "tm-0.dummy:26657,tm-1.dummy:26657,tm-2.dummy:26657,tm-3.dummy:26657"]
|
|
||||||
ports:
|
|
||||||
- containerPort: 26670
|
|
||||||
name: rpc
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Pod
|
|
||||||
metadata:
|
|
||||||
name: transacter
|
|
||||||
spec:
|
|
||||||
containers:
|
|
||||||
- name: transacter
|
|
||||||
image: tendermint/transacter
|
|
||||||
command:
|
|
||||||
- bash
|
|
||||||
- "-c"
|
|
||||||
- |
|
|
||||||
set -ex
|
|
||||||
while true
|
|
||||||
do
|
|
||||||
./transact 100 "tm-0.dummy:26657"
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
Reference in New Issue
Block a user