web-dev-qa-db-fra.com

Comment mettre en cache les étapes des actions GitHub?

Disons que j'ai un workflow d'actions GitHub avec 2 étapes.

  1. Téléchargez et compilez les dépendances de mon application.
  2. Compiler et tester mon application

Mes dépendances changent rarement et les dépendances compilées peuvent être mises en cache en toute sécurité jusqu'à ce que je change ensuite le fichier de verrouillage qui spécifie leurs versions.

Est-ce un moyen d'enregistrer le résultat de la première étape afin qu'à l'avenir, le flux de travail puisse ignorer cette étape?

30
lpil

Je vais résumer les deux options:

  1. Mise en cache
  2. Docker

Mise en cache

Vous pouvez ajouter une commande dans votre flux de travail pour mettre en cache les répertoires. Lorsque cette étape est atteinte, il vérifiera si le répertoire que vous avez spécifié a été précédemment enregistré. Si c'est le cas, il le saisira. Sinon, ce ne sera pas le cas. Ensuite, dans les étapes suivantes, vous écrivez des vérifications pour voir si les données mises en cache sont présentes. Par exemple, supposons que vous compiliez une dépendance qui est grande et ne change pas grand-chose. Vous pouvez ajouter une étape de cache au début de votre flux de travail, puis une étape pour créer le contenu du répertoire s'il n'y en a pas. La première fois que vous l'exécutez, il ne trouvera pas les fichiers, mais il le sera par la suite et votre flux de travail s'exécutera plus rapidement.

Dans les coulisses, GitHub télécharge un Zip de votre répertoire sur le propre stockage AWS de github. Ils purgent tout ce qui date de plus d'une semaine ou si vous atteignez une limite de 2 Go.

Certains inconvénients de cette technique sont qu'elle enregistre uniquement les répertoires. Donc, si vous avez installé dans/usr/bin, vous devrez mettre cela en cache! Ce serait gênant. Vous devriez plutôt installer dans $ home/.local et utiliser echo set-env pour ajouter cela à votre chemin.

Docker

Docker est un peu plus complexe et cela signifie que vous devez avoir un compte Dockerhub et gérer deux choses maintenant. Mais c'est beaucoup plus puissant. Au lieu de sauvegarder juste un répertoire, vous sauvegarderez un ordinateur entier! Ce que vous allez faire est de créer un Dockerfile qui contiendra toutes vos dépendances, comme apt-get et python pip lines ou même une longue compilation. Ensuite, vous construirez cette image de docker et la publierez Enfin, vous aurez vos tests définis pour s'exécuter sur cette nouvelle image de docker, au lieu par exemple sur ubuntu-latest. Et à partir de maintenant, au lieu d'installer des dépendances, il vous suffira de télécharger l'image.

Vous pouvez automatiser davantage cela en stockant ce Dockerfile dans le même référentiel GitHub que le projet, puis écrire un travail avec des étapes qui téléchargeront la dernière image Docker, reconstruire si nécessaire uniquement les étapes modifiées, puis télécharger sur Dockerhub. Et puis un travail qui "a besoin" de celui-là et utilise l'image. De cette façon, votre flux de travail mettra à jour l'image docker si nécessaire et l'utilisera également.

L'inconvénient est que vos dépôts seront dans un fichier, le Dockerfile et les tests dans le flux de travail, donc ce n'est pas tout ensemble. En outre, si le temps de téléchargement de l'image est supérieur au temps de création des dépendances, c'est un mauvais choix.


Je pense que chacun a ses avantages et ses inconvénients. La mise en cache n'est utile que pour des choses vraiment simples, comme la compilation en .local. Si vous avez besoin de quelque chose de plus étendu, Docker est le plus puissant.

0
Eyal