CI: Fix coverage check #585
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Tests | |
# Controls when the action will run. | |
on: [push, pull_request, workflow_dispatch] | |
permissions: | |
contents: read | |
jobs: | |
changelog: | |
runs-on: ubuntu-20.04 | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Check that PR is mentioned in Changelog | |
run: | | |
if ! ./.github/workflows/check_pr_label.sh "${{github.event.pull_request.number}}" "no changelog"; then | |
grep "#${{github.event.pull_request.number}}" docs/CHANGELOG.md | |
fi | |
if: ${{github.event.pull_request}} | |
shfmt: | |
runs-on: ubuntu-20.04 | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- run: | | |
curl https://github.com/mvdan/sh/releases/download/v3.5.1/shfmt_v3.5.1_linux_amd64 -o shfmt | |
chmod a+x shfmt | |
- run: ./shfmt --diff . | |
# Ensure we detect when a change disables Bats from reporting failure. | |
# This would not be detectable by Bats' selftests. | |
failsafe: | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Check failing tests fail suite, | |
run: "! bin/bats test/fixtures/bats/failing.bats" | |
shellcheck: | |
runs-on: ubuntu-20.04 | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Run shellcheck | |
run: | | |
sudo apt-get update -y | |
sudo apt-get install shellcheck | |
./shellcheck.sh | |
linux: | |
strategy: | |
matrix: | |
os: ['ubuntu-20.04', 'ubuntu-22.04'] | |
env_vars: | |
- '' | |
# allow for some parallelity without GNU parallel, since it is not installed by default | |
- 'BATS_NO_PARALLELIZE_ACROSS_FILES=1 BATS_NUMBER_OF_PARALLEL_JOBS=2' | |
- 'BATS_PARALLEL_BINARY_NAME=rush' | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Install rush | |
run: | | |
curl -sSfL https://github.com/shenwei356/rush/releases/download/v0.5.0/rush_linux_amd64.tar.gz | sudo tar xzf - -C /usr/local/bin | |
if: contains(matrix.env_vars, 'rush') | |
- name: Run test on OS ${{ matrix.os }} | |
shell: 'script -q -e -c "bash {0}"' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
run: | | |
bash --version | |
bash -c "time ${{ matrix.env_vars }} bin/bats --print-output-on-failure --formatter tap test" | |
unset_variables: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Check unset variables | |
shell: 'script -q -e -c "bash {0}"' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
BASH_ENV: ${GITHUB_WORKSPACE}/.github/workflows/set_nounset.bash | |
run: bin/bats test --print-output-on-failure | |
npm_on_linux: | |
strategy: | |
matrix: | |
os: ['ubuntu-20.04', 'ubuntu-22.04'] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 | |
- name: Run test on OS ${{ matrix.os }} | |
shell: 'script -q -e -c "bash {0}"' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
run: | | |
npm pack ./ | |
sudo npm install -g ./bats-*.tgz | |
bats test --print-output-on-failure | |
windows: | |
runs-on: windows-2019 | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Check failing tests fail suite, | |
run: bash -c "! bin/bats test/fixtures/bats/failing.bats" | |
- run: | | |
bash --version | |
bash -c "time bin/bats --print-output-on-failure --formatter tap test" | |
npm_on_windows: | |
strategy: | |
matrix: | |
os: ['windows-2019'] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 | |
- run: npm pack ./ | |
- run: npm install -g (get-item .\bats-*.tgz).FullName | |
- run: bats -T --print-output-on-failure test | |
macos: | |
strategy: | |
matrix: | |
os: ['macos-11', 'macos-12'] | |
env_vars: | |
- '' | |
# allow for some parallelity without GNU parallel, since it is not installed by default | |
- 'BATS_NO_PARALLELIZE_ACROSS_FILES=1 BATS_NUMBER_OF_PARALLEL_JOBS=2' | |
- 'BATS_PARALLEL_BINARY_NAME=rush' | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Install unbuffer via expect | |
run: brew install expect | |
- name: Install rush | |
run: | | |
curl -sSfL https://github.com/shenwei356/rush/releases/download/v0.5.0/rush_darwin_amd64.tar.gz | sudo tar xzf - -C /usr/local/bin | |
if: contains(matrix.env_vars, 'rush') | |
- name: Check failing tests fail suite, | |
shell: 'unbuffer bash {0}' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
run: bash -c '! bin/bats test/fixtures/bats/failing.bats' | |
- name: Run test on OS ${{ matrix.os }} | |
shell: 'unbuffer bash {0}' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
run: | | |
bash --version | |
bash -c "time ${{ matrix.env_vars }} bin/bats --print-output-on-failure --formatter tap test" | |
npm_on_macos: | |
strategy: | |
matrix: | |
os: ['macos-11', 'macos-12'] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 | |
- name: Install unbuffer via expect | |
run: brew install expect | |
- name: Run test on OS ${{ matrix.os }} | |
shell: 'unbuffer bash {0}' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
run: | | |
npm pack ./ | |
# somehow there is already an installed bats version around | |
npm install --force -g ./bats-*.tgz | |
bats --print-output-on-failure test | |
bash-version: | |
strategy: | |
matrix: | |
version: ['3.2', '4.0', '4.1', '4.2', '4.3', '4.4', '4', '5.0', '5.1', '5', 'rc'] | |
env_vars: | |
- '' | |
# also test running (recursively!) in parallel | |
- '-e BATS_NUMBER_OF_PARALLEL_JOBS=2' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Run test on bash version ${{ matrix.version }} | |
shell: 'script -q -e -c "bash {0}"' # work around tty issues | |
run: | | |
set -e | |
docker build --build-arg bashver="${{ matrix.version }}" --tag "bats/bats:bash-${{ matrix.version }}" . | |
docker run -it "bash:${{ matrix.version }}" --version | |
time docker run -it ${{ matrix.env_vars }} "bats/bats:bash-${{ matrix.version }}" --print-output-on-failure --tap /opt/bats/test | |
alpine: | |
runs-on: ubuntu-latest | |
container: alpine:latest | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Install dependencies | |
run: apk add bash ncurses util-linux | |
- name: Run test on bash version ${{ matrix.version }} | |
shell: 'script -q -e -c "bash {0}"' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
run: | |
time ./bin/bats --print-output-on-failure test/ | |
freebsd: | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
packages: | |
- flock | |
- "" | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- uses: vmactions/freebsd-vm@35a5b20a98476a681c7576a344775be7e7f77f06 # v1.0.6 | |
with: | |
prepare: pkg install -y bash parallel ${{ matrix.packages }} | |
run: | | |
time ./bin/bats --print-output-on-failure test/ | |
find_broken_symlinks: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
# list symlinks that are broken and force non-zero exit if there are any | |
- run: "! find . -xtype l | grep ." | |
rpm: | |
runs-on: ubuntu-latest | |
container: almalinux:8 | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- run: dnf install -y rpm-build rpmdevtools | |
- name: Build and install RPM and dependencies | |
run: | | |
rpmdev-setuptree | |
version=$(rpmspec -q --qf '%{version}' contrib/rpm/bats.spec) | |
tar --transform "s,^,bats-core-${version}/," -cf /github/home/rpmbuild/SOURCES/v${version}.tar.gz ./ | |
rpmbuild -v -bb ./contrib/rpm/bats.spec | |
ls -al /github/home/rpmbuild/RPMS/noarch/ | |
dnf install -y /github/home/rpmbuild/RPMS/noarch/bats-*.rpm | |
dnf -y install procps-ng # avoid timeout failure | |
- name: Run tests | |
shell: 'script -q -e -c "bash {0}"' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
run: bats --print-output-on-failure --filter-tags !dep:install_sh test/ | |
dockerfile: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- name: Set up Docker Buildx | |
id: buildx | |
uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0 | |
- uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0 | |
with: | |
platforms: linux/amd64 | |
tags: bats:test | |
load: true | |
- run: docker run -itv "$PWD":/code bats:test --tap --print-output-on-failure test/ | |
shell: 'script -q -e -c "bash {0}"' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
with: | |
repository: bats-core/bats-assert | |
path: bats-assert | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
with: | |
repository: bats-core/bats-support | |
path: bats-support | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
with: | |
repository: bats-core/bats-file | |
path: bats-file | |
- run: | | |
<<EOF cat >test.sh | |
apk add sudo python3 # install bats-file's dependencies | |
ln -sf python3 /usr/bin/python # bats-file uses python without version | |
bats --tap --print-output-on-failure bats-*/test/ | |
EOF | |
docker run -itv "$PWD":/code --entrypoint bash bats:test test.sh | |
shell: 'script -q -e -c "bash {0}"' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
coverage: | |
runs-on: ubuntu-20.04 | |
steps: | |
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- run: | | |
wget https://github.com/SimonKagstrom/kcov/releases/download/v40/kcov-amd64.tar.gz | |
tar -xf kcov-amd64.tar.gz | |
- run: | | |
./usr/local/bin/kcov --exclude-path=/tmp $PWD/coverage ./bin/bats --filter-tags '!no-kcov' test/ | |
shell: 'script -q -e -c "bash {0}"' # work around tty issues | |
env: | |
TERM: linux # fix tput for tty issue work around | |
- name: Archive code coverage results | |
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 | |
with: | |
name: code-coverage-report | |
path: coverage/* | |
- name: Print the Total Coverage | |
id: coverage-percent | |
shell: bash | |
env: | |
minimum_coverage: 86.40 | |
run: | | |
value=$(jq '.percent_covered' <coverage/bats/coverage.json) | |
fixed_point() { # <float val> | |
int=${1%.*} | |
decimals=${1#*.} | |
echo $int${decimals::2} | |
} | |
echo "Coverage: $value%" | tee "$GITHUB_STEP_SUMMARY" | |
if (( $(fixed_point $value) < $(fixed_point $expected) )); then | |
echo " is below required minimum coverage ($minimum_coverage%)." | tee -a "$GITHUB_STEP_SUMMARY" | |
exit 1 | |
fi |