Skip to main content

Auswerten von Ausdrücken in Workflows und Aktionen

Du kannst Ausdrücke in Workflows und Aktionen auswerten.

Informationen zu Ausdrücken

Mit Ausdrücken kannst du programmgesteuert Variablen in Workflow-Dateien festlegen und auf Kontexte zugreifen. Ein Ausdruck kann eine beliebige Kombination aus literalen Werten, Verweisen auf einen Kontext und Funktionen sein. Du kannst Literale, Kontextverweise und Funktionen mithilfe von Operatoren kombinieren. Weitere Informationen zu Kontexten findest du unter Zugreifen auf kontextbezogene Informationen zu Workflowausführungen.

Ausdrücke werden in Workflowdateien häufig mit dem Bedingungsschlüsselwort if verwendet, um festzulegen, ob ein Schritt ausgeführt werden soll. Wenn eine if-Bedingung true ist, wird der Schritt ausgeführt.

Du musst eine spezielle Syntax verwenden, um GitHub mitzuteilen, dass ein Ausdruck nicht als Zeichenfolge behandelt, sondern ausgewertet werden soll.

${{ <expression> }}

Hinweis: Die Ausnahme dieser Regel ist, wenn du Ausdrücke in einer if Klausel verwendest, wobei du optional ${{ und }} weglassen kannst. Weitere Informationen zu Bedingungen if findest du unter Workflowsyntax für GitHub Actions.

Warning

Bei der Erstellung von Workflows und Aktionen sollten Sie immer bedenken, ob Ihr Code nicht vertrauenswürdige Eingaben von möglichen Eindringlingen ausführen könnte. Bestimmte Kontexte sollten als nicht vertrauenswürdige Eingaben behandelt werden, da ein Angreifer seine eigenen schädlichen Inhalte einfügen könnte. Weitere Informationen findest du unter Sicherheitshärtung für GitHub Actions.

Beispiel zum Setzen einer Umgebungsvariablen

env:
  MY_ENV_VAR: ${{ <expression> }}

Literale

In Ausdrücken kannst du die Datentypen boolean, null, number oder string verwenden.

DatentypLiteralwert
booleantrue oder false
nullnull
numberAlle von JSON unterstützten Zahlenformate
stringDu musst Zeichenfolgen nicht mit ${{ und }} umschließen. Wenn du dich jedoch dazu entscheidest, musst du die Zeichenfolge mit einfachen Anführungszeichen (') umschließen. Wenn du ein einzelnes Anführungszeichen als Literal verwenden möchtest, musst du ein zusätzliches einzelnes Anführungszeichen ('') als Escapezeichen verwenden. Das Umschließen mit doppelten Anführungszeichen (") löst einen Fehler aus.

Beachten Sie, dass in Bedingungen falsche Werte (false, 0, -0, "", '', null) zu false gezwungen werden und wahre Werte (true und andere nicht falsche Werte) zu truegezwungen werden.

Beispiel für Literale

env:
  myNull: ${{ null }}
  myBoolean: ${{ false }}
  myIntegerNumber: ${{ 711 }}
  myFloatNumber: ${{ -9.2 }}
  myHexNumber: ${{ 0xff }}
  myExponentialNumber: ${{ -2.99e-2 }}
  myString: Mona the Octocat
  myStringInBraces: ${{ 'It''s open source!' }}

Operatoren

OperatorBESCHREIBUNG
( )Logische Gruppierung
[ ]Index
.Eigenschaftsdereferenzierung
!Not
<Kleiner als
<=Kleiner als oder gleich
>Größer als
>=Größer als oder gleich
==Gleich
!=Ungleich
&&And
||oder

Hinweise:

  • GitHub ignoriert die Groß-/Kleinschreibung beim Vergleichen von Zeichenfolgen.
  • steps.<step_id>.outputs.<output_name> wird als Zeichenfolge ausgewertet. Du musst eine spezielle Syntax verwenden, um GitHub mitzuteilen, dass ein Ausdruck nicht als Zeichenfolge behandelt, sondern ausgewertet werden soll. Weitere Informationen findest du unter Zugreifen auf kontextbezogene Informationen zu Workflowausführungen.
  • Für numerische Vergleiche kann die Funktion fromJSON() verwendet werden, um eine Zeichenfolge in eine Zahl zu konvertieren. Weitere Informationen zur Funktion fromJSON() findest du unter fromJSON.

GitHub vergleicht auf Gleichheit in toleranter Weise.

  • Wenn die Typen nicht übereinstimmen, wandelt GitHub den Typ in eine Zahl um. GitHub übergibt Datentypen anhand der folgenden Umwandlungen an eine Zahl:

    typeErgebnis
    Null0
    Booleantrue gibt 1 zurück.
    false gibt 0 zurück.
    StringAus einem zulässigem JSON-Zahlenformat geparst, andernfalls NaN.
    Hinweis: Eine leere Zeichenfolge gibt 0 zurück.
    ArrayNaN
    ObjektNaN
  • Wenn NaN einer der Operanden eines relationalen Vergleichs (>, <, >=, <=) ist, ist das Ergebnis immer false. Weitere Informationen findest du unter Mozilla-Dokumentation zu NaN-Werten.

  • GitHub ignoriert beim Vergleichen der Strings die Groß- und Kleinschreibung.

  • Objekte und Arrays werden nur dann als gleich betrachtet, wenn sie dieselbe Instanz sind.

GitHub bietet ein ternäres Operatorverhalten, das du in Ausdrücken verwenden kannst. Wenn du einen ternären Operator auf diese Weise verwendest, kannst du den Wert einer Umgebungsvariablen basierend auf einer Bedingung dynamisch festlegen, ohne separate if-else-Blöcke für jede mögliche Option schreiben zu müssen.

Beispiel

env:
  MY_ENV_VAR: ${{ github.ref == 'refs/heads/main' && 'value_for_main_branch' || 'value_for_other_branches' }}

In diesem Beispiel verwenden wir einen ternären Operator, um den Wert der Umgebungsvariablen MY_ENV_VAR basierend darauf festzulegen, ob der GitHub-Verweis auf refs/heads/main festgelegt ist oder nicht. Wenn dies der Fall ist, ist die Variable auf value_for_main_branch festgelegt. Andernfalls ist sie auf value_for_other_branches festgelegt. Es ist wichtig zu beachten, dass der erste Wert nach dem && wahr sein muss. Andernfalls wird der Wert nach dem || immer zurückgegeben.

Functions

GitHub bietet integrierte Funktionen, die du in Ausdrücken verwenden kannst. Manche Funktionen verwandeln Werte an einen String, um Vergleiche durchzuführen. GitHub verwandelt Daten verschiedener Typen folgendermaßen in einen String:

typeErgebnis
Null''
Boolean'true' oder 'false'
NumberDezimalformat, bei großen Zahlen exponentiell
ArrayArrays werden nicht in einen String umgewandelt.
ObjectObjekte werden nicht in einen String umgewandelt.

contains

contains( search, item )

Gibt true zurück, wenn search``item enthält. Wenn search ein Array ist, gibt diese Funktion true zurück, wenn es sich bei item um ein Arrayelement handelt. Wenn search einer Zeichenfolge entspricht, gibt diese Funktion true zurück, wenn es sich bei item um eine Unterzeichenfolge von search handelt. Bei dieser Funktion wird die Groß- und Kleinschreibung nicht berücksichtigt. Wandelt Werte in einen String um.

Beispiel mit einem String

true gibt contains('Hello world', 'llo') zurück.

Beispiel für die Verwendung eines Objektfilters

contains(github.event.issue.labels.*.name, 'bug') gibt true zurück, wenn das Issue im Zusammenhang mit dem Ereignis als Fehler (bug) bezeichnet wird.

Weitere Informationen findest du unter Objektfilter.

Beispiel für den Abgleich eines Arrays aus Zeichenfolgen

Anstatt github.event_name == "push" || github.event_name == "pull_request" zu schreiben, kannst du contains() mit fromJSON() verwenden, um zu überprüfen, ob ein Array aus Zeichenfolgen ein item enthält.

contains(fromJSON('["push", "pull_request"]'), github.event_name) gibt beispielsweise true zurück, wenn github.event_name „push“ oder „pull_request“ lautet.

startsWith

startsWith( searchString, searchValue )

Gibt true zurück, wenn searchString mit searchValue beginnt. Bei dieser Funktion wird die Groß- und Kleinschreibung nicht berücksichtigt. Wandelt Werte in einen String um.

Beispiel für startsWith

true gibt startsWith('Hello world', 'He') zurück.

endsWith

endsWith( searchString, searchValue )

Gibt true zurück, wenn searchString mit searchValue endet. Bei dieser Funktion wird die Groß- und Kleinschreibung nicht berücksichtigt. Wandelt Werte in einen String um.

Beispiel für endsWith

true gibt endsWith('Hello world', 'ld') zurück.

format

format( string, replaceValue0, replaceValue1, ..., replaceValueN)

Ersetzt Werte in der Zeichenfolge (string) durch die Variable replaceValueN. Variablen in string werden mit der {N}-Syntax angegeben, wobei es sich bei N um eine ganze Zahl handelt. Du musst mindestens einen replaceValue- und einen string-Wert angeben. Es gibt kein Maximum für die Anzahl der Variablen (replaceValueN), die du verwenden kannst. Verwende geschweifte Klammern doppelt, um eine als Escapezeichen zu verwenden.

Beispiel für format

format('Hello {0} {1} {2}', 'Mona', 'the', 'Octocat')

Gibt „Hello Mona the Octocat“ zurück

Beispiel mit maskierten Klammern

format('{{Hello {0} {1} {2}!}}', 'Mona', 'the', 'Octocat')

Gibt „{Hello Mona the Octocat!}“ zurück

join

join( array, optionalSeparator )

Der Wert von array kann ein Array oder eine Zeichenfolge sein. Alle Werte im array sind zu einer Zeichenfolge verkettet. Wenn du optionalSeparator angibst, wird der Wert in die verketteten Werte eingefügt. Andernfalls wird das Standardtrennzeichen , verwendet. Wandelt Werte in einen String um.

Beispiel für join

join(github.event.issue.labels.*.name, ', ') kann 'bug, help wanted' (Fehler, Hilfe benötigt) zurückgeben.

toJSON

toJSON(value)

Gibt eine Pretty-Print-JSON-Darstellung von value zurück. Diese Funktion hilft Dir bei der Fehlersuche in den Informationen, die in Kontexten enthalten sind.

Beispiel für toJSON

toJSON(job) kann { "status": "success" } zurückgeben.

fromJSON

fromJSON(value)

Gibt ein JSON-Objekt oder einen JSON-Datentyp für value zurück. Sie können diese Funktion verwenden, um ein JSON-Objekt als ausgewerteten Ausdruck bereitzustellen oder einen beliebigen Datentyp zu konvertieren, der in JSON oder JavaScript dargestellt werden kann, z. B. Zeichenfolgen, boolesche Werte, Nullwerte, Arrays und Objekte.

Beispiel für die Rückgabe eines JSON-Objekts

Dieser Workflow legt eine JSON-Matrix in einem Auftrag fest und übergibt sie mit einer Ausgabe und fromJSON an den nächsten Auftrag.

YAML
name: build
on: push
jobs:
  job1:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - id: set-matrix
        run: echo "matrix={\"include\":[{\"project\":\"foo\",\"config\":\"Debug\"},{\"project\":\"bar\",\"config\":\"Release\"}]}" >> $GITHUB_OUTPUT
  job2:
    needs: job1
    runs-on: ubuntu-latest
    strategy:
      matrix: ${{ fromJSON(needs.job1.outputs.matrix) }}
    steps:
      - run: echo "Matrix - Project ${{ matrix.project }}, Config ${{ matrix.config }}"

Beispiel für die Rückgabe eines JSON-Datentyps

Dieser Workflow konvertiert Umgebungsvariablen mithilfe von fromJSON von einer Zeichenfolge in eine boolesche oder eine ganze Zahl.

YAML
name: print
on: push
env:
  continue: true
  time: 3
jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - continue-on-error: ${{ fromJSON(env.continue) }}
        timeout-minutes: ${{ fromJSON(env.time) }}
        run: echo ...

Der Workflow verwendet die Funktion fromJSON(), um die Umgebungsvariable continue aus einer Zeichenfolge in einen booleschen Wert zu konvertieren, sodass sie bestimmen kann, ob der Vorgang fortgesetzt werden soll oder nicht. Ebenso konvertiert sie die Umgebungsvariable time von einer Zeichenfolge in eine ganze Zahl, wobei das Timeout für den Auftrag in Minuten festgelegt wird.

hashFiles

hashFiles(path)

Gibt einen einzelnen Hash für Dateien zurück, die dem path-Muster entsprechen. Du kannst ein einzelnes path-Muster oder mehrere path-Muster bereitstellen, die durch Kommas getrennt sind. path ist relativ zum GITHUB_WORKSPACE-Verzeichnis und kann nur Dateien innerhalb des GITHUB_WORKSPACE-Verzeichnisses enthalten. Diese Funktion berechnet einen individuellen SHA-256-Hash für jede passende Datei und verwendet diese Hashes dann zur Berechnung eines endgültigen SHA-256-Hashs für den Satz von Dateien. Wenn das path-Muster keinen Dateien entspricht, gibt es eine leere Zeichenfolge zurück. Weitere Informationen zu SHA-256 findest du unter SHA-2.

Du kannst Zeichen zum Musterabgleich verwenden, um Dateien mit passenden Namen auszuwählen. Der Musterabgleich für hashFiles entspricht dem Globmusterabgleich und unter Windows wird die Groß-/Kleinschreibung nicht beachtet. Weitere Informationen zu den unterstützten Zeichen für den Musterabgleich sind im Abschnitt Muster in der @actions/glob-Dokumentation zu finden.

Beispiel für ein einzelnes Muster

Stimmt mit allen package-lock.json-Dateien im Repository überein

hashFiles('**/package-lock.json')

Beispiel mit mehreren Mustern

Erstellt einen Hash für alle package-lock.json- und Gemfile.lock-Dateien im Repository

hashFiles('**/package-lock.json', '**/Gemfile.lock')

Statusprüfungsfunktionen

Du kannst die nachfolgenden Statusüberprüfungsfunktionen als Ausdrücke in if-Bedingungen verwenden. Eine Standardstatusprüfung von success() wird angewendet, sofern du keine dieser Funktionen einfügst. Weitere Informationen zu if-Bedingungen findest du unter Workflowsyntax für GitHub Actions und Metadatensyntax für GitHub Actions.

success

Gibt true zurück, wenn alle vorherigen Schritte erfolgreich waren.

Beispiel für success

steps:
  ...
  - name: The job has succeeded
    if: ${{ success() }}

immer

Bewirkt, dass der Schritt immer ausgeführt wird, und gibt selbst bei Abbruch true zurück Der always-Ausdruck wird am besten auf der Schrittebene oder für Aufgaben verwendet, die du voraussichtlich ausführst, auch wenn ein Auftrag abgebrochen wird. Du kannst beispielsweise always verwenden, um Protokolle zu senden, auch wenn ein Auftrag abgebrochen wird.

Warnung: Vermeide die Verwendung von always für eine Aufgabe, bei der ein kritischer Fehler auftreten könnte, z. B. beim Abrufen von Quellen. Andernfalls bleibt der Workflow möglicherweise bis zum Auftreten eines Timeouts hängen. Wenn du einen Auftrag oder Schritt unabhängig von Erfolg oder Fehler ausführen möchtest, verwende die empfohlene Alternative: if: ${{ !cancelled() }}

Beispiel für always

if: ${{ always() }}

cancelled

Gibt true zurück, wenn der Workflow abgebrochen wurde

Beispiel für cancelled

if: ${{ cancelled() }}

failure

Gibt true zurück, wenn ein vorheriger Schritt eines Auftrags fehlschlägt. Wenn du über eine Kette abhängiger Aufträge verfügst, gibt failure() true zurück, wenn ein vorheriger Auftrag fehlschlägt.

Beispiel für failure

steps:
  ...
  - name: The job has failed
    if: ${{ failure() }}

Fehler bei Bedingungen

Du kannst zusätzliche Bedingungen für einen Schritt einschließen, der nach einem Fehler ausgeführt werden soll. Allerdings musst du dennoch failure() einfügen, um die Standardstatusüberprüfung für success() außer Kraft zu setzen, die automatisch auf if-Bedingungen angewendet wird, die keine Statusprüfungsfunktion enthalten.

Beispiel für failure mit Bedingungen
steps:
  ...
  - name: Failing step
    id: demo
    run: exit 1
  - name: The demo step has failed
    if: ${{ failure() && steps.demo.conclusion == 'failure' }}

Objektfilter

Mit der *-Syntax kannst du einen Filter anwenden und übereinstimmende Elemente in einer Sammlung auswählen.

Als Beispiel sei das Objektarray namens fruits gegeben.

[
  { "name": "apple", "quantity": 1 },
  { "name": "orange", "quantity": 2 },
  { "name": "pear", "quantity": 1 }
]

Der Filter fruits.*.name gibt das Array [ "apple", "orange", "pear" ] zurück.

Du kannst auch die *-Syntax für ein Objekt verwenden. Angenommen, du verfügst über ein Objekt namens vegetables.


{
  "scallions":
  {
    "colors": ["green", "white", "red"],
    "ediblePortions": ["roots", "stalks"],
  },
  "beets":
  {
    "colors": ["purple", "red", "gold", "white", "pink"],
    "ediblePortions": ["roots", "stems", "leaves"],
  },
  "artichokes":
  {
    "colors": ["green", "purple", "red", "black"],
    "ediblePortions": ["hearts", "stems", "leaves"],
  },
}

Der Filter vegetables.*.ediblePortions kann wie folgt ausgewertet werden:


[
  ["roots", "stalks"],
  ["hearts", "stems", "leaves"],
  ["roots", "stems", "leaves"],
]

Da Objekte keine Reihenfolge beibehalten, kann die Reihenfolge der Ausgabe nicht garantiert werden.