## Was Das Plugin `bump` setzt nur noch den Tag auf den auslösenden Commit. Es gibt keinen Versions-Commit mehr, `package.json` bleibt unberührt. Der Build nimmt die Version aus dem Tag (`CI_COMMIT_TAG`, im Beispiel als Build-Arg `VERSION`). Grund: Mit Versions-Commit war der Head eines PRs immer der Bump-Commit mit `[skip ci]`. Dafür startet Woodpecker keine Pipeline, der verlangte Status-Check fehlt, der PR ist nicht mergebar (oumta-app). Ohne Commit bleibt der Head der des Entwicklers. Nebeneffekt: keine `update version`-Commits mehr in der Historie. - `release_branch`: nächste stabile Version ist der höchste vorhandene Patch der Linie plus eins (vorher Patch-Bump aus `package.json`). - Ein Commit, der schon ein `v*`-Tag trägt, wird nicht erneut getaggt. Ein Neustart der Pipeline baut also nicht doppelt. - Image auf `alpine:3.20` wie `deploy`, Node wird nicht mehr gebraucht. - `author_name` und `author_email` entfallen. Breaking: Apps, die die Version aus `package.json` anzeigen, müssen sie aus dem Build-Arg lesen (Anforderung in oumta-deploy folgt). Release als `bump-v2.0.0`. ## Getestet Lokal gegen ein Bare-Repo: feature von develop und von release, erste und weitere Betas, erneuter Lauf auf demselben Commit, hotfix mit und ohne Patch, production, `release_branch` mit vorhandenen stabilen Tags, Linie nach stabilem Tag, weitergelaufener Branch, fehlendes Token. Keine Commits auf den Branches. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: #4
Actions
This repo provides reusable Gitea Actions as composite actions that can be referenced with uses:.
Bump Version
Creates or updates the version in package.json, commits it, creates a matching Git tag, and pushes both.
Inputs:
node_version: Node.js version to use. Default:24release_line: optional release line for dev builds. Format:<major>.<minor>or<major>.<minor>.<patch>. Overrides branch, PR target, inferred ancestor release branch, andpackage.json.gitea_token: optional token used for checkout and push
Branch and tag rules:
main: creates release tags from the latest commit message (release/x.y.z,release/x.y,hotfix/x.y.z) or falls back to a patch bump.release/<major>.<minor>orrelease/<major>.<minor>.<patch>: creates the next beta tag for that release base, e.g.v2.4.0-beta.3orv2.4.1-beta.3.- all other branches: create a dev tag for the resolved release base using a UTC timestamp, e.g.
v2.4.0-dev.20260314153045.
Dev release line resolution order:
inputs.release_line- current branch if it matches
release/<major>.<minor>orrelease/<major>.<minor>.<patch> - PR target branch if it matches
release/<major>.<minor>orrelease/<major>.<minor>.<patch> - newest ancestor branch from
origin/release/*(for feature branches created from release branches outside PR context) major.minorfrompackage.json
If no release line can be resolved for a dev build, the action fails intentionally.
Examples:
Commit message examples on main:
release/2.4.0->v2.4.0release/2.4->v2.4.0hotfix/2.4.1->v2.4.1
Branch examples:
release/2.4-> nextv2.4.0-beta.Nrelease/v2.4.1-> nextv2.4.1-beta.N- feature branch in a PR to
release/2.4->v2.4.0-dev.<UTC_TIMESTAMP> - feature branch created from
release/v2.4.1(without PR base) ->v2.4.1-dev.<UTC_TIMESTAMP>when the release branch tip is an ancestor - feature branch outside a PR with
package.jsonversion2.4.0->v2.4.0-dev.<UTC_TIMESTAMP> - feature branch outside a PR with
release_line: 2.4->v2.4.0-dev.<UTC_TIMESTAMP>
Example:
jobs:
bump-version:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: tanztee/ci-cd/.github/actions/bump-version@main
with:
gitea_token: ${{ secrets.GITEA_TOKEN }}
Feature branch outside a PR:
jobs:
bump-version:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: tanztee/ci-cd/.github/actions/bump-version@main
with:
gitea_token: ${{ secrets.GITEA_TOKEN }}
release_line: 2.4
Build and Push Docker Image
Example:
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: tanztee/ci-cd/.github/actions/build-and-push@main
with:
registry: ${{ secrets.REGISTRY }}
registry_username: ${{ secrets.REGISTRY_USERNAME }}
registry_password: ${{ secrets.REGISTRY_PASSWORD }}
Deploy Image to Kubernetes
Example:
on:
workflow_dispatch:
inputs:
tag:
description: Image tag to deploy (e.g. v1.2.3)
required: true
type: string
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: tanztee/ci-cd/.github/actions/deploy-k8s@main
with:
tag: ${{ inputs.tag }}
namespace: oumta-dev
kubeconfig: ${{ secrets.KUBECONFIG }}
registry: ${{ secrets.REGISTRY }}
Woodpecker plugins
Plugins are Docker images built from woodpecker/<name>/ by .woodpecker/plugins.yaml. A tag <name>-vX.Y.Z publishes git.uesome.de/actions/ci-cd/<name>:vX.Y.Z; pipelines pin that version. The push uses oumta-ci with the Woodpecker secret oumta_ci_token, so oumta-ci needs package write access in the org actions.
The secret oumta_ci_token holds the one token oumta-ci writes with. Limit it in Woodpecker to the images woodpeckerci/plugin-docker-buildx:6, git.uesome.de/actions/ci-cd/bump and git.uesome.de/actions/ci-cd/deploy and to the events push, tag and manual (zugaenge.md in oumta-deploy).
deploy
Writes a pushed dev or beta image with its digest to tanztee/oumta-deploy (D16 there). ci/deploy-image.sh in oumta-deploy decides the environment from the tag: -dev. goes to dev, -beta. to beta, anything else is skipped (prod only via PR).
Settings:
var(required): variable inenvs/<env>/images.env, e.g.AUTH_IMAGE.{major}is replaced by the major of the tag (APP_V{major}_IMAGE->APP_V2_IMAGE).deploy_token(required): token ofoumta-ci(oumta_ci_token), write access to oumta-deployregistry_username,registry_password: read access to the registry for the digest (oumta-ciwith the same token)envs: fixed environments instead of the tag rule, e.g.dev beta(oumta-keyklo)tag: defaultCI_COMMIT_TAGregistry: defaultgit.uesome.deimage: default<registry>/<CI_REPO>deploy_user: defaultoumta-cideploy_repo: defaulthttps://git.uesome.de/tanztee/oumta-deploy.git
Example:
when:
event: tag
ref: refs/tags/v*
steps:
- name: build
image: woodpeckerci/plugin-docker-buildx:6
settings:
registry: git.uesome.de
repo: git.uesome.de/tanztee/oumta-auth
tags: ${CI_COMMIT_TAG}
build_args:
VERSION: ${CI_COMMIT_TAG##v}
username: oumta-ci
password:
from_secret: oumta_ci_token
- name: deploy
image: git.uesome.de/actions/ci-cd/deploy:v1.0.0
settings:
var: AUTH_IMAGE
registry_username: oumta-ci
registry_password:
from_secret: oumta_ci_token
deploy_token:
from_secret: oumta_ci_token
bump
Derives the next version for the pushed branch and pushes it as a tag on the triggering commit. There is no version commit: the build takes the version from the tag (CI_COMMIT_TAG, e.g. as build arg VERSION: ${CI_COMMIT_TAG##v}), package.json stays untouched. The tag event then starts the build.
release/X.Y[.Z],hotfix/X.Y.Z: nextvX.Y.Z-beta.Nof that line (D8). A hotfix needs a patch number.production/*: no bump, the step fails. A release is a retag of a beta image (D9).- the branch in
release_branch(repos without majors, e.g. oumta-keyklomain): next stablevX.Y.Z, the highest existing patch of the line plus one - any other branch:
vX.Y.Z-dev.<UTC timestamp>; the line comes fromrelease_line, the branch name, the nearestrelease/*orhotfix/*branch (newest merge base), ormajor.minorfrompackage.json
If the stable tag of a line exists (v2.4.0 after the release), the next patch of that line is used (v2.4.1-beta.0, v2.4.1-dev.…).
Only the commit that triggered the pipeline is tagged; if the branch moved on, the step exits without a tag and the newer pipeline takes over. A commit that already carries a v* tag is not tagged again, so a re-run does not build twice.
Settings:
git_token(required): token ofoumta-ci(oumta_ci_token), write access to the repogit_user: defaultoumta-cirelease_branch: optional, branch that gets stable tags instead of dev tagsrelease_line: optional,<major>.<minor>[.<patch>], overrides every other ruleremote: defaultCI_REPO_CLONE_URL
Example:
when:
- event: push
branch: ['feature/**', 'release/**', 'hotfix/**']
- event: manual
steps:
- name: bump
image: git.uesome.de/actions/ci-cd/bump:v2.0.0
settings:
git_token:
from_secret: oumta_ci_token