Wie kann ich den vorherigen Commit vor einem Push oder Merge im GitHub Action-Workflow abrufen?

Lesezeit: 4 Minuten

Benutzeravatar von Rich McCluskey
Rich McCluskey

Ich benutze Nx für Monorepo-Unterstützung bei einem neuen Projekt. Einer der Vorteile von Nx besteht darin, dass es feststellen kann, welche Apps im Monorepo von einer Reihe von Änderungen betroffen sind (Commit starten, Commit beenden). Wenn Sie also eine Reihe von Apps haben, müssen Sie nur die Apps erstellen, testen und bereitstellen, die tatsächlich von den Änderungen betroffen sind, anstatt das gesamte Monorepo.

Ich möchte einen GitHub Action-Workflow einrichten, um nur die betroffenen Apps per Push oder Merge zum Master bereitzustellen. Ich habe jedoch Probleme herauszufinden, wie ich das “Start Commit” für den Bereich der Änderungen erhalte. Mit anderen Worten, wie erhalte ich den Commit-Hash der letzten Bereitstellung?

GitHub stellt eine env-Variable bereit GITHUB_SHA aber das ist das Commit, das den Workflow ausgelöst hat (dh das “End-Commit”). Es bietet auch GITHUB_BASE_REF aber das funktioniert nur bei Workflows, die von einem gegabelten Repo im Vergleich zum Head-Repo ausgeführt werden.

CircleCI hat pipeline.git.base_revision für diesen Zweck. Haben GitHub-Aktionen etwas Ähnliches?

Benutzeravatar von peterevans
Peterewan

Für Pull-Request-Events finden Sie ref und sha für die Basis im Github-Kontext wie folgt.

${{ github.event.pull_request.base.ref }}
${{ github.event.pull_request.base.sha }}

Für Push-Events gibt es base_ref und before Parameter.

${{ github.event.base_ref }}
${{ github.event.before }}

before ist die letzte Gitsha, die auf dem Zweig zum Ursprung gepusht wurde base_ref. Beachten Sie, dass, wenn dies der erste Commit in einem neuen Zweig ist, base_ref und before wird Null-/Standardwerte haben, wie unten gezeigt.

##[debug]  "event": {
##[debug]    "after": "727f7aec97c394083d769029e5f619e9b094a235",
##[debug]    "base_ref": null,
##[debug]    "before": "0000000000000000000000000000000000000000",
...

Übrigens können Sie den Github-Kontext ausgeben und die verfügbaren Parameter überprüfen, indem Sie diesen Schritt zu Ihrem Workflow hinzufügen:

      - name: Dump GitHub context
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
        run: echo "$GITHUB_CONTEXT"

  • Danke für den hilfreichen Tipp zum Dumping des Github-Kontexts! Ich habe das ausprobiert und interessanterweise hatte es einen Wert für github.event.before auf Push-to-Master. Ich habe sogar versucht, zwei Commits gleichzeitig zu pushen, und der Before-Wert war korrekt. Ich bin mir nicht sicher, warum das bei dir nicht funktioniert hat, aber das ist genau das, wonach ich gesucht habe!

    – Rich McCluskey

    18. Mai 2020 um 4:21 Uhr

  • @RichMcCluskey Schön, dass du eine Lösung gefunden hast. Nicht sicher warum before hatte bei meinem Test keinen Wert. Ich habe die Antwort für alle, die dies in Zukunft finden, leicht aktualisiert.

    – Peterewan

    18. Mai 2020 um 5:24 Uhr

  • Follow-up… Mir ist aufgefallen, dass beim ersten Push einer neuen Verzweigung die fehlen wird before commit wie in deinem Beispiel gezeigt. Ich denke, das macht Sinn, da der Zweig neu ist und vorher nicht existierte. In diesem Fall kann ich einfach mit dem Master vergleichen, um den Bereich der Commits zu finden.

    – Rich McCluskey

    18. Mai 2020 um 16:47 Uhr

  • @RohitReddyAbbadi Ich denke, standardmäßig klonen GitHub-Workflows das Repo beim HEAD-Commit nur teilweise, sodass Sie möglicherweise zuerst einen Abruf in Ihrem Workflow durchführen müssen

    – Rich McCluskey

    3. Juni 2020 um 17:43 Uhr


  • @RohitReddyAbbadi Versuchen Sie hinzuzufügen fetch-depth: 0 zu actions/checkout. Das ruft den gesamten Verlauf für Tags und Branches ab. Sehen hier

    – Peterewan

    3. Juni 2020 um 23:00 Uhr

GitHub bietet GITHUB_BASE_REF und der github.base_ref Kontext, der den Basiszweig enthält.

Wenn Sie an der neuesten Version dieses Zweigs interessiert sind, können Sie loslegen git rev-parse $GITHUB_BASE_REF es zu finden. Wenn Sie an dem Punkt interessiert sind, an dem sich die Zweige gegabelt haben, können Sie rennen git merge-base $GITHUB_BASE_REF $GITHUB_SHA es zu finden.

Beachten Sie, dass es möglich ist, andere Projekte mit inkompatiblen API-Änderungen und dergleichen zu unterbrechen, ohne Codeänderungen an ihnen vorzunehmen. Es ist also zwar schneller, nur die geänderten Apps zu testen, Sie werden jedoch möglicherweise feststellen, dass dies zu unerwarteten Unterbrechungen führt.

  • Zu Ihrer Information, Nx bestimmt, welche Projekte neu erstellt werden sollen, indem es die in sie importierten Abhängigkeiten versteht und durch Konfiguration sagt, was wovon abhängt, wenn kein direkter Codeimport vorhanden ist. Es hängt nicht nur davon ab, wo die Änderungen sind 🙂

    – Rich McCluskey

    18. Mai 2020 um 2:02 Uhr

  • Leider funktioniert diese Antwort nicht. Das sagen die Dokus GITHUB_BASE_REF und github.base_ref sind nur für gegabelte Repositories gesetzt. Meine ist nicht gegabelt. Ich habe es auch getestet und überprüft, ob die Dokumente korrekt sind.

    – Rich McCluskey

    18. Mai 2020 um 2:18 Uhr

1439220cookie-checkWie kann ich den vorherigen Commit vor einem Push oder Merge im GitHub Action-Workflow abrufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy