Manuelle Workflow-Trigger in Github-Aktionen

9

Ich richte Github-Aktionen für ein Projekt-Repository ein.

Der Workflow besteht aus folgenden Schritten:

  • Erstellen eines Docker-Images
  • Verschieben des Bildes in eine Containerregistrierung
  • Rollout einer Kubernetes-Bereitstellung.

Ich habe jedoch zwei verschiedene Kubernetes-Bereitstellungen: eine für die Entwicklung und eine für die Produktion. Daher habe ich auch zwei Github Action-Workflows.

Der Github Action-Workflow für die Entwicklung wird jedes Mal ausgelöst, wenn ein Commit gesendet wird:

on:
  push:
    branches:
    - master

Aber das möchte ich nicht für meinen Produktionsworkflow. Ich würde einen manuellen Auslöser benötigen, wie eine Schaltfläche An Produktion senden . Ich habe in den Dokumenten nichts Ähnliches gesehen.


Gibt es eine Möglichkeit, einen Workflow in Github-Aktionen manuell auszulösen?

Wie kann ich meine Entwicklungs- und Produktionsworkflows aufteilen, um das zu erreichen, was ich möchte, entweder bei Github Actions, Docker oder Kubernetes?

Antoine C.
quelle

Antworten:

9

Gibt es eine Möglichkeit, einen Workflow in Github-Aktionen manuell auszulösen?

Ich habe einen kleinen Hack dazu ...

Mit dem Watch-Ereignis können Sie manuell eine Aktion nach Stern auslösen oder das Repo aufheben. Der Code für das Ereignis in Ihrem Workflow lautet:

on:
  watch
    types: [started]

Ich weiß, es ist eine seltsame Scheiße, aber es funktioniert! Trotzdem ist es nicht der beste Weg, wenn es sich um ein öffentliches Repo mit potenziellen Stars handelt.


Wie kann ich meine Entwicklungs- und Produktionsworkflows aufteilen, um das zu erreichen, was ich möchte, entweder bei Github Actions, Docker oder Kubernetes?

Ich meine, in Github-Aktionen können Sie mehrere Workflows / Jobs ausführen und nach bestimmten Zweigen oder Ereignissen filtern. Sie können mehrere Ereignisse kombinieren, z. B. um Mitternacht einen Workflow für Push und mit einem Cron auslösen .

Sarah Abderemane
quelle
7
Haha, das ist großartig:> repository_dispatchbeiseite, man kombiniert watchmit if: github.actor == 'hackerman'zum Ausfiltern von zufällig Fremden. Oder noch besser - if: github.actor == github.event.repository.owner.loginfür zusätzliche "Sicherheit": D
Samira
1
Haha danke! Ja gute Idee, ich muss das ausprobieren, wenn ich Zeit habe! : D
Sarah Abderemane
1
Perfekt Ich denke, dies ist die beste Methode, obwohl es nichts offiziell Implementiertes gibt.
Antoine C.
5

Update : Für eine "ChatOps" -Lösung im Slash-Befehlsstil siehe Slash-Command-Dispatch- Aktion. Auf diese Weise können Sie Workflows mit Schrägstrichen (z. B. /deploy) aus Issue- und Pull-Anforderungskommentaren auslösen .

Hier ist ein grundlegendes Beispiel für einen deploySchrägstrichbefehl. REPO_ACCESS_TOKENist ein reposcoped Personal Access Token

name: Slash Command Dispatch
on:
  issue_comment:
    types: [created]
jobs:
  slashCommandDispatch:
    runs-on: ubuntu-latest
    steps:
      - name: Slash Command Dispatch
        uses: peter-evans/slash-command-dispatch@v1
        with:
          token: ${{ secrets.REPO_ACCESS_TOKEN }}
          commands: deploy

Der Befehl kann in diesem Workflow verarbeitet werden.

name: Deploy Command
on:
  repository_dispatch:
    types: [deploy-command]

Es gibt viel mehr Optionen und verschiedene Setups. Ausführliche Anweisungen zur Verwendung finden Sie unter Schrägstrich-Befehlsversand .

Ursprüngliche Antwort : Ein repository_dispatchWorkflow kann manuell durch einen Aufruf der GitHub-API wie folgt ausgelöst werden.

on:
  repository_dispatch:
    types: [production-deploy]
  • [username] ist ein GitHub-Benutzername
  • [token]ist ein reposcoped Personal Access Token
  • [repository] ist der Name des Repositorys, in dem sich der Workflow befindet.
curl -XPOST -u "[username]:[token]" \
  -H "Accept: application/vnd.github.everest-preview+json" \
  -H "Content-Type: application/json" \
  https://api.github.com/repos/[username]/[repository]/dispatches \
  --data '{"event_type": "production-deploy"}'
Peterevans
quelle
1
Für alle Interessierten ist es möglich, einen einzelnen Workflow für mehrere Versendungen zu verwenden. Was gesendet event_typewird, steht dem Workflow als zur Verfügung github.event.action, sodass bestimmte Jobs / Schritte bei Bedarf aktiviert / deaktiviert werden können. PS: PAT wird nicht wirklich benötigt, das Starten von Curl beginnt mit -u "[username]:[password]"oder -u "[username]"funktioniert sogar (im zweiten Fall fordert Curl den Benutzer zur Eingabe eines Passworts auf). In einigen Fällen einfacher zu verwenden (z. B. beim Schreiben von Skripten, bei denen der Benutzername als Eingabe verwendet wird, oder von Skripten, die von weniger technisch versierten Benutzern verwendet werden sollen).
Samira
2

Obwohl Sarahs Beitrag die naheliegendste und einfachste Antwort auf die ursprüngliche Frage war, ist er etwas hackig, sodass wir schließlich einen devZweig erstellt haben, in dem die folgenden Auslöser verwendet werden:

  • Entwicklungsworkflow: Wird ausgelöst, wenn ein Push für den devZweig ausgeführt wird:

    on:
      push:
        branches:    
          - dev
    
  • Produktionsablauf: ausgelöst , wenn ein Pull - Request / Druck aus gemacht devzu master:

    on:
      pull_request:
        branches:    
          - master
    
Antoine C.
quelle
1

Für weitere Details / Erklärungen bearbeitet.

Eine Sache, die Sie tun können, ist anzurufen repository_dispatch. Sie können die GitHub Dokumentation sehen eine für die Verwendung repository_dispatch hier .

Wenn Sie beispielsweise einen GitHub Actions-Workflow haben, der folgendermaßen aussieht:

on:
  repository_dispatch:
    types: [run_tests]
name: Run tests
jobs:
  test:
    name: Run your tests
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo "I just ran all your tests!"

Sie können ein Repository-Versandereignis erstellen, indem Sie die Schritte ausführen, die in der GitHub v3-API-Dokumentation erläutert werden .

Erstens, einen persönlichen Zugriffstoken (PAT) erstellen auf GitHub zur Authentifizierung.

Dann können Sie so laufen curl:

curl \
  -H "Authorization: token $YOUR_PAT" \
  --request POST \
  --data '{"event_type": "run_tests"}' \
  https://api.github.com/repos/$USER/$REPOSITORY/dispatches

Gleichzeitig wollte ich ein kleines Projekt, an dem ich gearbeitet habe, mit einem Kumpel teilen, der genau dieses Problem löst.

https://www.actionspanel.app/

ActionsPanel verwendet dieselbe repository_dispatchAPI, jedoch mit einem GitHub-App-Token, sodass Sie sich nicht um die Verwaltung Ihrer eigenen PAT kümmern müssen. Dies macht es auch viel einfacher, Ihre Aktionen in Teams mit mehreren Personen auszulösen.

Basierend auf Benutzeranfragen und Feedback haben wir Funktionen integriert, um anzugeben, an welchen Zweig der gesendet werden repository_dispatchsoll, und wir haben sogar eine Möglichkeit eingebaut, Parameter einzufügen, wenn Sie die Aktion ausführen möchten.

Sie konfigurieren Ihre Schaltflächen mit einer deklarativen Yaml-Datei, die Sie im Repo belassen, und ActionsPanel liest diese Datei und erstellt dynamisch Ihre Benutzeroberfläche, damit Sie Ihre Aktionen auslösen können.

Aaronbatilo
quelle
0

Eine andere Möglichkeit, dies mit dem aktuellen Github-Aktionsangebot zu beheben, besteht darin, einen productionZweig vom Master zu erstellen, wenn eine Bereitstellung erforderlich ist, und eine Bereitstellungsaktion für den productionZweig auszulösen . Der productionZweig ist im Wesentlichen ein Spiegel der master.

on:
  push:
    branches:    
      - master

Dev Builds / Push können immer dann erfolgen, wenn ein Commit an den Master erfolgt.

on:
  push:
    branches:    
      - production

Zu einem bestimmten Zeitpunkt im Veröffentlichungsplan können Sie die PR für die productionZweigstelle erhöhen . Dies kümmert sich um die Erstellung / Bereitstellung des Produkts.

user1064504
quelle