Déclencheurs de workflow manuels dans les actions Github

9

Je configure des actions Github pour un référentiel de projet.

Le workflow comprend les étapes suivantes:

  • Création d'une image Docker
  • Pousser l'image vers un registre de conteneurs
  • Déployez un déploiement Kubernetes.

Cependant, j'ai deux déploiements Kubernetes différents: un pour le développement et un pour la production. Par conséquent, j'ai également deux workflows Github Action.

Le workflow d'action Github pour le développement est déclenché chaque fois qu'un commit est poussé:

on:
  push:
    branches:
    - master

Mais je ne veux pas cela pour mon flux de production. J'aurais besoin d'un déclencheur manuel, comme un bouton Envoyer en production . Je n'ai rien vu de semblable dans les documents.


Existe-t-il un moyen de déclencher un workflow manuellement dans les actions Github?

Comment puis-je diviser mon développement et mes workflows de production pour atteindre ce que je veux, que ce soit sur Github Actions, Docker ou Kubernetes?

Antoine C.
la source

Réponses:

9

Existe-t-il un moyen de déclencher un workflow manuellement dans les actions Github?

J'ai un petit hack pour le faire ...

Avec l'événement de surveillance, vous pouvez déclencher manuellement une action en étoile ou en étoile le repo. Le code de l'événement dans votre flux de travail est:

on:
  watch
    types: [started]

Je sais que c'est une merde bizarre mais ça marche! Néanmoins, ce n'est pas le meilleur moyen s'il s'agit d'un dépôt public avec des stars potentielles.


Comment puis-je diviser mon développement et mes workflows de production pour atteindre ce que je veux, que ce soit sur Github Actions, Docker ou Kubernetes?

Dans Github Actions, je veux dire, vous pouvez effectuer plusieurs workflows / tâches et filtrer par branches ou événements ciblés. Vous pouvez combiner plusieurs événements, par exemple déclencher un workflow pour push et avec un cron à minuit.

Sarah Abderemane
la source
7
Haha, c'est super:> à repository_dispatchpart, on peut combiner watchavec if: github.actor == 'hackerman'pour filtrer les étrangers aléatoires. Ou mieux encore - if: github.actor == github.event.repository.owner.loginpour plus de "sécurité": D
Samira
1
Haha merci! Oui bonne idée, je dois l'essayer quand j'ai le temps! : D
Sarah Abderemane
1
Parfait Je pense que c'est la meilleure méthode alors qu'il n'y a pas quelque chose officiellement implémenté.
Antoine C.
5

Mise à jour : pour une solution de style de commande slash "ChatOps", voir l'action slash-command-dispatch . Cela peut vous permettre de déclencher des workflows avec des commandes de barre oblique (par exemple /deploy) à partir des commentaires de demande et d'extraction.

Voici un exemple de base pour une deploycommande slash. REPO_ACCESS_TOKENest un reposcope d' accès personnel 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

La commande peut être traitée dans ce workflow.

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

Il y a beaucoup plus d'options et de configurations différentes. Voir slash-command-dispatch pour des instructions d'utilisation complètes.

Réponse originale : Un repository_dispatchworkflow peut être déclenché manuellement par un appel à l'API GitHub comme suit.

on:
  repository_dispatch:
    types: [production-deploy]
  • [username] est un nom d'utilisateur GitHub
  • [token]est un reposcope d' accès personnel Token
  • [repository] est le nom du référentiel dans lequel réside le workflow.
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
la source
1
Pour toute personne intéressée, il est possible d'utiliser un seul flux de travail pour plusieurs envois. Ce qui est envoyé en tant que event_typeest disponible pour le workflow en tant que github.event.action, des travaux / étapes spécifiques peuvent être activés / désactivés en cas de besoin. PS: PAT n'est pas vraiment nécessaire, le démarrage de curl avec -u "[username]:[password]"ou même -u "[username]"fonctionne également (dans le deuxième cas, curl invite l'utilisateur à saisir son mot de passe); plus facile à utiliser dans certains cas (par exemple lors de l'écriture de scripts qui prennent le nom d'utilisateur en entrée, ou de scripts destinés à être utilisés par des utilisateurs moins avertis en technologie).
Samira
2

Bien que le message de Sarah soit la réponse la plus proche et la plus simple à la question d'origine, il est quelque peu hacky, nous avons finalement fini par créer une devbranche pour utiliser les déclencheurs suivants:

  • Workflow de développement: déclenché lors d'un push sur la devbranche:

    on:
      push:
        branches:    
          - dev
    
  • Workflow de production: déclenché lorsqu'une demande / fusion d'extraction est effectuée à partir de devvers master:

    on:
      pull_request:
        branches:    
          - master
    
Antoine C.
la source
1

Modifié pour plus de détails / explications.

Une chose que vous pouvez faire est d'appeler repository_dispatch. Vous pouvez consulter la documentation GitHub pour utiliser un repository_dispatch ici .

Par exemple, si vous avez un flux de travail Actions GitHub qui ressemble à ceci:

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!"

Vous pouvez créer un événement de répartition de référentiel en suivant les étapes décrites dans la documentation de l'API GitHub v3 .

Tout d'abord, créez un jeton d'accès personnel (PAT) sur GitHub pour l'authentification.

Ensuite, vous pouvez exécuter curlcomme suit:

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

En même temps, je voulais aussi partager un petit projet sur lequel je travaillais avec un copain qui résout ce problème précis.

https://www.actionspanel.app/

ActionsPanel utilise cette même repository_dispatchAPI mais le fait avec un jeton GitHub App afin que vous n'ayez pas à vous soucier de la gestion de votre propre PAT. Cela facilite également le déclenchement de vos actions dans plusieurs équipes composées de plusieurs personnes.

Sur la base des demandes et des commentaires des utilisateurs, nous avons intégré des fonctionnalités pour spécifier la branche à laquelle envoyer la repository_dispatch, et nous avons même créé une manière d'injecter des paramètres lorsque vous souhaitez exécuter l'action.

Vous configurez vos boutons avec un fichier yaml déclaratif que vous laissez dans le référentiel, et ActionsPanel lira ce fichier et créera dynamiquement votre interface utilisateur pour vous permettre de déclencher vos actions.

aaronbatilo
la source
0

Une autre façon de résoudre ce problème avec l'offre d'action Github actuelle consiste à créer une productionbranche à partir du maître lorsqu'un déploiement est nécessaire et à déclencher une action de déploiement sur la productionbranche. La productionbranche est essentiellement un miroir de la master.

on:
  push:
    branches:    
      - master

Les builds / push de développement peuvent se produire chaque fois qu'il y a un commit sur le maître.

on:
  push:
    branches:    
      - production

À un certain moment dans le calendrier de publication, vous pouvez augmenter le PR à la productionbranche. Cela prendra en charge la génération / déploiement de prod.

user1064504
la source