Cache intermediate build artefacts

Because Charmcraft builds Python packages from source rather than using pre-built wheels, the initial builds of charms can take a while. The intermediate artefacts get cached, which significantly speeds up subsequent builds.

When installed as a snap, Charmcraft automatically caches these wheels in the ~/snap/charmcraft/common/cache directory. However, in some cases, it may be beneficial to change this directory.

This can be especially useful in CI, where you may wish to specify a directory that gets cached between CI runs.

Local usage

When packing locally, you can change where Charmcraft caches build artefacts by setting the CRAFT_SHARED_CACHE environment variable to the path of an existing directory to use instead:

mkdir -p /tmp/charmcraft
CRAFT_SHARED_CACHE=/tmp/charmcraft charmcraft pack

On GitHub

While it’s recommended that you use the charmcraft/pack action from craft-actions where possible, the following workflow will manually pack a charm, caching the intermediate files:

name: Pack charm
on:
  pull_request:
jobs:
  pack:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: canonical/craft-actions/charmcraft/setup
    - uses: actions/cache@v4
    with:
      path: ${{ runner.temp }}
      key: charmcraft-cache-${{ hashfiles('requirements.txt') }}
      restore-keys: |
        charmcraft-cache-
    - env:
    CRAFT_SHARED_CACHE: ${{ runner.temp }
      run: |
    charmcraft pack

On GitLab

The following example gitlab-ci.yml will install and run Charmcraft to pack your charm, caching the intermediate artefacts:

pack-charm:
  cache:
    - key:
    files:
      - requirements.txt
      paths:
    - .charmcraft_cache/
  variables:
    CRAFT_SHARED_CACHE: .charmcraft_cache/
  script:
    - mkdir -p .charmcraft_cache
    - snap install charmcraft
    - charmcraft pack