diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..46251a88 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,83 @@ +name: CI + +on: + pull_request: + branches: [ master ] + +jobs: + + build: + name: Build + strategy: + matrix: + go-version: [1.15.x, 1.14.x] + platform: [ubuntu-latest, macos-latest] + env: + - TAGS="" + - TAGS="-tags bounds" + - TAGS="-tags noasm" + - TAGS="-tags safe" + - FORCE_GOARCH=386 + exclude: + - platform: macos-latest + env: TAGS="-tags bounds" + - platform: macos-latest + env: TAGS="-tags noasm" + - platform: macos-latest + env: TAGS="-tags safe" + - platform: macos-latest + env: FORCE_GOARCH=386 + + runs-on: ${{ matrix.platform }} + env: + GO111MODULE: on + GOPATH: ${{ github.workspace }} + defaults: + run: + working-directory: ${{ env.GOPATH }}/src/gonum.org/v1/gonum + + steps: + - name: Install Go + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + + - name: Cache-Go + uses: actions/cache@v1 + with: + path: | + ~/go/pkg/mod # Module download cache + ~/.cache/go-build # Build cache (Linux) + ~/Library/Caches/go-build # Build cache (Mac) + '%LocalAppData%\go-build' # Build cache (Windows) + + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + + - name: Checkout code + uses: actions/checkout@v2 + with: + path: ${{ env.GOPATH }}/src/gonum.org/v1/gonum + + - name: Check copyrights+imports+formatting+generate + if: matrix.platform == 'ubuntu-latest' && matrix.tags == '' + run: | + ./.travis/script.d/deps.sh + ./.travis/script.d/check-copyright.sh + ./.travis/script.d/check-imports.sh + ./.travis/script.d/check-formatting.sh + ./.travis/script.d/check-generate.sh + + - name: Test + run: | + ./.travis/script.d/test.sh + + - name: Coverage + if: matrix.platform == 'ubuntu-latest' + run: | + ./.github/workflows/test-coverage.sh + + - name: Upload-Coverage + if: matrix.platform == 'ubuntu-latest' + uses: codecov/codecov-action@v1 diff --git a/.github/workflows/test-coverage.sh b/.github/workflows/test-coverage.sh new file mode 100755 index 00000000..6cfd3284 --- /dev/null +++ b/.github/workflows/test-coverage.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +MODE=set +PROFILE_OUT="${PWD}/profile.out" +ACC_OUT="${PWD}/coverage.txt" + +testCover() { + # set the return value to 0 (successful) + retval=0 + # get the directory to check from the parameter. Default to '.' + d=${1:-.} + # skip if there are no Go files here + ls $d/*.go &> /dev/null || return $retval + # switch to the directory to check + pushd $d > /dev/null + # create the coverage profile + coverageresult=$(go test $TAGS -coverprofile="${PROFILE_OUT}" -covermode=${MODE}) + # output the result so we can check the shell output + echo ${coverageresult} + # append the results to acc.out if coverage didn't fail, else set the retval to 1 (failed) + ( [[ ${coverageresult} == *FAIL* ]] && retval=1 ) || ( [ -f "${PROFILE_OUT}" ] && grep -v "mode: ${MODE}" "${PROFILE_OUT}" >> "${ACC_OUT}" ) + # return to our working dir + popd > /dev/null + # return our return value + return $retval +} + +# Init coverage.txt +echo "mode: ${MODE}" > $ACC_OUT + +# Run test coverage on all directories containing go files except testlapack, testblas, testgraph and testrand. +find . -type d -not -path '*testlapack*' -and -not -path '*testblas*' -and -not -path '*testgraph*' -and -not -path '*testrand*' | while read d; do testCover $d || exit; done diff --git a/.travis/script.d/check-generate.sh b/.travis/script.d/check-generate.sh index 807eb3de..55de7e80 100755 --- a/.travis/script.d/check-generate.sh +++ b/.travis/script.d/check-generate.sh @@ -15,3 +15,6 @@ if [ -n "$(git diff)" ]; then git diff exit 1 fi + +rm -rf * +git reset --hard