web-dev-qa-db-fra.com

Comment ignorer la tâche Actions GitHub lors d'un événement Push?

Avec Travis CI, nous pouvons ignorer la construction d'un commit particulier en ajoutant un suffixe à un commit. Ceci est décrit à Travis CI . Je trouve cette fonctionnalité pratique lorsque je ne modifie que README.md qui n'est pas lié au code et la construction de pré-vol n'a pas besoin d'être déclenchée.

[skip ci]

Comment ignorer les tâches déclenchées on: Push événements utilisant des actions GitHub?

name: Maven Build
on: [Push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Check-out project
      uses: actions/checkout@v1
    - name: Set up JDK 11.0.3
      uses: actions/setup-Java@v1
      with:
        Java-version: 11.0.3
    - name: Build with Maven
      run: mvn -B package --file pom.xml
5
Nikolas

Git 2.27 (Q2 2020) illustre une autre approche: au lieu de toujours construire toutes les branches sur GitHub via Actions, les utilisateurs peuvent spécifier which branches à construire.

Voir commit e76eec (07 mai 2020) par Jeff King (peff) .
(Fusionné par Junio ​​C Hamano - gitster - in commit dd4a287 , 13 mai 2020)

ci : autorise la configuration par branche pour les actions GitHub

Signé par: Jeff King

En fonction des flux de travail des développeurs individuels, il peut être pratique ou ennuyeux que nos tâches GitHub Actions CI soient exécutées sur chaque branche.

Par exemple, si vous transportez de nombreuses branches de travail en cours à moitié terminées et que vous les rebasez fréquemment contre master, vous obtiendrez des tonnes de rapports d'échec qui ne sont pas intéressants (sans parler du processeur gaspillé).

Ce commit ajoute un nouveau travail qui vérifie une branche spéciale dans le référentiel pour la configuration CI, puis exécute un script Shell qu'il y trouve pour décider s'il faut ignorer le reste des tests .

La valeur par défaut continuera à exécuter des tests pour toutes les références si cette branche ou ce script est manquant.

Quelques alternatives ont été discutées:

Une option est de transporter des informations dans le commit lui-même pour savoir s'il doit être testé, soit dans l'arborescence elle-même (en changeant le fichier YAML du workflow) ou dans le message de commit (un indicateur "[skip ci]" ou similaire). Mais ceux-ci sont frustrants et sujets aux erreurs:

  • vous devez les appliquer manuellement à chaque branche que vous souhaitez marquer
  • il leur est facile de s'infiltrer dans d'autres flux de travail, comme l'envoi de correctifs par courrier électronique

Nous pourrions également essayer d'obtenir des informations à partir du nom de la branche. Mais cela conduit à des débats sur la question de savoir si la valeur par défaut doit être "off" ou "on", et le remplacement finit toujours par être un peu gênant.
Si la valeur par défaut est "on", vous devez vous rappeler de nommer vos succursales de manière appropriée pour ignorer CI.
Et si "off", vous finissez par devoir contorsionner vos noms de branche ou dupliquer vos poussées avec une refspec supplémentaire.

Par comparaison, la solution de ce commit vous permet de spécifier votre configuration une fois et de l'oublier, et toutes les données sont désactivées dans leur propre ref, où elles peuvent être modifiées par des fourches individuelles sans toucher au principal arbre.

Il y a eu quelques décisions de conception issues de la discussion sur la liste. Je vais résumer ici:

  • nous pourrions utiliser l'API de GitHub pour récupérer la référence de configuration, plutôt qu'une véritable vérification (et ensuite simplement l'utiliser via du javascript).
    Nous devons toujours lancer une VM et contacter GitHub sur le réseau de toute façon, donc cela ne sera pas beaucoup plus rapide.
    J'ai choisi d'utiliser Shell pour garder les choses similaires à nos autres outils (et je pourrais vraiment implémenter des allow-refs dans n'importe quelle langue que vous voulez). Cela facilite également le test de votre script localement et sa modification dans le contexte d'un arbre normal git.git .

  • nous pourrions garder le refname bien connu hors de refs/heads/ pour éviter d'encombrer l'espace de noms de la branche. Mais cela rend la manipulation difficile.
    En revanche, vous pouvez simplement " git checkout ci-config "pour apporter des modifications.

  • nous pourrions supposer que le ci-config ref n'a rien dedans sauf config (c'est-à-dire, une branche sans rapport avec le reste de git.git ).
    Mais traiter avec les branches orphelines est gênant. Au lieu de cela, nous ferons de notre mieux pour vérifier efficacement uniquement les ci/config répertoire en utilisant un clone partiel superficiel, ce qui permet à votre ci-config branch pour être juste une branche normale, avec vos modifications de configuration en haut.

  • nous pourrions fournir une interface plus simple, comme une liste statique de modèles de référence.
    Mais nous ne pouvons pas sortir de la création d'un ensemble VM de toute façon, donc nous pourrions aussi bien utiliser cette fonctionnalité pour rendre la configuration aussi flexible que possible.
    Si nous ajoutons plus de configuration, nous devrions pouvoir réutiliser notre clone partiel pour définir plus de sorties.

Le script est donc ci/config/allow-refs.sample :

#!/bin/sh
#
# Sample script for enabling/disabling GitHub Actions CI runs on
# particular refs. By default, CI is run for all branches pushed to
# GitHub. You can override this by dropping the ".sample" from the script,
# editing it, committing, and pushing the result to the "ci-config" branch of
# your repository:
#
#   git checkout -b ci-config
#   cp allow-refs.sample allow-refs
#   $EDITOR allow-refs
#   git commit -am "implement my ci preferences"
#   git Push
#
# This script will then be run when any refs are pushed to that repository. It
# gets the fully qualified refname as the first argument, and should exit with
# success only for refs for which you want to run CI.

case "$1" in
# allow one-off tests by pushing to "for-ci" or "for-ci/mybranch"
refs/heads/for-ci*) true ;;
# always build your integration branch
refs/heads/my-integration-branch) true ;;
# don't build any other branches or tags
*) false ;;
esac

Tout l'action .github/workflows doit faire est

  • Découvrez la branche spéciale et le script spécial qu'elle contient:

C'est:

git -c protocol.version=2 clone \
  --no-tags \
  --single-branch \
  -b ci-config \
  --depth 1 \
  --no-checkout \
  --filter=blob:none \
  https://github.com/${{ github.repository }} config-repo \
&& \
cd config-repo \
&& \
git checkout HEAD -- ci/config
  • Vérifiez si la branche poussée est autorisée:

Lequel est:

enabled=yes
if test -x config-repo/ci/config/allow-ref &&
         ! config-repo/ci/config/allow-ref '${{ github.ref }}'
then
  enabled=no
fi
1
VonC