Wann läuft ein Workflow – und welcher Job darin? on: und if: im Griff.
main,
ein nächtlicher Security-Scan, ein manueller Knopf für Releases. Genau das steuerst du mit
on: (was startet den Workflow) und if: (welcher Job/Step läuft wirklich).
on:on:
push:
branches: [main] # nur Pushes auf main
paths: ['app/**', 'tests/**'] # nur bei Code-Änderung
pull_request: # bei PRs (gegen jeden Branch)
schedule:
- cron: '0 3 * * *' # täglich 03:00 (POSIX-cron)
workflow_dispatch: # manueller Start per UI/API
inputs:
grund:
type: string
required: true
| Event | Löst aus bei |
|---|---|
push | Commits/Tags – filterbar mit branches, tags, paths |
pull_request | PR geöffnet/aktualisiert (Default: opened, synchronize, reopened) |
schedule | Zeitplan per cron |
workflow_dispatch | Manuellem Klick/API – mit inputs |
release | Release published/edited/deleted |
if: deploy:
runs-on: docker
needs: [test]
if: ${{ forgejo.ref == 'refs/heads/main' }} # nur auf main
steps:
- run: echo "deploy …"
In if: ist ${{ }} implizit – beide Schreibweisen gehen. Nützliche
Status-Funktionen: success() (Default), failure(), always(),
cancelled(). Beispiel: ein Melde-Step mit if: ${{ failure() }} läuft nur,
wenn vorher etwas schiefging.
schedule-Lauf aus;
springt sie zurück, läuft er doppelt (anders als GitHub). (2) Fork-PRs: Ein
pull_request aus einem Fork läuft mit eingeschränkten Rechten und ohne Secrets –
Sicherheitsthema in Lektion 12.
workflow:rules + Job-rules:
only/except (alt)
Scheduled Pipelines in der UI
Manuell: when: manual
on: (Workflow) + Job-if:
Filter via branches/paths
schedule: cron im Workflow
Manuell: workflow_dispatch
Frage: on: push: branches: [main]. Du pushst auf
feature/x. Läuft der Workflow?
Nein – der Branch-Filter lässt nur main durch. Für PR-Prüfungen
von Feature-Branches ergänzt du pull_request:.
Aufgabe: Mach den deploy-Job zusätzlich nur dann lauffähig,
wenn er manuell gestartet wurde – nicht bei jedem Push auf main.
Tipp: on: um workflow_dispatch erweitern und if: aufs Event prüfen.
on:
push: { branches: [main] }
workflow_dispatch:
# … im Job:
if: ${{ forgejo.event_name == 'workflow_dispatch' }}
Womit baust du einen manuellen Startknopf?
workflow_dispatch erzeugt einen „Run"-Knopf (mit optionalen inputs).
when: manual ist GitLab.
Wann läuft ein Step mit if: ${{ failure() }}?
failure() ist wahr, sobald etwas zuvor scheiterte – ideal für Benachrichtigungen.
„immer" wäre always().
on (Events, Filter, schedule, workflow_dispatch).
if:? Schick mir die
Bedingung – wir prüfen sie gemeinsam.