Cache de dependência de npm com ação github

Oct 06 2020

Desejo armazenar em cache as dependências do npm para não instalar o npm toda vez que enviar e, em vez disso, apenas carregá-lo do cache.

Acho que a ação do github suporta isso agora ?: Como faço para armazenar em cache as etapas nas ações do GitHub?

Aqui estão alguns casos

  • Se package.jsonmudar, o que significa yarn.lockou package-lock.jsonmudou, faça o npm instalar e atualizar o cache
  • Estendendo meu ponto acima, o colaborador poderia estar fazendo tanto yarn installenpm install

Da mesma pergunta acima, mudei minha ação no github para algo assim

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

Isso ainda npm installreduz e não reduziu meu tempo de computação para instalar dependências (portanto, não tenho certeza se isso está funcionando corretamente ou não)

Então eu yarn install axiosesperava que ele atualizasse meu cache, mas na pós-instalação vejo isso como registrado

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

Então aqui estão minhas perguntas, é possível alcançar

  • Se package.jsonmudar, o que significa yarn.lockou package-lock.jsonmudou, faça npm installe atualize o cache
  • Estendendo meu ponto acima, o colaborador poderia estar fazendo tanto yarn installenpm install

E alguém pode me explicar isso

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

Respostas

5 PatrickDazé Oct 14 2020 at 02:19

Para ter um cache eficiente com as ações do GitHub, é necessário que haja um package-lock.jsonou yarn.lockpresente. Este arquivo é gerado automaticamente ao instalar pacotes. Se você quiser mais informações sobre o package-lock.json, verifique os documentos .

Agora há a questão de saber se npm e yarn devem ser usados ​​no mesmo projeto. Mais sobre esse assunto aqui .

Com base na pergunta, vamos supor que tanto um package-lock.json quanto um yarn.lock existam. Se você estiver usando apenas um dos dois, sinta-se à vontade para remover um abaixo. A configuração abaixo é para yarn versão 2, que usa yarn config get cacheFolderpara obter a pasta de cache. Para outra versão do fio, consulte os documentos .

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

É isso aí! Bem, exceto por mais uma coisa. Acima, estamos usando ~/.npmpara armazenar em cache as dependências do npm. Em termos de desempenho, seria mais rápido armazenar em cache, **/node_modulesno entanto, em alguns casos, isso introduziria conflitos. Sinta-se à vontade para experimentar para ver qual funciona para você. Mais sobre isso aqui e aqui .


A partir de sua pergunta, você também pediu para explicar o seguinte código:

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

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

caminho - uma lista de arquivos, diretórios e padrões curinga para armazenar em cache e restaurar. Veja @ actions / glob para padrões suportados.
chave - Uma chave explícita para restaurar e salvar o cache
Restore-chaves - Uma lista de chaves para o uso ordenado para restaurar o cache se não houver acerto de cache ocorreu para a chave

Portanto, o código acima:

  • path é a pasta que será armazenada em cache / restaurada (onde as dependências são instaladas)
  • keyé um identificador exclusivo para o caminho que será armazenado em cache. Nesse caso, ele faz o hash do conteúdo de qualquer **/package-lock.jsonarquivo usando hashFiles. Basicamente, quando o arquivo package-lock.json muda, isso significa que as dependências mudaram e o cache não deve ser usado.
  • restore-keys é basicamente uma chave padrão para usar no caso de não haver correspondência para o key