Mise en cache de la dépendance npm avec l'action github

Oct 06 2020

Je veux mettre en cache les dépendances de npm afin de ne pas installer npm à chaque fois que je pousse et au lieu de le charger simplement à partir du cache.

Je pense que l'action github prend en charge cela maintenant?: Comment mettre en cache les étapes dans les actions GitHub?

Voici quelques cas

  • Si des package.jsonchangements, ce qui signifie yarn.lockou ont package-lock.jsonchangé, npm installe et met à jour le cache
  • En prolongeant mon point ci-dessus, le contributeur pourrait faire les deux yarn installetnpm install

De la même question ci-dessus, j'ai changé mon action github en quelque chose comme ça

name: Tsc compilation test
on: [push, pull_request]
jobs:
  build:
    name: Build
    runs-on: ubuntu-18.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Cache NPM dependencies
        uses: actions/cache@v1
        with:
          path: ~/.npm
          key: ${{ runner.OS }}-npm-cache-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.OS }}-npm-cache-
      - name: Install dependencies
        run: npm install
      - name: Test tsc
        run: npm run ts-compile-check

Cela fait toujours npm installet n'a pas réduit mon temps de calcul pour installer les dépendances (donc je ne suis pas sûr si cela fonctionne correctement ou non)

Ensuite, j'ai yarn install axiosespéré que cela mettrait à jour mon cache, mais en post-installation, je vois cela comme connecté

Post job cleanup.
Cache hit occurred on the primary key Linux-npm-cache-, not saving cache.

Alors voici mes questions, est-il possible de réaliser

  • Si package.jsonchange, ce qui signifie yarn.lockou a package-lock.jsonchangé, faites-le npm installet mettez à jour le cache
  • En prolongeant mon point ci-dessus, le contributeur pourrait faire les deux yarn installetnpm install

Et quelqu'un peut-il m'expliquer ça

    with:
      path: ~/.npm
      key: ${{ runner.OS }}-npm-cache-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.OS }}-npm-cache-

Réponses

5 PatrickDazé Oct 14 2020 at 02:19

Afin d'avoir une mise en cache efficace avec les actions GitHub, il doit y avoir un package-lock.jsonou yarn.lockpresent. Ce fichier est généré automatiquement lors de l'installation des packages. Si vous souhaitez plus d'informations sur package-lock.json, consultez la documentation .

Maintenant, il y a le sujet de savoir si npm et yarn doivent être utilisés dans le même projet. En savoir plus sur ce sujet ici .

Sur la base de la question, supposons que package-lock.json et yarn.lock existent. Si vous n'utilisez que l'un des deux, n'hésitez pas à en supprimer un par le bas. La configuration ci-dessous est pour yarn version 2 qui utilise yarn config get cacheFolderpour obtenir le dossier de cache. Pour une autre version de fil, voir la documentation .

name: Tsc compilation test
on: [push, pull_request]
jobs:
  build:
    name: Build
    runs-on: ubuntu-18.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - name: Cache yarn dependencies uses: actions/cache@v2 with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn- - name: Cache npm dependencies uses: actions/cache@v2 with: path: '~/.npm' key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node-

      - name: Install dependencies
        run: npm install # or yarn install

      - name: Test tsc
        run: npm run ts-compile-check

C'est ça! Eh bien, sauf pour une dernière chose. Ci-dessus, nous utilisons ~/.npmpour la mise en cache des dépendances npm. En termes de performances, il serait plus rapide de mettre en cache, **/node_modulesmais dans certains cas, cela introduirait des conflits. N'hésitez pas à expérimenter pour voir lequel fonctionne pour vous. En savoir plus ici et ici .


À partir de votre question, vous avez également demandé d'expliquer le code suivant:

    with:
      path: ~/.npm
      key: ${{ runner.OS }}-npm-cache-${{ hashFiles('**/package-lock.json') }}
      restore-keys: |
        ${{ runner.OS }}-npm-cache-

https://github.com/actions/cache#usage:

chemin - Une liste de fichiers, répertoires et modèles de caractères génériques à mettre en cache et à restaurer. Voir @ actions / glob pour les modèles pris en charge.
clé - Une clé explicite pour la restauration et la sauvegarde du cache
restauration-clés - Une liste ordonnée de clés à utiliser pour restaurer le cache si aucun succès cache a eu lieu pour la clé

Par conséquent, le code ci-dessus:

  • path est le dossier qui sera mis en cache / restauré (où les dépendances sont installées)
  • keyest un identifiant unique pour le chemin qui sera mis en cache. Dans ce cas, il hache le contenu de tout **/package-lock.jsonfichier en utilisant hashFiles. Fondamentalement, lorsque le fichier package-lock.json change, cela signifie que les dépendances ont changé et que le cache ne doit pas être utilisé.
  • restore-keys est essentiellement une clé par défaut à utiliser au cas où il n'y aurait pas de correspondance pour le key