Reusable GitHub Actions
Validates whether a given version string follows semantic versioning (semver) format.
Location: .github/actions/semver-validation
Usage:
- name: Validate version
id: semver
uses: loft-sh/github-actions/.github/actions/semver-validation@semver-validation/v1
with:
version: '1.2.3'
- name: Check if valid
run: echo "Valid: ${{ steps.semver.outputs.is_valid }}"Inputs:
version(required): Version string to validate
Outputs:
is_valid: Whether the version is valid semver (true/false)parsed_version: JSON object with parsed version componentserror_message: Error message if validation fails
See semver-validation README for detailed documentation.
Validates Renovate configuration files when they change in a pull request.
Location: .github/workflows/validate-renovate.yaml
Usage:
name: Validate Renovate Config
on:
pull_request:
jobs:
validate-renovate:
uses: loft-sh/github-actions/.github/workflows/validate-renovate.yaml@mainDetected config files: renovate.json, renovate.json5, .renovaterc, .renovaterc.json, .github/renovate.json, .github/renovate.json5.
Lints GitHub Actions workflow files using actionlint with reviewdog integration.
Location: .github/workflows/actionlint.yaml
Usage:
name: Actionlint
on:
pull_request:
jobs:
actionlint:
uses: loft-sh/github-actions/.github/workflows/actionlint.yaml@mainInputs:
reporter(optional, default:github-pr-review): reviewdog reporter type
Run all action tests locally:
make testRun tests for a specific action:
make test-semver-validation
make test-linear-pr-commenterRun linters (actionlint + zizmor):
make lintSee all available targets:
make helpEach testable action has a dedicated workflow that runs its tests on PRs when the action's files change:
test-semver-validation.yaml- triggers on.github/actions/semver-validation/**test-linear-pr-commenter.yaml- triggers on.github/actions/linear-pr-commenter/**
-
Node.js actions - add a
test/directory with Jest tests. Seesemver-validation/test/index.test.jsfor the pattern: spawn the action'sindex.jswithINPUT_*env vars and a tempGITHUB_OUTPUTfile, then assert on the parsed outputs. -
Go actions - add
*_test.gofiles next to the source. Seelinear-pr-commenter/src/main_test.go. Use standardgo test. -
Composite actions (YAML-only like
release-notification) - these delegate to third-party actions and have no local business logic to unit test. Validate their YAML structure through actionlint instead. -
Add a Makefile target for the new action following the existing pattern.
-
Add a CI workflow at
.github/workflows/test-<action-name>.yamlwith apathsfilter scoped to the action's directory.
The existing release-notification action uses a repository-wide tag:
git tag -f v1
git push origin v1 --forceReferenced as:
uses: loft-sh/github-actions/release-notification@v1For all new actions, we use action-specific tags for independent versioning:
# For the ci-notify-nightly-tests action
git tag -f ci-notify-nightly-tests/v1
git push origin ci-notify-nightly-tests/v1 --force
# For the semver-validation action
git tag -f semver-validation/v1
git push origin semver-validation/v1 --force
# For other actions, follow the same pattern
git tag -f action-name/v1
git push origin action-name/v1 --force# Reference actions using their specific tag
uses: loft-sh/github-actions/.github/actions/ci-notify-nightly-tests@ci-notify-nightly-tests/v1
uses: loft-sh/github-actions/.github/actions/semver-validation@semver-validation/v1