Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 31 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
# mineunit-actions
GitHub actions for mt-mods/mineunit

Executes Lua unit tests with `busted` in `spec` directory with code coverage analysis using `cluacov` and generates badge for coverage.
Executes Minetest Lua mod unit tests with [`mineunit`](https://github.com/mt-mods/mineunit) in `spec` directory with code coverage analysis generating badges for coverage.

Example badges:
* ![](https://byob.yarr.is/S-S-X/metatool/metatool-coverage)
* ![](https://byob.yarr.is/S-S-X/metatool/sharetool-coverage)
* ![mineunit](https://mineunit-badges.000webhostapp.com/S-S-X/fence_connect/coverage)
* ![mineunit](https://mineunit-badges.000webhostapp.com/S-S-X/metatool/metatool-coverage)

Examples in projects:
* https://github.com/S-S-X/metatool
* https://github.com/S-S-X/qos
* https://github.com/mt-mods/technic
* https://github.com/mt-mods/machine_parts

## Example setup

Example workflow file `.github/workflows/mineunit.yml`:
```yaml
name: mineunit
Expand All @@ -24,32 +25,38 @@ jobs:
steps:
- uses: actions/checkout@v2
- id: mineunit
uses: mt-mods/mineunit-actions@master
with:
badge-color: "CC9909"
- uses: RubbaBoy/BYOB@v1.2.0
uses: mt-mods/mineunit-actions@v0.3
with:
NAME: "${{ steps.mineunit.outputs.badge-name }}"
LABEL: "${{ steps.mineunit.outputs.badge-label }}"
STATUS: "${{ steps.mineunit.outputs.badge-status }}"
COLOR: "${{ steps.mineunit.outputs.badge-color }}"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
badge-secret: ${{ secrets.MineunitBadgesAPIKey }}
```

Optional parameters for `mt-mods/mineunit-actions`:
You need to create secret `MineunitBadgesAPIKey` with valid API key to generate and update badges.
Optionally you can disable badges by removing `badge-secret` or leaving it empty.

## Mineunit-actions parameters and outputs

#### Optional parameters for `mt-mods/mineunit-actions`:

* **`working-directory`** Working directory for unit tests
* **`badge-name`** Code coverage badge name
* **`badge-label`** Code coverage badge label
* **`badge-color`** Code coverage badge color
* **`mineunit-version`** Mineunit version
* **`working-directory`** Working directory for unit tests.
*default:* `.`
* **`badge-name`** Code coverage badge name (unique id).
*default:* `coverage`
* **`badge-label`** Code coverage badge label.
*default:* `Test coverage`
* **`badge-color`** Code coverage badge color.
*default:* `99CC09`
* **`badge-service`** Custom badge service base URL, see https://github.com/S-S-X/mineunit-badges.
* **`badge-secret`** Badge service API key, no badges generated if empty.
* **`production-branch`** Production branch is what is used for badge generation.
*default:* `master`
* **`badge-purge-with`** Purge GitHub Camo links in https://github.com/ path, %s substituted for production-branch.
*default:* `"[account|organization]/[repository]/blob/%s/README.md"`
* **`mineunit-version`** Mineunit version.

Outputs:
#### Outputs that can be used on workflow after Mineunit action completed:

* **`steps.mineunit.outputs.badge-name`** Code coverage badge name waiting for issues/#1
* **`steps.mineunit.outputs.badge-label`** Code coverage badge label waiting for issues/#1
* **`steps.mineunit.outputs.badge-status`** Code coverage badge status waiting for issues/#1
* **`steps.mineunit.outputs.badge-color`** Code coverage badge color waiting for issues/#1
* **`steps.mineunit.outputs.badge-status`** Generated badge status, right hand side text of badge.
* **`steps.mineunit.outputs.badge-url`** Generated badge URL.
* **`steps.mineunit.outputs.mineunit-stdout`** Stdout produced during busted run
* **`steps.mineunit.outputs.mineunit-spec-missing`** Set to true if no spec files found for busted
* **`steps.mineunit.outputs.mineunit-report`** Mineunit detailed test report
Expand Down
58 changes: 43 additions & 15 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,37 @@ inputs:
description: "Code coverage badge color"
required: true
default: "99CC09"

badge-service:
description: "Badge service base URL"
required: true
default: "https://mineunit-badges.000webhostapp.com/${{ github.repository }}"
badge-secret:
description: "Badge service API key"
required: false

production-branch:
description: "Production branch is what is used for badge generation"
required: true
default: master

badge-purge-with:
description: "Purge GitHub Camo links in https://github.com/ path, %s substituted for production-branch"
required: true
default: "${{ github.repository }}/blob/%s/README.md"

mineunit-version:
description: "Mineunit version"
required: false

outputs:
# Generated or supplied badge properties
badge-name:
description: "Code coverage badge name waiting for issues/#1"
value: ${{ steps.badge-wrapper-actions-issue-1.outputs.badge-name }}
badge-label:
description: "Code coverage badge label waiting for issues/#1"
value: ${{ steps.badge-wrapper-actions-issue-1.outputs.badge-label }}
badge-url:
description: "Code coverage badge URL"
value: "${{ inputs.badge-service }}/${{ inputs.badge-name }}"
badge-status:
description: "Code coverage badge status waiting for issues/#1"
description: "Code coverage badge status"
value: "${{ steps.mineunit-coverage.outputs.total }} in ${{ steps.mineunit-coverage.outputs.files }} files"
badge-color:
description: "Code coverage badge color waiting for issues/#1"
value: ${{ steps.badge-wrapper-actions-issue-1.outputs.badge-color }}

# Mineunit test framework output
mineunit-stdout:
Expand Down Expand Up @@ -122,10 +135,25 @@ runs:
echo "::set-output name=total::$(tail -n 2 luacov.report.out | grep ^Total | grep -o '[0-9.]\+%$')"
awk -v p=0 '/^----/{p++;next}p==2{exit}p' luacov.report.out | sort -hrk4 > luacov.report.sum
echo "::set-output name=files::$(grep -cv '\s0\.00%' luacov.report.sum)/$(wc -l<luacov.report.sum)"
- id: badge-wrapper-actions-issue-1
name: Input wrapper while waiting for actions in actions feature
- name: generate badge
shell: bash
run: |
echo "::set-output name=badge-name::${{ inputs.badge-name }}"
echo "::set-output name=badge-label::${{ inputs.badge-label }}"
echo "::set-output name=badge-color::${{ inputs.badge-color }}"
BADGEURL='${{ inputs.badge-service }}/${{ inputs.badge-name }}'
CAMO_CHECK_URL="$(printf 'https://github.com/${{ inputs.badge-purge-with }}' '${{ inputs.production-branch }}')"
CURL=(curl -fsSm 30 -D /dev/stderr --max-redirs 8 --retry-delay 9 --retry 3 --retry-connrefused)
CAMO=(grep -o '<img[^>]\+src="https://camo.githubusercontent.com/[^>]*data-canonical-src="'"$BADGEURL"'"[^>]\+>')
LINKS=(sed -rn 's/^.*\ssrc="([^"<>]+)".*$/\1/p')
echo
echo "only-if: [[ '${{ github.event_name }}' == 'push' && '${{ github.ref }}' == 'refs/heads/${{ inputs.production-branch }}' && '${{ inputs.badge-secret }}' =~ ^[^\ ]+$ ]]"
[[ '${{ github.event_name }}' == 'push' && '${{ github.ref }}' == 'refs/heads/${{ inputs.production-branch }}' && '${{ inputs.badge-secret }}' =~ ^[^\ ]+$ ]] || exit 0
echo
data='{"label":"${{ inputs.badge-label }}","color":"${{ inputs.badge-color }}","value":"${{ steps.mineunit-coverage.outputs.total }} in ${{ steps.mineunit-coverage.outputs.files }} files"}'
"${CURL[@]}" -H "Content-Type: application/json" -d "$data" "${BADGEURL}/${{ inputs.badge-secret }}"
echo "Badge URL: ${BADGEURL}"
[[ '${{ inputs.badge-purge-with }}' == '' ]] && exit 0
echo "Purging Camo caches based on $CAMO_CHECK_URL links"
echo
"${CURL[@]}" "$CAMO_CHECK_URL" | "${CAMO[@]}" | "${LINKS[@]}" | sort -u > camo.purge.uri
echo "Purging cache for $(wc -l < camo.purge.uri) Camo entries"
echo
xargs -ra camo.purge.uri "${CURL[@]}" -X PURGE