diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..74e0a5b --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,233 @@ +# Copyright 2020 The Periph Authors. All rights reserved. +# Use of this source code is governed under the Apache License, Version 2.0 +# that can be found in the LICENSE file. + +# References: +# https://developer.github.com/webhooks/event-payloads/ +# https://github.com/actions/cache +# https://github.com/actions/checkout +# https://github.com/actions/setup-go +# https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token#using-the-github_token-in-a-workflow +# https://help.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions/ +# https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions + +on: [push, pull_request] +name: Run tests +jobs: + test_all: + continue-on-error: true + defaults: + run: + shell: bash + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + # Do not forget to bump every 6 months! + gover: ["1.15"] + runs-on: "${{matrix.os}}" + name: "go${{matrix.gover}}.x on ${{matrix.os}}" + steps: + - uses: actions/setup-go@v2 + with: + go-version: "^${{matrix.gover}}.0" + + # Checkout and print debugging information. + - name: Turn off git core.autocrlf + run: git config --global core.autocrlf false + - uses: actions/checkout@v2 + - name: 'go version' + run: go version + - name: 'go env' + run: go env + - name: "Debug" + run: | + echo HOME = $HOME + echo GITHUB_WORKSPACE = $GITHUB_WORKSPACE + echo PATH = $PATH + echo "" + echo $ ls -l $HOME/go/bin + ls -la $HOME/go/bin + + - name: 'Cache: ~/go' + uses: actions/cache@v2 + with: + path: ~/go + key: "${{runner.os}}-gopkg-${{hashFiles('go.sum', '.github/workflows/*.yml')}}" + + # Fetch the tools before checking out, so they don't modify go.mod/go.sum. + - name: 'go get necessary tools' + run: > + cd ..; + go get -u -v + github.com/gordonklaus/ineffassign + github.com/securego/gosec/cmd/gosec + golang.org/x/lint/golint + golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow + honnef.co/go/tools/cmd/staticcheck + - name: 'go get necessary tools (ubuntu)' + if: always() && matrix.os == 'ubuntu-latest' + run: > + cd ..; + go get -u -v + github.com/client9/misspell/cmd/misspell + github.com/google/addlicense + + # Now run proper checks. + - name: 'Check: go vet' + if: always() + run: go vet ./... + - name: 'Check: go vet shadow; shadowed variables' + # TODO: Remove true if we make this check ever pass. + run: | + SHADOW_TOOL="$(which shadow)" + if [ -f "${SHADOW_TOOL}.exe" ]; then + SHADOW_TOOL="${SHADOW_TOOL}.exe" + fi + go vet -vettool=$SHADOW_TOOL ./... || true + - name: 'Check: golint' + if: always() + # TODO: Remove true if we make this check ever pass. + run: golint -set_exit_status ./... || true + - name: 'Check: inefficient variable assignment' + if: always() + run: ineffassign . + - name: 'Check: staticcheck' + if: always() + # TODO: Remove true if we make this check ever pass. + run: staticcheck ./... || true + - name: 'Check: gosec (only G104)' + run: gosec -include=G104 -fmt=golint -quiet ./... + + # The following checks are not dependent on the OS or go build tags. Only + # run them on ubuntu-latest since it's the fastest one. + - name: 'Check: no executable was committed (ubuntu)' + if: always() && matrix.os == 'ubuntu-latest' + run: | + if find . -path '*.sh' -prune -o -path ./.git -prune -o -type f -executable -print | grep -e . ; then + echo 'Do not commit executables beside shell scripts' + false + fi + - name: 'Check: gofmt; code is well formatted (ubuntu)' + if: always() && matrix.os == 'ubuntu-latest' + run: | + FILES=$(gofmt -s -l .) + if ! test -z "$FILES"; then + echo 'Please run `gofmt -s -w` on the following files:' >> _gofmt.txt + echo "" >> _gofmt.txt + for FILE in ${FILES}; do + echo "- ${FILE}" >> _gofmt.txt + done + cat _gofmt.txt + echo "## ⚠ gofmt Failed" >> _comments.txt + echo "" >> _comments.txt + cat _gofmt.txt >> _comments.txt + echo "" >> _comments.txt + false + fi + - name: 'Check: addlicense; all sources have a license header (ubuntu)' + if: always() && matrix.os == 'ubuntu-latest' + run: addlicense -check . + - name: "Check: misspelling; code doesn't contain misspelling (ubuntu)" + if: always() && matrix.os == 'ubuntu-latest' + run: | + ERR=$(misspell .) + if ! test -z "$ERR"; then + echo "$ERR" + echo "## ⚠ misspell Failed" >> _comments.txt + echo "" >> _comments.txt + echo "$ERR" >> _comments.txt + echo "" >> _comments.txt + false + fi + + # Run tests last since it's potentially the slowest step. + - name: 'Check: go test -cover' + run: go test -timeout=40s -covermode=count -coverprofile coverage.txt ./... + # Don't send code coverage if anything failed to reduce spam. + - uses: codecov/codecov-action@v1 + - name: 'Cleanup' + run: rm coverage.txt + # Don't run go test -race if anything failed, to speed up the results. + - name: 'Check: go test -race' + run: go test -timeout=40s -race ./... + - name: 'Check: go test -bench .' + run: go test -timeout=40s -bench . -benchtime=100ms -cpu=1 ./... + + - name: "Check: tree is clean" + run: | + # Nothing should have changed in the tree up to that point and no + # unsuspected file was created. + TOUCHED=$(git status --porcelain --ignored) + if ! test -z "$TOUCHED"; then + echo "Oops, something touched these files, please cleanup:" + echo "$TOUCHED" + git diff + false + fi + + - name: "Check: go generate doesn't modify files" + run: | + go generate ./... + # TODO(maruel): Due to https://github.com/golang/go/issues/40276, ignore + # go.mod/go.sum modifications. Remove once a new Go toolchain fixes + # this. + git checkout HEAD -- go.mod go.sum + # Also test for untracked files. + TOUCHED=$(git status --porcelain --ignored) + if ! test -z "$TOUCHED"; then + echo "go generate created these files, please fix:" + echo "$TOUCHED" + false + fi + + - name: "Check: go mod tidy doesn't modify files" + run: | + go mod tidy + TOUCHED=$(git status --porcelain --ignored) + if ! test -z "$TOUCHED"; then + echo "go mod tidy was not clean, please update:" + git diff + false + fi + + - name: 'Send comments' + if: failure() && github.event_name == 'pull_request' + run: | + if [ -f _comments.txt ]; then + URL=$(cat ${GITHUB_EVENT_PATH} | jq -r .pull_request.comments_url) + echo "Sending $(cat _comments.txt|wc -l) lines of comments to ${URL}" + PAYLOAD=$(echo '{}' | jq --arg body "$(cat _comments.txt)" '.body = $body') + curl -sS --request POST \ + --header "Authorization: Bearer ${{secrets.GITHUB_TOKEN}}" \ + --header "Content-Type: application/json" \ + --data "${PAYLOAD}" "${URL}" > /dev/null + fi + + # Run on older Go versions while inside GOPATH, which tests different parts + # of the code. go modules will be used on 1.13 and later but not before. + test_short: + env: + GOPATH: ${{github.workspace}} + GO111MODULE: auto + continue-on-error: true + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + gover: ['1.13.15', '1.14.7'] + runs-on: "${{matrix.os}}" + name: "go${{matrix.gover}} on ${{matrix.os}} (quick)" + steps: + - uses: actions/setup-go@v2 + with: + go-version: "${{matrix.gover}}" + - uses: actions/checkout@v2 + with: + path: src/periph.io/x/devices + - name: 'Check: go get -d -t' + working-directory: src/periph.io/x/devices + run: go get -d -t ./... + - name: 'Check: go test' + working-directory: src/periph.io/x/devices + run: go test -timeout=40s ./... diff --git a/README.md b/README.md index 43b3116..070cbc8 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,9 @@ Documentation is at https://periph.io -[![GoDoc](https://godoc.org/periph.io/x/periph?status.svg)](https://godoc.org/periph.io/x/periph) -[![Go Report Card](https://goreportcard.com/badge/periph.io/x/periph)](https://goreportcard.com/report/periph.io/x/periph) -[![Coverage Status](https://codecov.io/gh/google/periph/graph/badge.svg)](https://codecov.io/gh/google/periph) -[![Build Status](https://travis-ci.org/google/periph.svg)](https://travis-ci.org/google/periph) - +[![PkgGoDev](https://pkg.go.dev/badge/periph.io/x/devices)](https://pkg.go.dev/periph.io/x/devices) +[![Coverage +Status](https://codecov.io/gh/periph/devices/graph/badge.svg)](https://codecov.io/gh/periph/devices) Join us for a chat on [gophers.slack.com/messages/periph](https://gophers.slack.com/messages/periph), @@ -47,8 +45,8 @@ examples! `periph` was initiated with ❤️️ and passion by [Marc-Antoine Ruel](https://github.com/maruel). The full list of contributors is in -[AUTHORS](https://github.com/google/periph/blob/master/AUTHORS) and -[CONTRIBUTORS](https://github.com/google/periph/blob/master/CONTRIBUTORS). +[AUTHORS](https://github.com/periph/devices/blob/main/AUTHORS) and +[CONTRIBUTORS](https://github.com/periph/devices/blob/main/CONTRIBUTORS). ## Disclaimer diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..e1bd436 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,20 @@ +# Copyright 2020 The Periph Authors. All rights reserved. +# Use of this source code is governed under the Apache License, Version 2.0 +# that can be found in the LICENSE file. + +# https://docs.codecov.io/docs/codecovyml-reference +# and +# https://docs.codecov.io/docs/coverage-configuration +coverage: + precision: 1 + range: "40...80" + round: nearest + status: + patch: + default: + target: 60% + threshold: 10% + project: + default: + target: 60% + threshold: 10%