The tasks here are designed to be consumed via remote task includes in a single root level tasks.yaml in the downstream repo. Includes should follow the standard remote include pattern documented by UDS CLI:
includes:
- deploy: https://raw.githubusercontent.com/defenseunicorns/uds-common/$TAG/tasks/deploy.yamlPinning to a specific tag of a task (rather than main) with renovate watching for updates is strongly recommended since tasks do rely on dependencies like command syntax for zarf and uds as well as the published versions of uds-core.
- UDS CLI: 0.41.0
- UDS Core: 1.16.0
- K3D: 5.9.0
Note
Zarf is not required for tasks in this repo when using uds CLI, the vendored zarf (uds zarf) included with UDS CLI is used instead to prevent version mismatches. If using maru directly you will need to look at the tasks you are including and determine whether you need to install zarf and/or uds.
Set NEXT_MODE=true once on the outer uds run invocation to use UDS CLI Next bundle commands for bundle create/deploy/remove/publish/pull tasks:
uds run test-install --set NEXT_MODE=trueFor the reusable GitHub workflows, pass it through the existing options input:
with:
options: --set NEXT_MODE=trueThere are multiple task files available in this repository with different objectives and required variables.
| Name | Description |
|---|---|
| k3d-test-cluster | Creates a k3d cluster for testing based on the K3d + UDS Core Slim Dev bundle |
| k3d-full-cluster | Creates a k3d cluster for testing based on the K3d + UDS Core Full bundle |
| print-keycloak-admin-password | Print the default keycloak 'admin' password to standard out (if INSECURE_ADMIN_PASSWORD_GENERATION was used on uds-core) |
| keycloak-admin-user | Sets up the Keycloak admin user for dev/testing if not already created |
| print-keycloak-admin-password | Prints out Keycloak Admin credentials |
| keycloak-user | Creates a Keycloak user in the UDS Realm |
| create-doug-user | DEPRECATED! Please consider using keycloak-user instead |
| Name | Description |
|---|---|
| package | Create the UDS Zarf Package in the repository |
| test-bundle | Create the test bundle (bundling package + dependencies for testing) |
| sbom-shim | Builds a scan-only image that adds a primary product CPE to the Zarf package SBOM |
To include a primary-product CPE, pass a complete CPE 2.3 application binding
with a wildcard version to create:package, for example:
uds run create:package --with 'cpe=cpe:2.3:a:f5:nginx:*:*:*:*:*:*:*:*'The package definition must declare one imageArchives image named
zarf.internal/sbom/<metadata.name>:dev for the active flavor (or shared across
flavors). The shim reads that flavor's version from releaser.yaml beside the
package definition, removes only the trailing -uds.NUMBER, and rewrites the
archive tag to match the product version used in the CPE and PURL. No separate
Renovate rule is needed for the shim tag. Missing or duplicate flavor versions
are rejected. The nginx release task supplies its CPE automatically; development
packages still skip SBOM scanning.
Run bash tests/sbom.sh to create packages and verify the product identity in
their extracted SBOMs. Like tests/renovate.sh, this uses temporary workspaces
and runs in the Common-Specific Checks PR workflow, as an independent SBOM job.
| Name | Description |
|---|---|
| package | Deploy the created UDS Zarf Package |
| test-bundle | Deploy the created test bundle (deploying package + dependencies for testing) |
| Name | Description |
|---|---|
| test-bundle | Remove the deployed test bundle |
| Name | Description |
|---|---|
| validate | Deprecated: Lula Validate OSCAL Compliance |
| evaluate | Deprecated: Lula Evaluate multiple OSCAL Assessment Results |
| Name | Description |
|---|---|
| package | Publish the UDS package for the supplied architecture |
| release-please-publish | Publish the UDS package using release-please based workflows |
| uds-pk-publish | Publish the UDS package using uds-pk based workflows |
| test-bundle | Publish the test bundle for the supplied architecture |
| repo | Publish point in time repo snapshot to OCI |
| git-to-oci | Package git repo as OCI artifact with release notes |
| Name | Description |
|---|---|
| latest-package-release | Pull the last release of the UDS Package (useful for upgrade testing) |
| latest-bundle-release | Pull the last release of the UDS Bundle (useful for upgrade testing) |
| Name | Description |
|---|---|
| create-latest-tag-bundle | Creates the test bundle at the latest tag in preparation for upgrade testing |
| Name | Description |
|---|---|
| determine-repo | Determines the OCI repository that this flavor should go into (i.e. 'unicorn' should be private) |
This task file defines a set of linting commands to ensure code quality and compliance. It includes tasks to install linting tool dependencies, perform checks on YAML files and OSCAL configurations, validate shell scripts with shellcheck, and verify or add the SPDX license identifier in source files. Both the license and fix-license tasks parse a .license_config.yaml file in the project root directory, but will default to the Defense Unicorns dual-license if the file is not present.
license: AGPL-3.0-or-later OR LicenseRef-Defense-Unicorns-Commercial
copyright: Defense Unicorns
ignore: [] # an array of paths to ignore| Name | Description |
|---|---|
| deps | Install linting tool dependencies |
| all | Run all linting commands |
| zizmor | Audit GitHub workflows and composite actions with zizmor |
| renovate | Validate Renovate configuration |
| yaml | Run YAML linting checks |
| shell | Run shellcheck on all Maru tasks, GitHub workflows, Zarf packages, and local shell scripts |
| zarf-tools | Reject external tool calls with Zarf equivalents in package actions |
| license | Lint for the SPDX license identifier being in source files |
| fix-license | Add the SPDX license identifier to source files |
| tasks | Dry run all tasks in the base tasks file |
| helm | Run helm lint on all Helm charts in the repository |
| helm-template | Dry run render all Helm charts to catch template execution errors |
| values-generate | Regenerate the Zarf values schema after successful generation |
| values-check | Check Zarf values schema freshness without changing the schema |
The zarf-tools task checks inline cmd entries in Zarf component actions for likely tool calls. It is a basic check, so it may miss some calls or flag text that does not run as a command. It does not inspect UDS task files.
The renovate task is opt-in and defaults to renovate.json.
It requires Node.js 24.11+ (24.x) and npm; Renovate is downloaded automatically.
uds run lint:renovate
uds run lint:renovate --with file=config/renovate.json5The zizmor task audits GitHub workflows and composite actions. It is opt-in:
lint:all, lint:deps, and the standard callable lint workflow do not invoke or
install zizmor.
Install zizmor locally, then run:
uds run lint:zizmorOptional inputs control which inputs are collected and how/which findings are reported:
| Input | Default | Values |
|---|---|---|
collect |
workflows,actions |
Comma-separated kinds (all, default, workflows, actions, dependabot, and/or pre-commit) |
persona |
Unset (zizmor uses regular) |
regular, pedantic, auditor |
min-severity |
Unset | informational, low, medium, high |
min-confidence |
Unset | low, medium, high |
uds run lint:zizmor \
--with collect=default \
--with persona=pedantic \
--with min-severity=medium \
--with min-confidence=highOmitted persona, severity, and confidence inputs leave zizmor defaults unchanged.
The task always audits the current directory (.), runs offline, and fails on blocking findings or collected files with workflow schema errors.
A downstream task can invoke it with task: lint:zizmor through an existing include of tasks/lint.yaml.
Like renovate, the values-generate and values-check tasks are opt-in and are
not included in lint:all. Package repositories can use them through their
existing remote include of tasks/lint.yaml; no local lint wrapper is needed.
Update that include to a release containing these tasks before enabling the check.
uds run lint:values-generate
uds run lint:values-checkBoth tasks accept path (default .) and flavor (default upstream):
uds run lint:values-generate --with path=packages/irsa --with flavor=registry1
uds run lint:values-check --with path=packages/irsa --with flavor=registry1
# For a package without flavors:
uds run lint:values-check --with flavor=""The schema path is read from values.schema in the selected package's zarf.yaml,
relative to the package directory. The schema file must already exist with a
valid JSON Schema declaration, as required by Zarf's schema generator. Missing
configuration, missing schema files, and generation failures fail the task rather
than silently skipping it.
values-check regenerates with --delete-not-found into a temporary file and
compares the result with the existing schema. It runs locally as well as in CI,
prints the full diff on drift, and leaves the schema unchanged. It does not
require a Git checkout or a clean working tree. values-generate replaces the
schema only after successful generation. Both tasks clean up temporary files.
To enable the check in the existing reusable GitHub lint workflow:
jobs:
lint:
uses: defenseunicorns/uds-common/.github/workflows/callable-lint.yaml@<release>
with:
values-check: true
values-path: .
values-flavor: upstream
secrets: inheritThe workflow defaults to values-check: false, preserving existing consumers'
lint behavior. The optional check runs after the existing lint step. Pin both the
workflow and task include to the same release containing these capabilities.
Use the same UDS CLI version locally and in CI: the tasks use its embedded Zarf
through ./zarf, and generator versions can differ in type inference and output
formatting. The reusable lint workflow currently installs UDS CLI v0.39.0. Use
values-generate to produce the checked-in schema in the same stdout format used
by values-check, then review and commit the result. A flavor-specific schema
should be generated and checked using the same flavor.
The shell task accepts a space-separated exclusion input for directories that should be skipped by shellcheck:
- task: lint:shell
with:
exclusion: ".husky vendor"| Name | Description |
|---|---|
| verify-badge | Task Removed: Verify Badge |
| Name | Description |
|---|---|
| authenticate-registries | Log in to the registries for testing and publishing UDS Packages |
| debug-output | Print debug output from a k8s cluster |
| clean-gh-runner | Cleanup unneeded files to free space on a GitHub runner |
| install-deps | Install the runner dependencies for testing UDS Packages |
| install-oras | Install ORAS CLI for OCI artifact operations |
| save-logs | Save Pod and Node logs from a cluster and fix permissions |
| setup-environment | Setup the runner environment for testing UDS Packages |
| test-deploy | Test a deployment of a UDS package/bundle |
| verify-badge | Perform verification to assist with UDS badge certification |
| determine-arch | Determine the architecture of the current machine |
| registry-login | Log in to an OCI registry |