We love Open Source and contribute to Plone and other Open Source projects on a daily basis.
This repository holds the composite actions and reusable workflows shared by our
Plone monorepo projects. They assume a repository laid out with a backend/ and a
frontend/ folder, each exposing a Makefile.
Everything here is referenced at @main, so changes land on every consumer as soon
as they are merged.
Warning
Everything in this repository except deploy.yml is deprecated.
Use plone/meta instead, referenced at @2.x.
The deprecated workflows and actions still run, but each one now emits a warning
annotation and a note in the job summary. They will be removed.
deploy.yml is not deprecated: plone/meta has no Docker Swarm deployment
counterpart, so it remains the supported way to deploy.
| This repository | Replacement in plone/meta@2.x |
|---|---|
.github/actions/setup_backend |
.github/actions/setup_backend_uv |
.github/actions/setup_frontend |
.github/actions/setup_frontend |
.github/workflows/backend-lint.yml |
.github/workflows/backend-lint.yml |
.github/workflows/backend-test.yml |
.github/workflows/backend-pytest.yml |
.github/workflows/backend-coverage.yml |
.github/workflows/backend-pytest-coverage.yml |
.github/workflows/frontend-lint.yml |
.github/workflows/frontend-code.yml |
.github/workflows/frontend-test.yml |
.github/workflows/frontend-unit.yml |
.github/workflows/frontend-i18n.yml |
.github/workflows/frontend-i18n.yml |
.github/workflows/docs.yml |
.github/workflows/docs-build.yml |
.github/workflows/image-build.yml |
.github/workflows/container-image-build-push.yml |
.github/workflows/deploy.yml |
none, keep using this one |
The replacements are equivalent in purpose but not always drop-in:
plone/metadefaultsworking-directoryto.rather thanbackendorfrontend, so a monorepo has to pass it explicitly.- The backend test and coverage workflows here run
make testandmake test-coverage; theplone/metaones invokepytestdirectly. container-image-build-push.ymltakes an additional requiredpushinput.backend-lint.ymlanddocs-build.ymlinplone/metaaccept extra inputs, such as pinned tool versions and optional Vale checks.
Warning
Deprecated. Use plone/meta/.github/actions/setup_backend_uv@2.x instead.
Installs uv, restores the uv cache and installs Plone plus the project package by
running make install in the working directory.
kitconcept/meta/.github/actions/setup_backend@main
| Name | Required | Default | Description |
|---|---|---|---|
python-version |
yes | 3.14 |
Python version passed to uv |
plone-version |
yes | 6.2.1 |
Plone version, exported as PLONE_VERSION and used in the cache key |
working-directory |
no | backend |
Directory the make install runs in |
None.
A Makefile in the working directory with an install target. It receives
PYTHON_VERSION and PLONE_VERSION in the environment.
Warning
Deprecated. Use plone/meta/.github/actions/setup_frontend@2.x instead.
Sets up Node.js, enables corepack, restores the pnpm store cache and installs the
project dependencies by running make install in the working directory.
kitconcept/meta/.github/actions/setup_frontend@main
| Name | Required | Default | Description |
|---|---|---|---|
node-version |
yes | 24.x |
Node.js version |
plone-version |
yes | 6.2.1 |
Declared but currently not used by any step |
working-directory |
no | frontend |
Directory the make install runs in |
None. The action exports STORE_PATH to the job environment, pointing at the pnpm
store directory.
A Makefile in the working directory with an install target, and a
packageManager entry so corepack can provision pnpm.
| Workflow | Purpose | Status |
|---|---|---|
backend-lint.yml |
Lint and check metadata of the Python codebase | Deprecated |
backend-test.yml |
Run the backend test suite | Deprecated |
backend-coverage.yml |
Run the backend suite with coverage reporting | Deprecated |
frontend-lint.yml |
Lint the frontend codebase | Deprecated |
frontend-test.yml |
Run the frontend test suite | Deprecated |
frontend-i18n.yml |
Check that translations are up to date | Deprecated |
docs.yml |
Build the documentation and check for broken links | Deprecated |
image-build.yml |
Build and publish a container image | Deprecated |
deploy.yml |
Deploy a stack to a Docker Swarm cluster | Supported |
None of these workflows declare outputs.
Warning
Deprecated. Use plone/meta/.github/workflows/backend-lint.yml@2.x instead.
Runs ruff format --diff, ruff check --diff, zpretty --check src, pyroma and
check-python-versions, then writes a summary. Each check runs even if an earlier one
failed, so a single run reports every problem.
| Name | Required | Default | Description |
|---|---|---|---|
python-version |
yes | — | Python version passed to uv |
plone-version |
yes | — | Declared but currently not used by any step |
working-directory |
no | backend |
Directory the checks run in |
jobs:
lint:
uses: kitconcept/meta/.github/workflows/backend-lint.yml@main
with:
python-version: "3.14"
plone-version: "6.2.1"Warning
Deprecated. Use plone/meta/.github/workflows/backend-pytest.yml@2.x instead.
Sets up the backend and runs make test.
| Name | Required | Default | Description |
|---|---|---|---|
python-version |
yes | — | Python version |
plone-version |
yes | — | Plone version |
working-directory |
no | backend |
Directory the tests run in |
A test target in the backend Makefile.
Warning
Deprecated. Use plone/meta/.github/workflows/backend-pytest-coverage.yml@2.x instead.
Sets up the backend, runs make test-coverage and appends a Markdown coverage report
to the job summary.
| Name | Required | Default | Description |
|---|---|---|---|
python-version |
yes | — | Python version |
plone-version |
yes | — | Plone version |
working-directory |
no | backend |
Directory the tests run in |
A test-coverage target in the backend Makefile, and coverage available through
uv run.
Warning
Deprecated. Use plone/meta/.github/workflows/frontend-code.yml@2.x instead.
Sets up the frontend and runs make lint.
| Name | Required | Default | Description |
|---|---|---|---|
node-version |
yes | — | Node.js version |
working-directory |
no | frontend |
Directory the lint runs in |
Warning
Deprecated. Use plone/meta/.github/workflows/frontend-unit.yml@2.x instead.
Sets up the frontend and runs make test.
| Name | Required | Default | Description |
|---|---|---|---|
node-version |
yes | — | Node.js version |
working-directory |
no | frontend |
Directory the tests run in |
Warning
Deprecated. Use plone/meta/.github/workflows/frontend-i18n.yml@2.x instead.
Sets up the frontend and runs make ci-i18n, which fails when the translation files
are out of sync with the source.
| Name | Required | Default | Description |
|---|---|---|---|
node-version |
yes | — | Node.js version |
working-directory |
no | frontend |
Directory the check runs in |
Warning
Deprecated. Use plone/meta/.github/workflows/docs-build.yml@2.x instead.
Installs the documentation dependencies with uv, runs make linkcheckbroken and
then make build.
| Name | Required | Default | Description |
|---|---|---|---|
python-version |
no | 3.14 |
Python version passed to uv |
working-directory |
no | docs |
Directory the documentation build runs in |
A Makefile in the working directory with install, linkcheckbroken and build
targets.
Warning
Deprecated. Use plone/meta/.github/workflows/container-image-build-push.yml@2.x instead.
Builds a container image with Buildx and pushes it to a registry, using a registry
backed build cache. The image is tagged with the value of base-tag and with the
tags derived by docker/metadata-action. QEMU is set up before the build, so
platforms may name architectures other than the runner's.
| Name | Required | Default | Description |
|---|---|---|---|
base-tag |
yes | — | Tag applied to the image, also used as the cache destination suffix |
working-directory |
yes | — | Build context |
image-name-prefix |
yes | — | First part of the image name |
image-name-suffix |
yes | — | Second part of the image name, joined with a dash |
image-cache-suffix |
no | buildcache |
Prefix for the registry cache tag |
platforms |
no | linux/amd64 |
Target platforms for the build, comma separated, for example linux/amd64,linux/arm64 |
dockerfile |
no | Dockerfile |
Dockerfile path, relative to working-directory |
registry |
no | ghcr.io |
Registry to log into |
build-args |
no | "" |
Build arguments forwarded to the build |
cache-key |
no | ${{ github.ref_name }} |
Suffix for the cache source tag |
| Name | Required | Description |
|---|---|---|
username |
yes | Registry user |
password |
yes | Registry password or token |
jobs:
build:
uses: kitconcept/meta/.github/workflows/image-build.yml@main
with:
base-tag: latest
working-directory: backend
image-name-prefix: ghcr.io/kitconcept/my-project
image-name-suffix: backend
secrets:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}Deploys a stack to a Docker Swarm cluster over SSH using
kitconcept/docker-stack-deploy,
with a deploy timeout of 480 seconds. The job runs in the GitHub environment named by
the environment input, so it picks up that environment's protection rules and
secrets.
| Name | Required | Default | Description |
|---|---|---|---|
registry |
yes | — | Registry holding the images |
username |
yes | — | Registry user |
tag |
yes | — | Image tag to deploy, passed to the stack as a parameter |
environment |
yes | — | GitHub environment the job runs in |
stack-name |
yes | — | Name of the Swarm stack |
stack-file |
yes | — | Path to the stack compose file |
| Name | Required | Description |
|---|---|---|
password |
yes | Registry password or token |
remote-host |
yes | Cluster host to deploy to |
remote-port |
yes | SSH port |
remote-user |
yes | SSH user |
remote-private-key |
yes | SSH private key |
env-file |
no | Contents of an environment file for the stack |
jobs:
deploy:
uses: kitconcept/meta/.github/workflows/deploy.yml@main
with:
registry: ghcr.io
username: ${{ github.actor }}
tag: ${{ github.ref_name }}
environment: production
stack-name: my-project
stack-file: devops/stacks/production.yml
secrets:
password: ${{ secrets.GITHUB_TOKEN }}
remote-host: ${{ secrets.DEPLOY_HOST }}
remote-port: ${{ secrets.DEPLOY_PORT }}
remote-user: ${{ secrets.DEPLOY_USER }}
remote-private-key: ${{ secrets.DEPLOY_SSH_KEY }}