7
votes

Vider le cache dans les actions GitHub

Je travaille sur un package R et j'utilise GitHub Action (GHA) en tant que fournisseur d'intégration continue (CI). Je cache les packages R (dépendances) à l'aide d' actions/cache . Et maintenant, je veux effacer tout le cache. Comment puis je faire ça?


Une partie de GHA Workflow que j'utilise:

on: push

name: R-CMD-check

jobs:
  R-CMD-check:
    runs-on: ${{ matrix.config.os }}

    name: ${{ matrix.config.os }} (${{ matrix.config.r }})

    strategy:
      fail-fast: false
      matrix:
        config:
          # - {os: windows-latest, r: 'devel'}
          - {os: macOS-latest,   r: 'release'}

    env:
      R_REMOTES_NO_ERRORS_FROM_WARNINGS: true
      RSPM: ${{ matrix.config.rspm }}
      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}

    steps:
      - uses: actions/checkout@v2

      - uses: r-lib/actions/setup-r@master

      - name: Query dependencies
        run: |
          repos <- c("https://r-hyperspec.github.io/hySpc.pkgs/", getOption("repos"))
          saveRDS("remotes::dev_package_deps(dependencies = TRUE)", ".github/depends.Rds", version = 2)
          writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version")
        shell: Rscript {0}

      - name: Cache R packages
        if: runner.os != 'Windows'
        uses: actions/cache@v1
        with:
          path: ${{ env.R_LIBS_USER }}
          key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }}
          restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-

      - name: Install dependencies
        run:   remotes::install_deps(dependencies = TRUE)
        shell: Rscript {0}

      - name: Session info
        run: |
          options(width = 100)
          pkgs <- installed.packages()[, "Package"]
          sessioninfo::session_info(pkgs, include_base = TRUE)
        shell: Rscript {0}


3 Réponses :


3
votes

Vous ne pouvez pas forcer l'effacement du cache actuellement et il semble qu'il y ait une demande de fonctionnalité ouverte pour le moment https://github.com/actions/cache/issues/2 . Si j'étais à votre place, j'y publierais également la demande afin qu'ils sachent que davantage de personnes souhaitent que la fonctionnalité soit implémentée.

Quelques points à noter sur l'action:

Il n'y a pas de paramètres dans l'action et même pas dans le package de boîte à outils sur lequel cette action est construite.

En pénétrant profondément dans le code de la boîte à outils, ils utilisent une URL de cache api pour faire toutes les bonnes choses. Cela signifie que nous ne savons même pas si cette API le prend en charge en supposant que nous essayons de le tester et de voir ce qu'il fournit d'autre en le touchant directement. Voici la ligne de l'appel api dont l'url de base est tirée de env ACTIONS_CACHE_URL

https://github.com/actions/toolkit/blob/c2bc747506bf562195a02bd4fdb1ff2a95d8b7ed/packages/cache/src/internal/cacheHttpClient.ts#L44

package npm comme référence https://www.npmjs.com/package/@actions/cache

Si nous prenons du recul pendant un moment et revenons à la documentation de github maintenant que nous avons examiné en profondeur le code d'action / cache et son fonctionnement,

Selon la documentation github https://docs.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows

Il y a deux choses à noter,

GitHub will remove any cache entries that have not been accessed in over 7 days.
Once you create a cache, you cannot change the contents of an existing 
cache but you can create a new cache with a new key.


0 commentaires

1
votes

@GegznaV vous pouvez utiliser quelque chose comme tmate et vider manuellement le cache en vous connectant à un runner.


0 commentaires

3
votes

Comme indiqué dans le problème correspondant , il n'existe actuellement aucune solution native pour vider le cache.

Cependant, il existe deux solutions de contournement pratiques pour utiliser un nouveau cache. Ce n'est pas exactement la même chose que de vider le cache actuel, mais cela fait le travail.

Pour ce faire, vous devez changer la key cache (et toutes les restore-keys ). Parce que si la ou les clés sont différentes, cela est considéré comme un échec de cache et vous commencez avec une nouvelle.

Vous pouvez changer la clé de cache soit en modifiant le fichier de workflow, par exemple en ajoutant un numéro de version:

key: ${{ runner.os }}-mycache-${{ secrets.CACHE_VERSION }}

Ou, si vous préférez utiliser l'interface utilisateur, vous pouvez abuser des secrets :

key: ${{ runner.os }}-mycache-v1


0 commentaires