Git Product home page Git Product logo

cache-apt-pkgs-action's Introduction

cache-apt-pkgs-action

License: Apache2 Master Test status Staging Test status

This action allows caching of Advanced Package Tool (APT) package dependencies to improve workflow execution time instead of installing the packages on every run.

Important

Looking for co-maintainers to help review changes, and investigate issues. I haven't had as much time to stay on top of this action as I would like to and want to make sure it is still responsive and reliable for the community. If you are interested, please reach out.

Documentation

This action is a composition of actions/cache and the apt utility. Some actions require additional APT based packages to be installed in order for other steps to be executed. Packages can be installed when ran but can consume much of the execution workflow time.

Usage

Pre-requisites

Create a workflow .yml file in your repositories .github/workflows directory. An example workflow is available below. For more information, reference the GitHub Help Documentation for Creating a workflow file.

Versions

There are three kinds of version labels you can use.

  • @latest - This will give you the latest release.
  • @v# - Major only will give you the latest release for that major version only (e.g. v1).
  • Branch
    • @master - Most recent manual and automated tested code. Possibly unstable since it is pre-release.
    • @staging - Most recent automated tested code and can sometimes contain experimental features. Is pulled from dev stable code.
    • @dev - Very unstable and contains experimental features. Automated testing may not show breaks since CI is also updated based on code in dev.

Inputs

  • packages - Space delimited list of packages to install.
  • version - Version of cache to load. Each version will have its own cache. Note, all characters except spaces are allowed.
  • execute_install_scripts - Execute Debian package pre and post install script upon restore. See Caveats / Non-file Dependencies for more information.

Outputs

  • cache-hit - A boolean value to indicate a cache was found for the packages requested.
  • package-version-list - The main requested packages and versions that are installed. Represented as a comma delimited list with equals delimit on the package version (i.e. <package1>=<version1>,<package2>=<version2>,...).
  • all-package-version-list - All the pulled in packages and versions, including dependencies, that are installed. Represented as a comma delimited list with equals delimit on the package version (i.e. <package1>=<version1>,<package2>=<version2>,...).

Cache scopes

The cache is scoped to the packages given and the branch. The default branch cache is available to other branches.

Example workflow

This was a motivating use case for creating this action.

name: Create Documentation
on: push
jobs:
  build_and_deploy_docs:
    runs-on: ubuntu-latest
    name: Build Doxygen documentation and deploy
    steps:
      - uses: actions/checkout@v2
      - uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: dia doxygen doxygen-doc doxygen-gui doxygen-latex graphviz mscgen
          version: 1.0

      - name: Build
        run: |
          cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}      
          cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}

      - name: Deploy
        uses: JamesIves/[email protected]
        with:
          branch: gh-pages
          folder: ${{github.workspace}}/build/website
---
install_doxygen_deps:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v2
    - uses: awalsh128/cache-apt-pkgs-action@latest
      with:
        packages: dia doxygen doxygen-doc doxygen-gui doxygen-latex graphviz mscgen
        version: 1.0

Caveats

Non-file Dependencies

This action is based on the principle that most packages can be cached as a fileset. There are situations though where this is not enough.

  • Pre and post installation scripts needs to be ran from /var/lib/dpkg/info/{package name}.[preinst, postinst].
  • The Debian package database needs to be queried for scripts above (i.e. dpkg-query).

The execute_install_scripts argument can be used to attempt to execute the install scripts but they are no guaranteed to resolve the issue.

- uses: awalsh128/cache-apt-pkgs-action@latest
  with:
    packages: mypackage
    version: 1.0
    execute_install_scripts: true

If this does not solve your issue, you will need to run apt-get install as a separate step for that particular package unfortunately.

run: apt-get install mypackage
shell: bash

Please reach out if you have found a workaround for your scenario and it can be generalized. There is only so much this action can do and can't get into the area of reverse engineering Debian package manager. It would be beyond the scope of this action and may result in a lot of extended support and brittleness. Also, it would be better to contribute to Debian packager instead at that point.

For more context and information see issue #57 which contains the investigation and conclusion.

Cache Limits

A repository can have up to 5GB of caches. Once the 5GB limit is reached, older caches will be evicted based on when the cache was last accessed. Caches that are not accessed within the last week will also be evicted. To get more information on how to access and manage your actions's caches, see GitHub Actions / Using workflows / Cache dependencies.

cache-apt-pkgs-action's People

Contributors

awalsh128 avatar bobotig avatar dpprdan avatar dunglas avatar hadrieng2 avatar jondo2010 avatar jroddev avatar koppor avatar lihop avatar natrinicle avatar pascallj avatar peterbowman avatar stevenh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

cache-apt-pkgs-action's Issues

`apt-cache show` fails on package that does exist (`libtk8.6`)

Package validation is currently done by using apt-cache show ${package}. However, on the latest version of the GitHub actions runner for Ubuntu, some packages (e.g., libtk8.6) are not visible to apt-cache until after an apt-get update.

This means that cache-apt-pkgs-action errors our during validation even though the package would successfully install after an apt-fast update.

Minimal reproducible example:

jobs:
  example-broken-job:
    name: example-broken-job
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          # Fetch the current and previous commits.
          fetch-depth: 2
          submodules: 'recursive'
      - name: Install apt dependencies for Bazel bootstrapping
        uses: awalsh128/cache-apt-pkgs-action@v1
        with:
          packages: libtk8.6
          version: 1.0

To reproduce the issue directly in a runner:

$ docker attach $(docker run --name github-actions-ubuntu-2 -d -i -t catthehacker/ubuntu:act-latest /bin/bash)
root@e6d223c9b85a:/tmp# apt-cache show libtk8.6
N: Unable to locate package libtk8.6
N: Couldn't find any package by glob 'libtk8.6'
N: Couldn't find any package by regex 'libtk8.6'
E: No packages found
root@e6d223c9b85a:/tmp# apt-get install libtk8.6
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package libtk8.6
E: Couldn't find any package by glob 'libtk8.6'
E: Couldn't find any package by regex 'libtk8.6'
root@e6d223c9b85a:/tmp# apt-get update
<SNIP>
root@e6d223c9b85a:/tmp# apt-cache show libtk8.6
Package: libtk8.6
Architecture: amd64
Version: 8.6.12-1build1
Multi-Arch: same
Priority: optional
Section: libs
Source: tk8.6
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Debian Tcl/Tk Packagers <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 2367
Provides: libtk
Depends: libtcl8.6 (>= 8.6.0-2), libc6 (>= 2.35), libfontconfig1 (>= 2.12.6), libx11-6, libxft2 (>> 2.1.1), libxss1
Suggests: tk8.6
Conflicts: libtk-img (<< 1.2.5), tk40 (<= 4.0p3-2), tk8.6 (<< 8.6.0-2)
Replaces: tk8.6 (<< 8.6.0-2)
Filename: pool/main/t/tk8.6/libtk8.6_8.6.12-1build1_amd64.deb
Size: 783834
MD5sum: 0b77eaf674cddbcf4be3ae5daf33a5da
SHA1: e915a51f975e2c9f9f06105500dd346f939edc73
SHA256: fd394fe34bce405d66079518f122917e434dc269315ed4125dc982d31a03684d
SHA512: ab375b502a641ee170f940fd8775aa0fc1033f5c499886bcc8d9fb06b3bf5da2cd53cc8de6b96abec898215b8de70ec741c2bfad3ae9af4a94d4647988efc064
Homepage: http://www.tcl.tk/
Description: Tk toolkit for Tcl and X11 v8.6 - run-time files
Description-md5: 01d90661559e5ce16fbf055f91aff291
Task: ubuntustudio-desktop

Debug input param doesn't disable/enable properly.

The workflow file related to this issue can be found at https://github.com/SlimeVR/SlimeVR-Server/actions/runs/3911317186/workflow
This workflow is being run on the ubuntu-20.04 container with awalsh128/cache-apt-pkgs-action@latest.

I'm unsure what the cause of this is, but you can see it at:

skip installing apt-fast on cache hit

Would it be possible to skip installing apt-fast if there is a cache hit? Maybe the installation can be moved to right before it's use in install_and_cache_pkgs?

Can be used with matrix strategy?

Hi,

I have setup my workflow where I have

strategy:
      matrix:
        version: ['${{ toJSON(github.ref) }}', latest]
    steps:
      - name: Clone Repository
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Install PCL
        uses: awalsh128/cache-apt-pkgs-action@v1
        with:
          packages: libpcl-dev
          version: 1.0

and I want to cache the libpcl-dev for both jobs, but it seems that one is canceling the other:

dd

dd2

Fails to install on self-hosted runners

When using the following on a self-hosted runner:

      - name: Install Packages
        uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: cmake curl gcc gnupg jq pkg-config python3-pip tar unzip zip zlib1g-dev
          version: 1.0

It fails with the following error messages:

root is not in the sudoers file.  This incident will be reported.
root is not in the sudoers file.  This incident will be reported.

On self-hosted the user is "runner" and it does have permission to call sudo. But I suspect on managed runners if you call sudo as root it allows it whilst on self-hosted it does not.

Because the following code seems to somehow call sudo twice on the apt_fast_installation method:

apt_fast_installation() {
  if ! type aria2c >/dev/null 2>&1; then
    sudo apt-get update
    sudo apt-get install -y aria2
  fi

  wget https://raw.githubusercontent.com/ilikenwf/apt-fast/master/apt-fast -O /usr/local/sbin/apt-fast
  chmod +x /usr/local/sbin/apt-fast
  if ! [[ -f /etc/apt-fast.conf ]]; then
    wget https://raw.githubusercontent.com/ilikenwf/apt-fast/master/apt-fast.conf -O /etc/apt-fast.conf
  fi
}

if [[ "$EUID" -eq 0 ]]; then
  apt_fast_installation
else
  type sudo >/dev/null 2>&1 || { echo "sudo not installed, change into root context" >&2; exit 1; }

  DECL="$(declare -f apt_fast_installation)"
  sudo bash -c "$DECL; apt_fast_installation"
fi'

Error with multiline packages using black scalar styles `>` and `|` in YAML.

      - name: Install dependencies for Ubuntu
        if: matrix.os == 'ubuntu-latest'
        uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: >
            libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev
            libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev
          version: 1.0

Error log:

For more detailed logs during the artifact upload process, enable step-debugging: https://docs.github.com/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging#enabling-step-debug-logging
Error: Artifact name is not valid: cache-apt-pkgs-logs%libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev
%1. Contains the following character:  Line feed \n
          
Invalid characters include:  Double quote ", Colon :, Less than <, Greater than >, Vertical bar |, Asterisk *, Question mark ?, Carriage return \r, Line feed \n, Backslash \, Forward slash /
          
These characters are not allowed in the artifact name due to limitations with certain file systems such as NTFS. To maintain file system agnostic behavior, these characters are intentionally not allowed to prevent potential problems with downloads on different file systems.

Version: 1.2.2 lastest

GitHub Actions can use the Folded Block Scalar syntax. But It seems failed in the latest version.

Package name and version not in the correct format for dpkg.

I try to install mplayer, but I got an error:

E: No packages found
10:58:36   * Caching libgbm-dev[22.0.1-1ubuntu2.1] to /home/runner/cache-apt-pkgs/libgbm-dev[22.0.1-1ubuntu2.1].tar.gz...
dpkg-query: error: --listfiles needs a valid package name but 'libgbm-dev[22.0.1-1ubuntu2.1]' is not: illegal package name in specifier 'libgbm-dev[22.0.1-1ubuntu2.1]': character '[' not allowed (only letters, digits and characters '-+._')

cache-apt-pkgs-action try to compress the package, but it is not possible, because the filename is not valid.
Other improvement what I suggest is use zstd compression. It is much faster and supported in hosted runners.:
actions/runner-images#89
You can use with: tar -caf package.tar.zst package-directory

Permission denied error during caching installed packages.

While attempting to cache redis-server

21:11:14   * Caching redis-server to /home/runner/cache-apt-pkgs/redis-server:5:5.0.7-2ubuntu0.1.tar.gz...
tar: etc/redis/redis.conf: Cannot open: Permission denied
tar: Exiting with failure status due to previous errors
Error: Process completed with exit code 123.

Full Log:
https://github.com/dj12djdjs/apt-cache-redis/runs/8101754369?check_suite_focus=true

Action:
https://github.com/dj12djdjs/apt-cache-redis/blob/main/.github/workflows/blank.yml

Migrate from apt to CLI safe alternatives

The action will report CLI instability warning messages.

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

This is because it isn't intended to be a non-interactive command. There are alternatives however as demonstrated in this StackExchange post. The scripts should get migrated eventually.

Multiline string for packages breaks everything

If you have a lot of packages and use a multiline string for the packages parameter the setup fails, because bash attempts top run the second line as a command.

Instead of directly using the GitHub action variable interpolation you should pass the parameters as environment variables in order to prevent breakage (and command injection):

runs:
  using: "composite"
  steps:
    - id: pre-cache
      run: |
        ${GITHUB_ACTION_PATH}/pre_cache_action.sh \
          ~/cache-apt-pkgs \
          "$VERSION" \
          "$EXEC_INSTALL_SCRIPTS" \
          "$DEBUG" \
          "$PACKAGES"
        echo "CACHE_KEY=$(cat ~/cache-apt-pkgs/cache_key.md5)" >> $GITHUB_ENV
      shell: bash
      env:
         VERSION: "${{ inputs.version }}"
         EXEC_INSTALL_SCRIPTS: "${{ inputs.execute_install_scripts }}"
         DEBUG: "${{ inputs.debug }}"
         PACKAGES: "${{ inputs.packages }}"

Change here:

- id: pre-cache
run: |
${GITHUB_ACTION_PATH}/pre_cache_action.sh \
~/cache-apt-pkgs \
"${{ inputs.version }}" \
"${{ inputs.execute_install_scripts }}" \
"${{ inputs.debug }}" \
${{ inputs.packages }}
echo "CACHE_KEY=$(cat ~/cache-apt-pkgs/cache_key.md5)" >> $GITHUB_ENV

- id: post-cache
run: |
${GITHUB_ACTION_PATH}/post_cache_action.sh \
~/cache-apt-pkgs \
/ \
"${{ steps.load-cache.outputs.cache-hit }}" \
"${{ inputs.execute_install_scripts }}" \
"${{ inputs.debug }}" \
${{ inputs.packages }}
function create_list { local list=$(cat ~/cache-apt-pkgs/manifest_${1}.log | tr '\n' ','); echo ${list:0:-1}; };
echo "package-version-list=$(create_list main)" >> $GITHUB_OUTPUT
echo "all-package-version-list=$(create_list all)" >> $GITHUB_OUTPUT
shell: bash

Note that simply adding " " around ${{ inputs.packages }} in the run command will still allow command injection if someone uses a " in the packages parameter. So using env vars is cleaner.

However, this then passes the packages as a single parameter, but since you then do this anyway it shouldn't matter (in fact make that simpler, since you merge it into a single string anyway):

input_packages="${@:5}"
# Trim commas, excess spaces, and sort.
packages="$(normalize_package_list "${input_packages}")"

packages="${@:6}"
if [ "$cache_hit" == true ]; then
${script_dir}/restore_pkgs.sh "${cache_dir}" "${cache_restore_root}" "${execute_install_scripts}" "${debug}"
else
${script_dir}/install_and_cache_pkgs.sh "${cache_dir}" "${debug}" ${packages}
fi

input_packages="${@:3}"
# Trim commas, excess spaces, and sort.
normalized_packages="$(normalize_package_list "${input_packages}")"

Suggestion: Add support for third-party PPA

It would be cool to be able to specify third-party PPAs as package sources in addition to the default sources.

Use case: installing (and caching) the chromium package (not the official snap one, some plain .deb)

This use-case requires:

  • sudo add-apt-repository ppa:<some ramdom ppa repo>
  • sudo apt update
  • sudo apt install chromium-browser

I guess that simply providing an additional "with" parameter add-repository: <repository> would be enough
and the action would then issue the relevant pre-flight commands cf above prior to the apt install

tar Cannot stat: No such file or directory

Hi,

I'm using cache-apt-pkgs-action (thanks for making it, by the way) like this:

    - uses: awalsh128/cache-apt-pkgs-action@latest
      with:
        packages: libsdl2-dev build-essential gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu ffmpeg
        version: 1.0

Lately it has been failing. The log ends like this:

10:20:18 Caching 153 installed packages...
10:20:18   * Caching libnss-systemd to /home/runner/cache-apt-pkgs/libnss-systemd:249.11-0ubuntu3.7.tar...
10:20:18     done (compressed size 320K).
10:20:18   * Caching libsystemd0 to /home/runner/cache-apt-pkgs/libsystemd0:249.11-0ubuntu3.7.tar...
10:20:18     done (compressed size 812K).
10:20:18   * Caching systemd-sysv to /home/runner/cache-apt-pkgs/systemd-sysv:249.11-0ubuntu3.7.tar...
10:20:18     done (compressed size 32K).
10:20:18   * Caching libpam-systemd to /home/runner/cache-apt-pkgs/libpam-systemd:249.11-0ubuntu3.7.tar...
10:20:18     done (compressed size 492K).
10:20:18   * Caching systemd to /home/runner/cache-apt-pkgs/systemd:249.11-0ubuntu3.7.tar...
tar: lib/systemd/system/system-systemdx2dcryptsetup.slice: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
Error: Process completed with exit code 123.

I have tried both latest (v1.2.4) and v1.2.1, and I get the same error in both cases. I have also tried execute_install_scripts: true

What can I do to resolve the issue?

Caching g++ dependencies.

In PR #11 it was mentioned by @jroddev that they were having trouble with g++ dependencies.

This fixed the "Package 'g++-11' not found." error in the cache action. However caching the newer g++ has proven difficult with all of its dependencies and I haven't been able to get it to work on the 2nd run.

@jroddev could you provide more details of the problem or perhaps the error scenario?

Cache fails with files with spaces?

Looks like tar is being passed a list of filenames un-quoted, so files with spaces in the filenames break it?

eg https://github.com/shish/rosettaboy/actions/runs/3849566460/jobs/6558711183

19:00:40 Caching 57 installed packages...
19:00:40   * Caching libjsoncpp25 to /home/runner/cache-apt-pkgs/libjsoncpp25:1.9.5-3.tar...
19:00:40     done (compressed size 232K).
19:00:40   * Caching librhash0 to /home/runner/cache-apt-pkgs/librhash0:1.4.2-1ubuntu1.tar...
19:00:40     done (compressed size 212K).
19:00:40   * Caching dh-elpa-helper to /home/runner/cache-apt-pkgs/dh-elpa-helper:2.0.9ubuntu1.tar...
19:00:40     done (compressed size 20K).
19:00:40   * Caching cmake-data to /home/runner/cache-apt-pkgs/cmake-data:3.22.1-1ubuntu1.22.04.1.tar...
tar: usr/share/cmake-3.22/Help/generator/Borland: Cannot stat: No such file or directory
tar: Makefiles.rst: Cannot stat: No such file or directory
tar: usr/share/cmake-3.22/Help/generator/Eclipse: Cannot stat: No such file or directory
tar: CDT4.rst: Cannot stat: No such file or directory
[...]

tar error with libboost-dev

I encountered the following issue when caching libboost-dev.
Have no idea why :(

21:53:06   * Caching libboost1.74-dev to /home/runner/cache-apt-pkgs/libboost1.74-dev:1.74.0-14ubuntu3.tar...
tar: usr/include/boost/serialization/collection_size_type: Cannot stat: No such file or directory
tar: copy.hpp: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
Error: Process completed with exit code 123.

Doesn't work on custom containers ubuntu18:04

Hello,
I'm unable to make this project working when using a custom container.
Here is an example yaml file:

name: Build

on:
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    container: ubuntu:18.04
    steps:
    - name: Install packages
      uses: awalsh128/cache-apt-pkgs-action@latest
      with:
        packages: ca-certificates build-essential
        version: 1.0

And here is the error:

Run awalsh128/cache-apt-pkgs-action@latest
  with:
    packages: ca-certificates build-essential
    version: 1
    refresh: false
Run /home/runner/work/_actions/awalsh128/cache-apt-pkgs-action/latest/pre_cache_action.sh \
  /home/runner/work/_actions/awalsh128/cache-apt-pkgs-action/latest/pre_cache_action.sh \
    ~/cache-apt-pkgs \
    "1" \
    ca-certificates build-essential
  echo "CACHE_KEY=$(cat ~/cache-apt-pkgs/cache_key.md5)" >> $GITHUB_ENV
  shell: bash --noprofile --norc -e -o pipefail {0}
/__w/_temp/4a9fd062-d58a-4c3d-ab50-128748bc2e9c.sh: line 2: /home/runner/work/_actions/awalsh128/cache-apt-pkgs-action/latest/pre_cache_action.sh: No such file or directory
Error: Process completed with exit code 127.

Could you help me in making it work with a custom container?
Thank you.

ffmpeg can't load LibVorbis shared library

Hi there,

I wanted to report a problem loading the LibVorbis shared library (details below.) Thanks for taking a look. Happy to try and provide more details as needed.

Our cache-apt-pkgs-action config was:

        - name: Install apt dependencies
          uses: awalsh128/cache-apt-pkgs-action@latest
          with:
            packages: libvips-tools ffmpeg mediainfo poppler-utils
            version: 1.0

(See sciencehistory/scihist_digicoll@4a4d80f )

The problem looks like this:

Running `ffmpeg -y -i /tmp/shrine20221130-3705-db66qh.flac -ac 1 -codec:a aac -b:a 64k /tmp/temp_deriv20221130-3705-e1b0o7.m4a` failed with
         exit status: 127
         stdout: Nothing written
         stderr: ffmpeg: error while loading shared libraries: libvorbis.so.0: cannot open shared object file: No such file or directory
     # ./app/uploaders/asset_uploader.rb:103:in `block in <class:AssetUploader>'
     # ./spec/models/asset/derivatives_spec.rb:45:in `block (4 levels) in <main>'

Verifying packages is slow

We tried this action to improve our apt install performance in our workflows and once cached it was often actually slower than just performing the apt-get install.

I did a bit of digging and the main delay was "Verifying packages" process which is taking about 0.7s per package listed.

Testing locally apt-cache show ${package} is ~40ms where as on github is ~700ms.

Given this and the current flow we could be spending ~1.4s per package just calling apt-cache show.

Error when some of the dependencies are already installed

Hello, thanks for the super useful repo!

I have an issue when caching the libgtk-3-dev package on Ubuntu 22.04, excerpt from my workflow:

jobs:
  build:
    runs-on: ubuntu-22.04

    steps:
    - uses: actions/checkout@v3
    - uses: awalsh128/[email protected]
      with:
          packages: libgtk-3-dev

Here is the error log:

...
09:49:08   * Caching libharfbuzz-gobject0 to /home/runner/cache-apt-pkgs/libharfbuzz-gobject0:2.7.4-1ubuntu3.1.tar.gz...
09:49:08     done (compressed size 28K).
09:49:08   * Caching libharfbuzz-icu0 to /home/runner/cache-apt-pkgs/libharfbuzz-icu0:2.7.4-1ubuntu3.1.tar.gz...
09:49:08     done (compressed size 8.0K).
E: Regex compilation error - Invalid range end
E: No packages found
09:49:08   * Caching libharfbuzz0b[2.7.4-1ubuntu3] to /home/runner/cache-apt-pkgs/libharfbuzz0b[2.7.4-1ubuntu3].tar.gz...
dpkg-query: error: --listfiles needs a valid package name but 'libharfbuzz0b[2.7.4-1ubuntu3]' is not: illegal package name in specifier 'libharfbuzz0b[2.7.4-1ubuntu3]': character '[' not allowed (only letters, digits and characters '-+._')
Use --help for help about querying packages.
tar: Cowardly refusing to create an empty archive
Try 'tar --help' or 'tar --usage' for more information.
Error: Process completed with exit code 123.

I believe the get_dep_packages function will have to be updated to better handle the output from apt --dry-run. Here is what I get when running apt install --dry-run --yes libgtk-3-dev | grep "^Inst" | grep harfbuzz:

Inst libharfbuzz0b [2.7.4-1ubuntu3] (2.7.4-1ubuntu3.1 Ubuntu:22.04/jammy-updates, Ubuntu:22.04/jammy-security [amd64])
Inst gir1.2-harfbuzz-0.0 (2.7.4-1ubuntu3.1 Ubuntu:22.04/jammy-updates, Ubuntu:22.04/jammy-security [amd64])
Inst libharfbuzz-icu0 (2.7.4-1ubuntu3.1 Ubuntu:22.04/jammy-updates, Ubuntu:22.04/jammy-security [amd64])
Inst libharfbuzz-gobject0 (2.7.4-1ubuntu3.1 Ubuntu:22.04/jammy-updates, Ubuntu:22.04/jammy-security [amd64])
Inst libharfbuzz-dev (2.7.4-1ubuntu3.1 Ubuntu:22.04/jammy-updates, Ubuntu:22.04/jammy-security [amd64])

See the extra version number in square brackets on line 1 which means that there is already a 2.7.4-1ubuntu3 version of the libharfbuzz0b package installed and it will be replaced by the 2.7.4-1ubuntu3.1 version.

The other dependencies are fresh installs, so awk '{print $2 $3}' works fine to extract the version number.

Failing to correctly recover LaTeX packages

I tried to use this action to cache LaTeX packages:

      - uses: awalsh128/[email protected]
        with:
          packages: texlive-latex-base  # and other LaTeX packages
          version: 1.0

An example repository is here. Storing cache (~61M) seems to work (log), but in the next commit, restoring the cache causes the subsequent step to fail (log):

Run pdflatex test.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex)
 restricted \write18 enabled.

kpathsea: Running mktexfmt pdflatex.fmt
mktexfmt: mktexfmt is using the following fmtutil.cnf files (in precedence order):
mktexfmt: mktexfmt is using the following fmtutil.cnf file for writing changes:
mktexfmt:   /home/runner/.texlive2019/texmf-config/web2c/fmtutil.cnf
mktexfmt [INFO]: writing formats under /home/runner/.texlive2019/texmf-var/web2c
mktexfmt [INFO]: did not find entry for byfmt=pdflatex, skipped
mktexfmt [INFO]: total formats: 0
mktexfmt [INFO]: exiting with status 0
I can't find the format file `pdflatex.fmt'!
Error: Process completed with exit code 1.

which sounds like some post-install processes might be omitted or performed in an incompatible way.

Additional repo / tar: Cowardly refusing to create an empty archive

Hi,
Thanks for creating this, it looks like it could really speed up our unit tests.

The slowest install we have is from a non-standard repo, and (maybe because of this?) the caching script runs into an error. The final lines shown are:

tar: Cowardly refusing to create an empty archive
Try 'tar --help' or 'tar --usage' for more information.
Error: Process completed with exit code 123.

A full log is here: https://github.com/myokit/myokit/actions/runs/3707556270/jobs/6284113435

Any help with this would be much appreciated

Failing on v1.2.4

pyvista/pyvista#3964 has failed since the release of v1.2.4

The logs aren't clear. Do you have any suggestions?

I've even updated the cache version, but the issue persists:

      - uses: awalsh128/[email protected]
        with:
          packages: libosmesa6-dev libgl1-mesa-dev python3-tk pandoc git-restore-mtime
          version: 3.1

Full GitHub action log:

2023-02-23T04:04:22.4117825Z Cache not found for input keys: cache-apt-pkgs_19984b10668ecdf6d9ff65268c47d6f4
2023-02-23T04:04:22.4196895Z ##[group]Run ${GITHUB_ACTION_PATH}/post_cache_action.sh \
2023-02-23T04:04:22.4197246Z ๏ฟฝ[36;1m${GITHUB_ACTION_PATH}/post_cache_action.sh \๏ฟฝ[0m
2023-02-23T04:04:22.4197514Z ๏ฟฝ[36;1m  ~/cache-apt-pkgs \๏ฟฝ[0m
2023-02-23T04:04:22.4197724Z ๏ฟฝ[36;1m  / \๏ฟฝ[0m
2023-02-23T04:04:22.4197928Z ๏ฟฝ[36;1m  "$CACHE_HIT" \๏ฟฝ[0m
2023-02-23T04:04:22.4198147Z ๏ฟฝ[36;1m  "$EXEC_INSTALL_SCRIPTS" \๏ฟฝ[0m
2023-02-23T04:04:22.4198368Z ๏ฟฝ[36;1m  "$DEBUG" \๏ฟฝ[0m
2023-02-23T04:04:22.4198569Z ๏ฟฝ[36;1m  "$PACKAGES"๏ฟฝ[0m
2023-02-23T04:04:22.4198902Z ๏ฟฝ[36;1mfunction create_list { local list=$(cat ~/cache-apt-pkgs/manifest_${1}.log | tr '\n' ','); echo ${list:0:-1}; };๏ฟฝ[0m
2023-02-23T04:04:22.4199312Z ๏ฟฝ[36;1mecho "package-version-list=$(create_list main)" >> $GITHUB_OUTPUT๏ฟฝ[0m
2023-02-23T04:04:22.4199687Z ๏ฟฝ[36;1mecho "all-package-version-list=$(create_list all)" >> $GITHUB_OUTPUT๏ฟฝ[0m
2023-02-23T04:04:22.4251852Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
2023-02-23T04:04:22.4252117Z env:
2023-02-23T04:04:22.4252307Z   USE_CACHE: true
2023-02-23T04:04:22.4252519Z   PYVISTA_OFF_SCREEN: True
2023-02-23T04:04:22.4252732Z   ALLOW_PLOTTING: true
2023-02-23T04:04:22.4252958Z   SHELLOPTS: errexit:pipefail
2023-02-23T04:04:22.4253244Z   pythonLocation: /opt/hostedtoolcache/Python/3.11.2/x64
2023-02-23T04:04:22.4253581Z   PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.11.2/x64/lib/pkgconfig
2023-02-23T04:04:22.4253914Z   Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.2/x64
2023-02-23T04:04:22.4254221Z   Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.2/x64
2023-02-23T04:04:22.4254512Z   Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.11.2/x64
2023-02-23T04:04:22.4254812Z   LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.11.2/x64/lib
2023-02-23T04:04:22.4255101Z   CACHE_KEY: 19984b10668ecdf6d9ff65268c47d6f4
2023-02-23T04:04:22.4255332Z   CACHE_HIT: 
2023-02-23T04:04:22.4255537Z   EXEC_INSTALL_SCRIPTS: false
2023-02-23T04:04:22.4255737Z   DEBUG: false
2023-02-23T04:04:22.4256031Z   PACKAGES: libosmesa6-dev libgl1-mesa-dev python3-tk pandoc git-restore-mtime
2023-02-23T04:04:22.4256331Z ##[endgroup]
2023-02-23T04:04:22.4533360Z 04:04:22 Clean installing and caching 5 package(s).
2023-02-23T04:04:22.4533890Z 
2023-02-23T04:04:22.4548222Z 04:04:22 Package list:
2023-02-23T04:04:23.3899420Z 04:04:23 - git-restore-mtime:2019.11-1
2023-02-23T04:04:24.3396939Z 04:04:24 - libgl1-mesa-dev:21.2.6-0ubuntu0.1~20.04.2
2023-02-23T04:04:25.2882823Z 04:04:25 - libosmesa6-dev:21.2.6-0ubuntu0.1~20.04.2
2023-02-23T04:04:26.2314942Z 04:04:26 - pandoc:2.5-3build2
2023-02-23T04:04:27.1877056Z 04:04:27 - python3-tk:3.8.10-0ubuntu1~20.04
2023-02-23T04:04:27.1893390Z 04:04:27 Writing main packages manifest to /home/runner/cache-apt-pkgs/manifest_main.log...
2023-02-23T04:04:27.1926396Z 04:04:27 done
2023-02-23T04:04:27.1926753Z 
2023-02-23T04:04:27.1938873Z 04:04:27 Installing apt-fast for optimized installs...
2023-02-23T04:04:27.4080136Z --2023-02-23 04:04:27--  https://raw.githubusercontent.com/ilikenwf/apt-fast/master/apt-fast
2023-02-23T04:04:27.4100122Z Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.108.133, ...
2023-02-23T04:04:27.4154282Z Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
2023-02-23T04:04:27.4340820Z HTTP request sent, awaiting response... 200 OK
2023-02-23T04:04:27.4341357Z Length: 22293 (22K) [text/plain]
2023-02-23T04:04:27.4342593Z Saving to: โ€˜/usr/local/sbin/apt-fastโ€™
2023-02-23T04:04:27.4342979Z 
2023-02-23T04:04:27.4346610Z      0K .......... .......... .                               100% 49.2M=0s
2023-02-23T04:04:27.4346948Z 
2023-02-23T04:04:27.4389612Z 2023-02-23 04:04:27 (49.2 MB/s) - โ€˜/usr/local/sbin/apt-fastโ€™ saved [22293/22293]
2023-02-23T04:04:27.4389934Z 04:04:27 done
2023-02-23T04:04:27.4390060Z 
2023-02-23T04:04:27.4411022Z 04:04:27 Updating APT package list...
2023-02-23T04:04:27.4441533Z 
2023-02-23T04:04:35.6507190Z 04:04:35 done
2023-02-23T04:04:35.6507682Z 
2023-02-23T04:04:35.6520948Z 04:04:35 Clean installing 5 packages...
2023-02-23T04:04:45.5248044Z 04:04:45 done
2023-02-23T04:04:45.5261864Z 04:04:45 Installation log written to /home/runner/cache-apt-pkgs/install.log
2023-02-23T04:04:45.5262307Z 
2023-02-23T04:04:45.5328500Z 04:04:45 Installed package list:
2023-02-23T04:04:45.5340817Z 04:04:45 - tk8.6-blt2.5:2.5.3+dfsg-4
2023-02-23T04:04:45.5351883Z 04:04:45 - blt:2.5.3+dfsg-4
2023-02-23T04:04:45.5367027Z 04:04:45 - git-restore-mtime:2019.11-1
2023-02-23T04:04:45.5378464Z 04:04:45 - libegl-mesa0:21.2.6-0ubuntu0.1~20.04.2
2023-02-23T04:04:45.5392348Z 04:04:45 - libegl1:1.3.2-1~ubuntu0.20.04.2
2023-02-23T04:04:45.5406398Z 04:04:45 - libglx-dev:1.3.2-1~ubuntu0.20.04.2
2023-02-23T04:04:45.5419414Z 04:04:45 - libgl-dev:1.3.2-1~ubuntu0.20.04.2
2023-02-23T04:04:45.5431678Z 04:04:45 - libegl-dev:1.3.2-1~ubuntu0.20.04.2
2023-02-23T04:04:45.5444330Z 04:04:45 - libgles1:1.3.2-1~ubuntu0.20.04.2
2023-02-23T04:04:45.5456563Z 04:04:45 - libgles2:1.3.2-1~ubuntu0.20.04.2
2023-02-23T04:04:45.5468997Z 04:04:45 - libgles-dev:1.3.2-1~ubuntu0.20.04.2
2023-02-23T04:04:45.5481713Z 04:04:45 - libopengl0:1.3.2-1~ubuntu0.20.04.2
2023-02-23T04:04:45.5493905Z 04:04:45 - libopengl-dev:1.3.2-1~ubuntu0.20.04.2
2023-02-23T04:04:45.5506185Z 04:04:45 - pandoc-data:2.5-3build2
2023-02-23T04:04:45.5518513Z 04:04:45 - pandoc:2.5-3build2
2023-02-23T04:04:45.5530823Z 04:04:45 - python3-tk:3.8.10-0ubuntu1~20.04
2023-02-23T04:04:45.5543220Z 04:04:45 - libglvnd-dev:1.3.2-1~ubuntu0.20.04.2
2023-02-23T04:04:45.5555537Z 04:04:45 - libgl1-mesa-dev:21.2.6-0ubuntu0.1~20.04.2
2023-02-23T04:04:45.5567793Z 04:04:45 - libosmesa6:21.2.6-0ubuntu0.1~20.04.2
2023-02-23T04:04:45.5582539Z 04:04:45 - libosmesa6-dev:21.2.6-0ubuntu0.1~20.04.2
2023-02-23T04:04:45.5582733Z 
2023-02-23T04:04:45.5613468Z 04:04:45 Caching 20 installed packages...
2023-02-23T04:04:45.5635013Z 04:04:45   * Caching tk8.6-blt2.5 to /home/runner/cache-apt-pkgs/tk8.6-blt2.5:2.5.3+dfsg-4.tar...
2023-02-23T04:04:45.6221798Z ##[error]Process completed with exit code 1.

Cache Service Failing

Ran this like every other day, might've been my 5th or 6th time for today.
This only happened right now, Cache service responded with 503.

  • Is it this action's issue or does this issue belong someplace else?

Some info from build process:

    > Run awalsh128/[email protected]
    > Run /home/runner/work/_actions/awalsh128/cache-apt-pkgs-action/v1.0.1/pre_cache_action.sh \
    Validating action arguments (version='', packages='openjdk-11-jdk')...done.
    Verifying packages...done.
    Creating cache key...
    - Normalized package list is 'openjdk-11-jdk '.
    - Value to hash is 'openjdk-11-jdk @'.
    - Value hashed as '167ce49116dfc5b382b84fddb301067b'.
    done.
    Hash value written to /home/runner/cache-apt-pkgs/cache_key.md5
    > Run actions/cache@v2
    **Warning**: getCacheEntry failed: Cache service responded with 503
    Run /home/runner/work/_actions/awalsh128/cache-apt-pkgs-action/v1.0.1/post_cache_action.sh \
    Clean installing and caching 1 package(s).
    Package list:
    - openjdk-11-jdk
    Updating APT package list...done.
    Clean installing and caching 1 packages...
    - openjdk-11-jdk
      Installing...done.
      Caching to /home/runner/cache-apt-pkgs/openjdk-11-jdk.tar.gz...done.
    done.
    Writing package manifest to /home/runner/cache-apt-pkgs/manifest.log...done.

    Post job cleanup.
    Post job cleanup.
    **Warning**: reserveCache failed: Cache service responded with 503

How I generally use the action:

    uses: awalsh128/[email protected]
        with:
          packages: openjdk-11-jdk

Edit:

I ran the action again, there is definitely something wrong.

There goes my Actions minutes ๐Ÿ˜†

Cache symlinks for pkgs

Hi, I am trying to capture ghostscript and almost everything is going perfect, with the only detail of a symbolic link that is not restored from the cache.

I run the solution manually (no problem), but it would be great if this didn't happen. As an example I have this test repo cache-apt-gs.

With the following configuration file:

name: Test cache-ghostscript

on:
  push:
    branches:
      - "*"
  pull_request:

jobs:
  using-apt-fast:
    runs-on: ubuntu-latest
    env:
      DEBIAN_FRONTEND: noninteractive
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 1
      - name: Update sources and install ghostscript
        run: >
         sudo apt-fast -y update < /dev/null > /dev/null && sudo apt-fast -y install --no-install-recommends ghostscript < /dev/null > /dev/null

         gsicclink=/usr/share/ghostscript/$(gs --version)/iccprofiles

         if readlink -e "$gsicclink"; then
            echo $gsicclink is a symlink
         else
            echo $gsicclink is not a symlink
         fi

  cache-apt-pkgs:
    runs-on: ubuntu-latest
    env:
      DEBIAN_FRONTEND: noninteractive
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 1
      - name: Update sources and install ghostscript
        uses: awalsh128/[email protected]
        with:
          packages: fonts-urw-base35 libgs9-common libijs-0.35 libjbig2dec0 libopenjp2-7 libgs9 ghostscript
          version: 1.0
          refresh: true
      # libgs9-common creates a symlink from /usr/share/ghostscript, but silently fails to create
      - run: >
         gsicclink=/usr/share/ghostscript/$(gs --version)/iccprofiles

         if readlink -e "$gsicclink"; then
            echo $gsicclink is a symlink
         else
            echo $gsicclink is not a symlink
         fi

get for using-apt-fast:

/usr/share/ghostscript/9.50/iccprofiles is a symlink

get for cache-apt-pkgs:

/usr/share/ghostscript/9.50/iccprofiles is not a symlink

Thanks for the great work
Regards

Cache is installed on first run, not available when restored

Hi. In https://github.com/yandex/ch-tools we use your action. The issue follows:

  1. Cache is successfully installed on first run. It's used (example run https://github.com/yandex/ch-tools/actions/runs/5554305954/jobs/10143948024, "prepare build deb" and "build deb" steps).
  2. On next run, cache is loaded, but entries in the cache are not available (example run https://github.com/yandex/ch-tools/actions/runs/5558780469/jobs/10154259919, same steps).
  3. We use the following action:
      uses: awalsh128/[email protected]
      with:
        packages: "python3-venv debhelper devscripts"
        version: 1
        execute_install_scripts: true

Tried using "latest" without "version" and "execute_", same situation.
4. In logs I see

2023-07-14T22:31:09.1226091Z 22:31:09 - debhelper=12.10ubuntu1.tar
2023-07-14T22:31:09.5310273Z 22:31:09 Reading from main requested packages manifest...
2023-07-14T22:31:09.5362700Z 22:31:09 - debhelper=13.6ubuntu1~bpo20.04.1
2023-07-14T22:31:09.5831281Z 22:31:09 - debhelper=12.10ubuntu1.tar restoring...
2023-07-14T22:31:09.6188311Z 22:31:09   done

So target package is restored but isn't available.

Issue can be reproduced on a test repository: https://github.com/myrrc/apt-cache-restore-test (see last 2 commits).

debhelper:
  Installed: (none)

(while restoring from cache)

tar: Cowardly refusing to create an empty archive

Hello!

I recently set up a workflow to install and cache some APT packages before testing my project. Unfortunately once I introduced the cache-apt-pkgs-action step, the action fails with the following message:

tar: Cowardly refusing to create an empty archive
Try 'tar --help' or 'tar --usage' for more information.
Error: Process completed with exit code 123.

This occurs during the package caching step.

This seems like a duplicate of #76, but I'm using the v1 tag of the action which supposedly includes the fix.
Did I miss something?

validate_bool used before including the library

Currently, the action leads to the following (harmless) error message:

/home/runner/work/_actions/awalsh128/cache-apt-pkgs-action/v1/pre_cache_action.sh: line 6: validate_bool: command not found

Perhaps, validate_bool "${debug}" debug 1 in pre_cache_action:

# Debug mode for diagnosing issues.
# Setup first before other operations.
debug="${4}"
validate_bool "${debug}" debug 1
test ${debug} == "true" && set -x
# Include library.
script_dir="$(dirname -- "$(realpath -- "${0}")")"
source "${script_dir}/lib.sh"

can be delayed after lib.sh has been included.

Validating action arguments error

I'm getting an error with just:

      - uses: awalsh128/cache-apt-pkgs-action@v1
        with:
          packages: libosmesa6-dev libgl1-mesa-dev python3-tk pandoc git-restore-mtime
          version: 1.0

Any idea what I'm doing wrong? Seems like it's correct. It fails with or without refresh.

Output from https://github.com/pyvista/pyvista/runs/7330225499?check_suite_focus=true:

...
2022-07-13T22:12:17.4876544Z ##[endgroup]
2022-07-13T22:12:17.6304815Z Validating action arguments (version='1', packages='libosmesa6-dev libgl1-mesa-dev python3-tk pandoc git-restore-mtime')...
2022-07-13T22:12:17.6331746Z ##[error]Process completed with exit code 1.
2022-07-13T22:12:17.6549645Z Post job cleanup.
...

Cannot install openjdk-11 due to permissions issue

Hi,

Following stanza:

    - name: Cache Debian packages (cache version 1.0)
      uses: awalsh128/cache-apt-pkgs-action@latest
      with:
        packages:  openjdk-11-jre
        version: 1.0

will fail with permissions error during certificate installation

Failed to cache package ca-certificates-java

 11:16:56 Caching 157 installed packages...
11:16:56   * Caching fonts-droid-fallback to /home/runner/cache-apt-pkgs/fonts-droid-fallback:1:6.0.1r16-1.1.tar.gz...
11:16:57     done (compressed size 3.7M).
11:16:57   * Caching poppler-data to /home/runner/cache-apt-pkgs/poppler-data:0.4.9-2.tar.gz...
11:16:58     done (compressed size 4.0M).
11:16:58   * Caching libpcsclite1 to /home/runner/cache-apt-pkgs/libpcsclite1:1.8.26-3.tar.gz...
11:16:58     done (compressed size 24K).
11:16:58   * Caching openjdk-11-jre-headless to /home/runner/cache-apt-pkgs/openjdk-11-jre-headless:11.0.17+8-1ubuntu2~20.04.tar.gz...
11:17:06     done (compressed size 57M).
11:17:06   * Caching default-jre-headless to /home/runner/cache-apt-pkgs/default-jre-headless:2:1.11-72.tar.gz...
11:17:06     done (compressed size 4.0K).
11:17:06   * Caching ca-certificates-java to /home/runner/cache-apt-pkgs/ca-certificates-java:20190405ubuntu1.tar.gz...
tar: etc/default/cacerts: Cannot open: Permission denied
tar: Exiting with failure status due to previous errors
Error: Process completed with exit code 123.

See: https://github.com/SilverRainZ/bullet/actions/runs/3494642450/jobs/5854329890

Uses deprecated github `set-output` command

Following shows up in output for step using this action.

Warning: The set-output command is deprecated and will be disabled soon. Please upgrade to using Environment Files. For more information see: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

At first I suspected you were using an old version of actions/cache, which would trigger this warning. But no, it looks like you are using current actions/cache@v3

However, you are maybe actually directly calling set-output?

echo "::set-output name=package-version-list::$(create_list main)"
echo "::set-output name=all-package-version-list::$(create_list all)"

It seems like you will have to change this implementation to avoid the deprecation warnings, and keep working once the set-output command is "disabled soon"?

Looks like technically "soon" is actually about 6 months probably:

We are monitoring telemetry for the usage of these commands and plan to fully disable them on 31st May 2023. Starting 1st June 2023 workflows using save-state or set-output commands via stdout will fail with an error.

โ€” https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

cut binary path in ubuntu image is different from pre cache script

Problem

Hi,
I tried to use this action to install packages but it throws me an error because the cut command declared here is different from the one set up in the ubuntu-18.04 image I use for my workflows.

When I run command -v cut inside my workflow it displays this : /usr/bin/cut instead of /bin/cut

Solution

Add the $(command -v cut) in the pre_cache_action.sh instead of /bin/cut to ensure that the binary will always be called from the correct path no matter the distro.

Improperly caching libnewlib-arm-none-eabi

Please read about the limitation of non-file dependencies before filing an issue.

It appears that this package isn't being properly cached. Build succeeds without cache, fails on subsequent runs with the error of inttypes.h: file not found, which indicates that newlib wasn't properly restored.

Issue upgrading to 1.2.2

We're seeing failures when upgrading to 1.2.2 in pyvista/pyvista#3773

If this is related to caching, is there a way you could reset the cache for new versions? That way dependabot PRs don't instantly fail.

Workflow traceback:

09:10:18 Reading from main requested packages manifest...
09:10:18 - git-restore-mtime 2019.11-1
09:10:18 - libgl1-mesa-dev 21.2.6-0ubuntu0.1~20.04.2
09:10:18 - libosmesa6-dev 21.2.6-0ubuntu0.1~20.04.2
09:10:18 - pandoc 2.5-3build2
09:10:18 - python3-tk 3.8.10-0ubuntu1~20.04
09:10:18 done

ls: cannot access '/home/runner/cache-apt-pkgs/*.tar': No such file or directory

APT package restore for QEMU packages isn't working

Example here:

Workflow: https://github.com/crdoconnor/apt-cache-bug/blob/main/.github/workflows/example.yml

Actions: https://github.com/crdoconnor/apt-cache-bug/actions

There are 3 runs of the github actions. First is an expected failure. Second is an expected pass (apt-get install fixes the issue).

Third is an unexpected failure - the cache restore should restore everything as before, but it doesn't quite seem to. It might be missing some files, I guess?

Anyway, very grateful for any help you could provide.

Cache contains all packages if used multiple times

In some workflows I only need a subset of packages while in others I need the full suite. So in order to only install the minimum amount of packages I used the action twice in one job. However if this job misses the cache and is the first one to save, both the keys will contain all installed packages.

For example, in one run I might need:

- uses: awalsh128/cache-apt-pkgs-action@v1
  with:
    packages: foo bar

while in another I need:

- uses: awalsh128/cache-apt-pkgs-action@v1
  with:
    packages: foo bar
- uses: awalsh128/cache-apt-pkgs-action@v1
  with:
    packages: baz

If the latter runs first and caches the packages then the cache now contains all (foo, bar and baz) packages under two different keys.

So even if I only need foo and bar, baz will also be installed.

Is this intended behavior?

"Packages argument cannot be empty." even if `PACKAGES` is set.

I ran following

      - name: Setup ctanify requirements
        uses: awalsh128/cache-apt-pkgs-action@latest
        with:
          packages: libfile-copy-recursive-perl
          debug: true
          version: 1.0

I get following output

 ${GITHUB_ACTION_PATH}/pre_cache_action.sh \
    ~/cache-apt-pkgs \
    "$VERSION" \
    "$EXEC_INSTALL_SCRIPTS" \
    "$DEBUG" \
    "$PACKAGES"
  echo "CACHE_KEY=$(cat ~/cache-apt-pkgs/cache_key.md5)" >> $GITHUB_ENV
  shell: bash --noprofile --norc -e -o pipefail {0}
  env:
    VERSION: 1
    EXEC_INSTALL_SCRIPTS: false
    DEBUG: true
    PACKAGES: libfile-copy-recursive-perl
realpath: --: No such file or directory
+ cache_dir=/github/home/cache-apt-pkgs
+ version=1
+ execute_install_scripts=false
+ debug=true
+ input_packages=libfile-copy-recursive-perl
++ get_normalized_package_list libfile-copy-recursive-perl
+++ echo libfile-copy-recursive-perl
+++ sed 's/[,\]/ /g; s/\s\+/ /g; s/^\s\+//g; s/\s\+$//g'
+++ sort '-t '
++ packages=libfile-copy-recursive-perl
++ log_err 'resolving package versions...'
+++ date +%T.%3N
++ echo 19:46:34. 'resolving package versions...'
19:46:34. resolving package versions...
+++ apt-cache --quiet=0 --no-all-versions show libfile-copy-recursive-perl
+++ grep -E '^(Package|Version|N):'
++ data=
++ log_err resolved
+++ date +%T.%3N
++ echo 19:46:34. resolved
19:46:34. resolved
++ local 'ORIG_IFS= 	
'
++ IFS='
'
++ declare -A missing
++ local package_versions=
++ local package= separator=
++ IFS=' 	
'
++ '[' 0 -gt 0 ']'
++ echo ''
+ packages=
+ mkdir -p /github/home/cache-apt-pkgs
+ log 'Validating action arguments (version='\''1'\'', packages='\'''\'')...'
++ date +%T.%3N
+ echo 19:46:34. 'Validating action arguments (version='\''1'\'', packages='\'''\'')...'
19:46:34. Validating action arguments (version='1', packages='')...
+ grep -q ' '
+ test -z ''
+ log aborted
++ date +%T.%3N
+ echo 19:46:34. aborted
19:46:34. aborted
+ log 'Packages argument cannot be empty.'
++ date +%T.%3N
+ echo 19:46:34. 'Packages argument cannot be empty.'
19:46:34. Packages argument cannot be empty.
+ exit 3

Why does it say

    PACKAGES: libfile-copy-recursive-perl

But fails with

19:46:34. Packages argument cannot be empty.

On a random Ubuntu machine, the output of apt-cache show is as follows

# apt-cache --quiet=0 --no-all-versions show libfile-copy-recursive-perl
Package: libfile-copy-recursive-perl
Architecture: all
Version: 0.45-1
Priority: optional
Section: universe/perl
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Debian Perl Group <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 48
Depends: perl
Filename: pool/universe/libf/libfile-copy-recursive-perl/libfile-copy-recursive-perl_0.45-1_all.deb
Size: 17252
MD5sum: 162971ea438eefd47fa3a6740ed482a2
SHA1: 01895634a8c4c527686de7a222463dc00e48e3ae
SHA256: e8878ff9eb1f84026daa5186f9c75fb3e2b8730775748eb834dd357e6abe3f64
SHA512: 09061b4b3a0a4d9f454902d84d3d86d6a3a34004224b01e4f2e6f7531dc9da757013f3314cfc683bdc9aeac99466e56f9b524ad63e54c7c2852405ac771ce988
Homepage: https://metacpan.org/release/File-Copy-Recursive
Description-en: Perl extension for recursively copying files and directories
 File::Copy::Recursive module copies and moves directories recursively
 (or single files, well... singley) to an optional depth and attempts
 to preserve each file or directory's mode.
Description-md5: a107442d1b00e794c7a17b73e1706430

The requested package exists: https://packages.debian.org/buster/libfile-copy-recursive-perl


PR is gi-ev/biblatex-lni#22


There should be at least some hint in the README.md what to do if "Packages argument cannot be empty." is shown.

Improve input description formatting.

Currently the description is in a single long line. It can be formatted better and with newlines if block scalar folding style is used.

description: >
  foo
  bar baz

Cache as root?

There is a failed action. It said 'tar: etc/default/cacerts: Cannot open: Permission denied'.
So, sudo?

Dependencies of mentioned packages are not being cached?

Hi. I am using your apt action to cache my apt dependencies in my repo https://github.com/matinlotfali/KDE-Rounded-Corners
I noticed that when I list my packages in the yml file like this:

    - name: Cache APT Packages
      uses: awalsh128/[email protected]
      with:
        packages: gettext extra-cmake-modules qttools5-dev libqt5x11extras5-dev libkf5configwidgets-dev libkf5crash-dev libkf5globalaccel-dev libkf5kio-dev libkf5notifications-dev kinit-dev kwin-dev
        version: 20.04
        refresh: true

It successfully installs them and then reports that it has saved only 2 MB in the post job. But I believe installing these packages will include around 300 MB of dependencies that are not being kept in the cache and the list is too long to include all of them (It would be the whole Kubuntu installation).

As a result, the next time the action is run, it reuses the cache and because dependencies are not met, the build fails in the CMAKE.

Handle spaces in filenames

Hello, when I try to install alsa-ucm-conf I get this error

| 02:32:03   * Caching alsa-ucm-conf to /root/cache-apt-pkgs/alsa-ucm-conf:1.2.6.3-1ubuntu1.1.tar...
| tar: usr/share/alsa/ucm2/NXP/iMX8/Librem_5_Devkit/Librem: Cannot stat: No such file or directory
| tar: 5: Cannot stat: No such file or directory
| tar: Devkit.conf: Cannot stat: No such file or directory
| tar: usr/share/alsa/ucm2/conf.d/simple-card/Librem: Cannot stat: No such file or directory
| tar: 5: Cannot stat: No such file or directory
| tar: Devkit.conf: Cannot stat: No such file or directory
| tar: usr/share/alsa/ucm2/conf.d/tegra/ASUS: Cannot stat: No such file or directory
| tar: Google: Cannot stat: No such file or directory
| tar: Nexus: Cannot stat: No such file or directory
| tar: 7: Cannot stat: No such file or directory
| tar: ALC5642.conf: Cannot stat: No such file or directory
| tar: usr/share/alsa/ucm2/conf.d/tegra/Acer: Cannot stat: No such file or directory
| tar: Iconia: Cannot stat: No such file or directory
| tar: Tab: Cannot stat: No such file or directory
| tar: A500: Cannot stat: No such file or directory
| tar: WM8903.conf: Cannot stat: No such file or directory
| tar: usr/share/alsa/ucm2/conf.d/tegra/Compal: Cannot stat: No such file or directory
| tar: PAZ00.conf: Cannot stat: No such file or directory
| tar: Exiting with failure status due to previous errors

This package contains the following files:

/usr
/usr/share
/usr/share/alsa
/usr/share/alsa/ucm
/usr/share/alsa/ucm/README.md
/usr/share/alsa/ucm2
/usr/share/alsa/ucm2/HDA
/usr/share/alsa/ucm2/HDA/DualCodecs
/usr/share/alsa/ucm2/HDA/DualCodecs/DualCodecs.conf
/usr/share/alsa/ucm2/HDA/DualCodecs/HiFi.conf
/usr/share/alsa/ucm2/HDA/HDA-Capture-value.conf
/usr/share/alsa/ucm2/HDA/HDA.conf
/usr/share/alsa/ucm2/HDA/Hdmi.conf
/usr/share/alsa/ucm2/HDA/HiFi-acp.conf
/usr/share/alsa/ucm2/HDA/HiFi-analog.conf
/usr/share/alsa/ucm2/HDA/HiFi.conf
/usr/share/alsa/ucm2/HDA/init.conf
/usr/share/alsa/ucm2/Intel
/usr/share/alsa/ucm2/Intel/SOF
/usr/share/alsa/ucm2/Intel/SOF/HiFi.conf
/usr/share/alsa/ucm2/Intel/SOF/SOF.conf
/usr/share/alsa/ucm2/Intel/bdw-rt5677
/usr/share/alsa/ucm2/Intel/bdw-rt5677/HiFi.conf
/usr/share/alsa/ucm2/Intel/bdw-rt5677/bdw-rt5677.conf
/usr/share/alsa/ucm2/Intel/broadwell-rt286
/usr/share/alsa/ucm2/Intel/broadwell-rt286/HiFi.conf
/usr/share/alsa/ucm2/Intel/broadwell-rt286/broadwell-rt286.conf
/usr/share/alsa/ucm2/Intel/broxton-rt298
/usr/share/alsa/ucm2/Intel/broxton-rt298/Hdmi.conf
/usr/share/alsa/ucm2/Intel/broxton-rt298/HiFi.conf
/usr/share/alsa/ucm2/Intel/broxton-rt298/broxton-rt298.conf
/usr/share/alsa/ucm2/Intel/bytcht-cx2072x
/usr/share/alsa/ucm2/Intel/bytcht-cx2072x/HiFi.conf
/usr/share/alsa/ucm2/Intel/bytcht-cx2072x/bytcht-cx2072x.conf
/usr/share/alsa/ucm2/Intel/bytcht-es8316
/usr/share/alsa/ucm2/Intel/bytcht-es8316/HiFi-Components.conf
/usr/share/alsa/ucm2/Intel/bytcht-es8316/HiFi-LongName.conf
/usr/share/alsa/ucm2/Intel/bytcht-es8316/HiFi.conf
/usr/share/alsa/ucm2/Intel/bytcht-es8316/bytcht-es8316.conf
/usr/share/alsa/ucm2/Intel/bytcr-rt5640
/usr/share/alsa/ucm2/Intel/bytcr-rt5640/HiFi-Components.conf
/usr/share/alsa/ucm2/Intel/bytcr-rt5640/HiFi-LongName.conf
/usr/share/alsa/ucm2/Intel/bytcr-rt5640/HiFi.conf
/usr/share/alsa/ucm2/Intel/bytcr-rt5640/bytcr-rt5640.conf
/usr/share/alsa/ucm2/Intel/bytcr-rt5651
/usr/share/alsa/ucm2/Intel/bytcr-rt5651/HiFi-Components.conf
/usr/share/alsa/ucm2/Intel/bytcr-rt5651/HiFi-LongName.conf
/usr/share/alsa/ucm2/Intel/bytcr-rt5651/HiFi.conf
/usr/share/alsa/ucm2/Intel/bytcr-rt5651/bytcr-rt5651.conf
/usr/share/alsa/ucm2/Intel/bytcr-wm5102
/usr/share/alsa/ucm2/Intel/bytcr-wm5102/HiFi.conf
/usr/share/alsa/ucm2/Intel/bytcr-wm5102/bytcr-wm5102.conf
/usr/share/alsa/ucm2/Intel/cht-bsw-rt5672
/usr/share/alsa/ucm2/Intel/cht-bsw-rt5672/HiFi.conf
/usr/share/alsa/ucm2/Intel/cht-bsw-rt5672/cht-bsw-rt5672.conf
/usr/share/alsa/ucm2/Intel/chtmax98090
/usr/share/alsa/ucm2/Intel/chtmax98090/HiFi.conf
/usr/share/alsa/ucm2/Intel/chtmax98090/chtmax98090.conf
/usr/share/alsa/ucm2/Intel/chtnau8824
/usr/share/alsa/ucm2/Intel/chtnau8824/HiFi.conf
/usr/share/alsa/ucm2/Intel/chtnau8824/chtnau8824.conf
/usr/share/alsa/ucm2/Intel/chtrt5645
/usr/share/alsa/ucm2/Intel/chtrt5645/HiFi.conf
/usr/share/alsa/ucm2/Intel/chtrt5645/chtrt5645.conf
/usr/share/alsa/ucm2/Intel/chtrt5650
/usr/share/alsa/ucm2/Intel/chtrt5650/HiFi.conf
/usr/share/alsa/ucm2/Intel/chtrt5650/chtrt5650.conf
/usr/share/alsa/ucm2/Intel/hda-dsp
/usr/share/alsa/ucm2/Intel/hda-dsp/Hdmi1.conf
/usr/share/alsa/ucm2/Intel/hda-dsp/Hdmi2.conf
/usr/share/alsa/ucm2/Intel/hda-dsp/HiFi.conf
/usr/share/alsa/ucm2/Intel/hda-dsp/hda-dsp.conf
/usr/share/alsa/ucm2/Intel/kblrt5660
/usr/share/alsa/ucm2/Intel/kblrt5660/Hdmi1.conf
/usr/share/alsa/ucm2/Intel/kblrt5660/Hdmi2.conf
/usr/share/alsa/ucm2/Intel/kblrt5660/HiFi.conf
/usr/share/alsa/ucm2/Intel/kblrt5660/kblrt5660.conf
/usr/share/alsa/ucm2/Intel/skylake-rt286
/usr/share/alsa/ucm2/Intel/skylake-rt286/Hdmi1.conf
/usr/share/alsa/ucm2/Intel/skylake-rt286/Hdmi2.conf
/usr/share/alsa/ucm2/Intel/skylake-rt286/HiFi.conf
/usr/share/alsa/ucm2/Intel/skylake-rt286/skylake-rt286.conf
/usr/share/alsa/ucm2/Intel/sof-ehl-rt5660
/usr/share/alsa/ucm2/Intel/sof-ehl-rt5660/Hdmi.conf
/usr/share/alsa/ucm2/Intel/sof-ehl-rt5660/HiFi.conf
/usr/share/alsa/ucm2/Intel/sof-ehl-rt5660/sof-ehl-rt5660.conf
/usr/share/alsa/ucm2/Intel/sof-hda-dsp
/usr/share/alsa/ucm2/Intel/sof-hda-dsp/Hdmi.conf
/usr/share/alsa/ucm2/Intel/sof-hda-dsp/HiFi.conf
/usr/share/alsa/ucm2/Intel/sof-hda-dsp/sof-hda-dsp.conf
/usr/share/alsa/ucm2/Librem_5
/usr/share/alsa/ucm2/Librem_5/HiFi.conf
/usr/share/alsa/ucm2/Librem_5/Librem_5.conf
/usr/share/alsa/ucm2/MediaTek
/usr/share/alsa/ucm2/MediaTek/mtk-rt5650
/usr/share/alsa/ucm2/MediaTek/mtk-rt5650/HDMI.conf
/usr/share/alsa/ucm2/MediaTek/mtk-rt5650/HiFi.conf
/usr/share/alsa/ucm2/MediaTek/mtk-rt5650/init.conf
/usr/share/alsa/ucm2/MediaTek/mtk-rt5650/mtk-rt5650.conf
/usr/share/alsa/ucm2/NXP
/usr/share/alsa/ucm2/NXP/iMX8
/usr/share/alsa/ucm2/NXP/iMX8/Librem_5_Devkit
/usr/share/alsa/ucm2/NXP/iMX8/Librem_5_Devkit/HiFi.conf
/usr/share/alsa/ucm2/NXP/iMX8/Librem_5_Devkit/Librem 5 Devkit.conf
/usr/share/alsa/ucm2/OMAP
/usr/share/alsa/ucm2/OMAP/abe-twl6040
/usr/share/alsa/ucm2/OMAP/abe-twl6040/Pandaboard
/usr/share/alsa/ucm2/OMAP/abe-twl6040/Pandaboard/FMAnalog.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/Pandaboard/HiFi.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/Pandaboard/HiFiLP.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/Pandaboard/Pandaboard.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/Pandaboard/Record.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/Pandaboard/Voice.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/Pandaboard/VoiceCall.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/SDP4430
/usr/share/alsa/ucm2/OMAP/abe-twl6040/SDP4430/FMAnalog.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/SDP4430/HiFi.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/SDP4430/HiFiLP.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/SDP4430/Record.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/SDP4430/SDP4430.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/SDP4430/Voice.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/SDP4430/VoiceCall.conf
/usr/share/alsa/ucm2/OMAP/abe-twl6040/abe-twl6040.conf
/usr/share/alsa/ucm2/PinePhone
/usr/share/alsa/ucm2/PinePhone/HiFi.conf
/usr/share/alsa/ucm2/PinePhone/PinePhone.conf
/usr/share/alsa/ucm2/PinePhone/VoiceCall.conf
/usr/share/alsa/ucm2/PineTab
/usr/share/alsa/ucm2/PineTab/HiFi.conf
/usr/share/alsa/ucm2/PineTab/PineTab.conf
/usr/share/alsa/ucm2/Qualcomm
/usr/share/alsa/ucm2/Qualcomm/apq8016-sbc
/usr/share/alsa/ucm2/Qualcomm/apq8016-sbc/HDMI.conf
/usr/share/alsa/ucm2/Qualcomm/apq8016-sbc/HiFi.conf
/usr/share/alsa/ucm2/Qualcomm/apq8016-sbc/apq8016-sbc.conf
/usr/share/alsa/ucm2/Qualcomm/apq8096
/usr/share/alsa/ucm2/Qualcomm/apq8096/HDMI.conf
/usr/share/alsa/ucm2/Qualcomm/apq8096/HiFi.conf
/usr/share/alsa/ucm2/Qualcomm/apq8096/apq8096.conf
/usr/share/alsa/ucm2/Qualcomm/sc7180
/usr/share/alsa/ucm2/Qualcomm/sc7180/rt5682-max98357a
/usr/share/alsa/ucm2/Qualcomm/sc7180/rt5682-max98357a/HiFi.conf
/usr/share/alsa/ucm2/Qualcomm/sc7180/rt5682-max98357a/init.conf
/usr/share/alsa/ucm2/Qualcomm/sc7180/rt5682-max98357a/sc7180-rt5682-max98357a-1mic.conf
/usr/share/alsa/ucm2/Qualcomm/sdm845
/usr/share/alsa/ucm2/Qualcomm/sdm845/HDMI.conf
/usr/share/alsa/ucm2/Qualcomm/sdm845/HiFi.conf
/usr/share/alsa/ucm2/Qualcomm/sdm845/sdm845.conf
/usr/share/alsa/ucm2/Qualcomm/sm8250
/usr/share/alsa/ucm2/Qualcomm/sm8250/HDMI.conf
/usr/share/alsa/ucm2/Qualcomm/sm8250/HiFi.conf
/usr/share/alsa/ucm2/Qualcomm/sm8250/Qualcomm-RB5-WSA8815-Speakers-DMIC0.conf
/usr/share/alsa/ucm2/README.md
/usr/share/alsa/ucm2/Rockchip
/usr/share/alsa/ucm2/Rockchip/es8316
/usr/share/alsa/ucm2/Rockchip/es8316/HiFi.conf
/usr/share/alsa/ucm2/Rockchip/es8316/es8316.conf
/usr/share/alsa/ucm2/Rockchip/max98090
/usr/share/alsa/ucm2/Rockchip/max98090/HiFi.conf
/usr/share/alsa/ucm2/Rockchip/max98090/max98090.conf
/usr/share/alsa/ucm2/Rockchip/rk3399-gru-sound
/usr/share/alsa/ucm2/Rockchip/rk3399-gru-sound/HiFi.conf
/usr/share/alsa/ucm2/Rockchip/rk3399-gru-sound/rk3399-gru-sound.conf
/usr/share/alsa/ucm2/Samsung
/usr/share/alsa/ucm2/Samsung/snow
/usr/share/alsa/ucm2/Samsung/snow/HiFi.conf
/usr/share/alsa/ucm2/Samsung/snow/snow.conf
/usr/share/alsa/ucm2/Tegra
/usr/share/alsa/ucm2/Tegra/alc5632
/usr/share/alsa/ucm2/Tegra/alc5632/HiFi.conf
/usr/share/alsa/ucm2/Tegra/alc5632/Record.conf
/usr/share/alsa/ucm2/Tegra/alc5632/alc5632.conf
/usr/share/alsa/ucm2/Tegra/max98090
/usr/share/alsa/ucm2/Tegra/max98090/HiFi.conf
/usr/share/alsa/ucm2/Tegra/max98090/max98090.conf
/usr/share/alsa/ucm2/Tegra/rt5640
/usr/share/alsa/ucm2/Tegra/rt5640/Google-Nexus-7-HiFi.conf
/usr/share/alsa/ucm2/Tegra/rt5640/Google-Nexus-7.conf
/usr/share/alsa/ucm2/Tegra/tegra-hda
/usr/share/alsa/ucm2/Tegra/tegra-hda/tegra-hda-HiFi.conf
/usr/share/alsa/ucm2/Tegra/tegra-hda/tegra-hda.conf
/usr/share/alsa/ucm2/Tegra/wm8903
/usr/share/alsa/ucm2/Tegra/wm8903/Acer-A500-HiFi.conf
/usr/share/alsa/ucm2/Tegra/wm8903/Acer-A500.conf
/usr/share/alsa/ucm2/USB-Audio
/usr/share/alsa/ucm2/USB-Audio/Dell
/usr/share/alsa/ucm2/USB-Audio/Dell/Desktop-Front-Speaker-Headset.conf
/usr/share/alsa/ucm2/USB-Audio/Dell/Desktop-Front.conf
/usr/share/alsa/ucm2/USB-Audio/Dell/Desktop-Rear-Line.conf
/usr/share/alsa/ucm2/USB-Audio/Dell/Desktop-Rear.conf
/usr/share/alsa/ucm2/USB-Audio/Dell/WD15-Dock-HiFi.conf
/usr/share/alsa/ucm2/USB-Audio/Dell/WD15-Dock.conf
/usr/share/alsa/ucm2/USB-Audio/Gigabyte
/usr/share/alsa/ucm2/USB-Audio/Gigabyte/Aorus-Master-Main-Audio-HiFi.conf
/usr/share/alsa/ucm2/USB-Audio/Gigabyte/Aorus-Master-Main-Audio.conf
/usr/share/alsa/ucm2/USB-Audio/GoXLR
/usr/share/alsa/ucm2/USB-Audio/GoXLR/GoXLR-HiFi.conf
/usr/share/alsa/ucm2/USB-Audio/GoXLR/GoXLR.conf
/usr/share/alsa/ucm2/USB-Audio/Lenovo
/usr/share/alsa/ucm2/USB-Audio/Lenovo/ThinkStation-P620-Main-HiFi.conf
/usr/share/alsa/ucm2/USB-Audio/Lenovo/ThinkStation-P620-Main.conf
/usr/share/alsa/ucm2/USB-Audio/Lenovo/ThinkStation-P620-Rear-HiFi.conf
/usr/share/alsa/ucm2/USB-Audio/Lenovo/ThinkStation-P620-Rear.conf
/usr/share/alsa/ucm2/USB-Audio/Realtek
/usr/share/alsa/ucm2/USB-Audio/Realtek/ALC1220-VB-Desktop-HiFi.conf
/usr/share/alsa/ucm2/USB-Audio/Realtek/ALC1220-VB-Desktop.conf
/usr/share/alsa/ucm2/USB-Audio/USB-Audio.conf
/usr/share/alsa/ucm2/codecs
/usr/share/alsa/ucm2/codecs/cx2072x
/usr/share/alsa/ucm2/codecs/cx2072x/DisableSeq.conf
/usr/share/alsa/ucm2/codecs/cx2072x/EnableSeq.conf
/usr/share/alsa/ucm2/codecs/cx2072x/HeadPhones.conf
/usr/share/alsa/ucm2/codecs/cx2072x/HeadsetMic.conf
/usr/share/alsa/ucm2/codecs/cx2072x/InternalMic.conf
/usr/share/alsa/ucm2/codecs/cx2072x/Speaker.conf
/usr/share/alsa/ucm2/codecs/es8316
/usr/share/alsa/ucm2/codecs/es8316/EnableSeq.conf
/usr/share/alsa/ucm2/codecs/es8316/HeadPhones.conf
/usr/share/alsa/ucm2/codecs/es8316/IN1-HeadsetMic.conf
/usr/share/alsa/ucm2/codecs/es8316/IN1-InternalMic.conf
/usr/share/alsa/ucm2/codecs/es8316/IN2-HeadsetMic.conf
/usr/share/alsa/ucm2/codecs/es8316/IN2-InternalMic.conf
/usr/share/alsa/ucm2/codecs/es8316/MonoSpeaker.conf
/usr/share/alsa/ucm2/codecs/es8316/Speaker.conf
/usr/share/alsa/ucm2/codecs/hda
/usr/share/alsa/ucm2/codecs/hda/hdmi.conf
/usr/share/alsa/ucm2/codecs/max98090
/usr/share/alsa/ucm2/codecs/max98090/EnableSeq.conf
/usr/share/alsa/ucm2/codecs/max98090/Headphones.conf
/usr/share/alsa/ucm2/codecs/max98090/HeadsetMic.conf
/usr/share/alsa/ucm2/codecs/max98090/InternalMic.conf
/usr/share/alsa/ucm2/codecs/max98090/Speaker.conf
/usr/share/alsa/ucm2/codecs/nau8824
/usr/share/alsa/ucm2/codecs/nau8824/DMIC1_2.conf
/usr/share/alsa/ucm2/codecs/nau8824/EnableSeq.conf
/usr/share/alsa/ucm2/codecs/nau8824/HeadPhones.conf
/usr/share/alsa/ucm2/codecs/nau8824/HeadsetMic.conf
/usr/share/alsa/ucm2/codecs/nau8824/InternalMic.conf
/usr/share/alsa/ucm2/codecs/nau8824/MonoSpeaker.conf
/usr/share/alsa/ucm2/codecs/nau8824/Speaker.conf
/usr/share/alsa/ucm2/codecs/qcom-lpass
/usr/share/alsa/ucm2/codecs/qcom-lpass/va-macro
/usr/share/alsa/ucm2/codecs/qcom-lpass/va-macro/DMIC0DisableSeq.conf
/usr/share/alsa/ucm2/codecs/qcom-lpass/va-macro/DMIC0EnableSeq.conf
/usr/share/alsa/ucm2/codecs/qcom-lpass/wsa-macro
/usr/share/alsa/ucm2/codecs/qcom-lpass/wsa-macro/SpeakerDisableSeq.conf
/usr/share/alsa/ucm2/codecs/qcom-lpass/wsa-macro/SpeakerEnableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5640
/usr/share/alsa/ucm2/codecs/rt5640/DigitalMics.conf
/usr/share/alsa/ucm2/codecs/rt5640/EnableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5640/HeadPhones.conf
/usr/share/alsa/ucm2/codecs/rt5640/HeadPhones2.conf
/usr/share/alsa/ucm2/codecs/rt5640/HeadsetMic.conf
/usr/share/alsa/ucm2/codecs/rt5640/HeadsetMic2-IN1.conf
/usr/share/alsa/ucm2/codecs/rt5640/IN1-InternalMic.conf
/usr/share/alsa/ucm2/codecs/rt5640/IN3-InternalMic.conf
/usr/share/alsa/ucm2/codecs/rt5640/MonoSpeaker.conf
/usr/share/alsa/ucm2/codecs/rt5640/Speaker.conf
/usr/share/alsa/ucm2/codecs/rt5640/init.conf
/usr/share/alsa/ucm2/codecs/rt5645
/usr/share/alsa/ucm2/codecs/rt5645/AnalogMic.conf
/usr/share/alsa/ucm2/codecs/rt5645/DigitalMicDisableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5645/DigitalMicEnableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5645/DisableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5645/EnableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5645/HSMicDisableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5645/HSMicEnableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5645/HeadphonesEnableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5645/SpeakerEnableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5645/init.conf
/usr/share/alsa/ucm2/codecs/rt5651
/usr/share/alsa/ucm2/codecs/rt5651/DigitalMic.conf
/usr/share/alsa/ucm2/codecs/rt5651/EnableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5651/HeadPhones-swapped.conf
/usr/share/alsa/ucm2/codecs/rt5651/HeadPhones.conf
/usr/share/alsa/ucm2/codecs/rt5651/IN1-InternalMic.conf
/usr/share/alsa/ucm2/codecs/rt5651/IN12-InternalMic.conf
/usr/share/alsa/ucm2/codecs/rt5651/IN2-HeadsetMic.conf
/usr/share/alsa/ucm2/codecs/rt5651/IN2-InternalMic.conf
/usr/share/alsa/ucm2/codecs/rt5651/IN3-HeadsetMic.conf
/usr/share/alsa/ucm2/codecs/rt5651/MonoSpeaker.conf
/usr/share/alsa/ucm2/codecs/rt5651/Speaker.conf
/usr/share/alsa/ucm2/codecs/rt5651/init.conf
/usr/share/alsa/ucm2/codecs/rt5672
/usr/share/alsa/ucm2/codecs/rt5672/DMIC1.conf
/usr/share/alsa/ucm2/codecs/rt5672/DMIC2.conf
/usr/share/alsa/ucm2/codecs/rt5672/EnableSeq.conf
/usr/share/alsa/ucm2/codecs/rt5672/HeadPhones.conf
/usr/share/alsa/ucm2/codecs/rt5672/HeadsetMic.conf
/usr/share/alsa/ucm2/codecs/rt5672/MonoSpeaker.conf
/usr/share/alsa/ucm2/codecs/rt5672/Speaker.conf
/usr/share/alsa/ucm2/codecs/rt5682
/usr/share/alsa/ucm2/codecs/rt5682/init.conf
/usr/share/alsa/ucm2/codecs/rt700
/usr/share/alsa/ucm2/codecs/rt700/init.conf
/usr/share/alsa/ucm2/codecs/rt711
/usr/share/alsa/ucm2/codecs/rt711/init.conf
/usr/share/alsa/ucm2/codecs/rt711-sdca
/usr/share/alsa/ucm2/codecs/rt711-sdca/init.conf
/usr/share/alsa/ucm2/codecs/rt715
/usr/share/alsa/ucm2/codecs/rt715/init.conf
/usr/share/alsa/ucm2/codecs/rt715-sdca
/usr/share/alsa/ucm2/codecs/rt715-sdca/init.conf
/usr/share/alsa/ucm2/codecs/wcd934x
/usr/share/alsa/ucm2/codecs/wcd934x/DefaultDisableSeq.conf
/usr/share/alsa/ucm2/codecs/wcd934x/DefaultEnableSeq.conf
/usr/share/alsa/ucm2/codecs/wcd934x/HeadphoneDisableSeq.conf
/usr/share/alsa/ucm2/codecs/wcd934x/HeadphoneEnableSeq.conf
/usr/share/alsa/ucm2/codecs/wcd934x/HeadphoneMicDisableSeq.conf
/usr/share/alsa/ucm2/codecs/wcd934x/HeadphoneMicEnableSeq.conf
/usr/share/alsa/ucm2/codecs/wcd934x/SpeakerDisableSeq.conf
/usr/share/alsa/ucm2/codecs/wcd934x/SpeakerEnableSeq.conf
/usr/share/alsa/ucm2/codecs/wm5102
/usr/share/alsa/ucm2/codecs/wm5102/EnableSeq.conf
/usr/share/alsa/ucm2/codecs/wm5102/HeadPhones.conf
/usr/share/alsa/ucm2/codecs/wm5102/IN1-HeadsetMic.conf
/usr/share/alsa/ucm2/codecs/wm5102/IN3-InternalMic.conf
/usr/share/alsa/ucm2/codecs/wm5102/Speaker.conf
/usr/share/alsa/ucm2/codecs/wsa881x
/usr/share/alsa/ucm2/codecs/wsa881x/DefaultEnableSeq.conf
/usr/share/alsa/ucm2/codecs/wsa881x/SpeakerDisableSeq.conf
/usr/share/alsa/ucm2/codecs/wsa881x/SpeakerEnableSeq.conf
/usr/share/alsa/ucm2/common
/usr/share/alsa/ucm2/common/linked-card.conf
/usr/share/alsa/ucm2/common/linked.conf
/usr/share/alsa/ucm2/conf.d
/usr/share/alsa/ucm2/conf.d/DB410c
/usr/share/alsa/ucm2/conf.d/DB820c
/usr/share/alsa/ucm2/conf.d/HDA-Intel
/usr/share/alsa/ucm2/conf.d/SC7180
/usr/share/alsa/ucm2/conf.d/SOF
/usr/share/alsa/ucm2/conf.d/USB-Audio
/usr/share/alsa/ucm2/conf.d/acp
/usr/share/alsa/ucm2/conf.d/acp6x
/usr/share/alsa/ucm2/conf.d/bdw-rt5677
/usr/share/alsa/ucm2/conf.d/broadwell-rt286
/usr/share/alsa/ucm2/conf.d/broxton-rt298
/usr/share/alsa/ucm2/conf.d/bytcht-cx2072x
/usr/share/alsa/ucm2/conf.d/bytcht-es8316
/usr/share/alsa/ucm2/conf.d/bytcr-rt5640
/usr/share/alsa/ucm2/conf.d/bytcr-rt5651
/usr/share/alsa/ucm2/conf.d/bytcr-wm5102
/usr/share/alsa/ucm2/conf.d/cht-bsw-rt5672
/usr/share/alsa/ucm2/conf.d/chtmax98090
/usr/share/alsa/ucm2/conf.d/chtnau8824
/usr/share/alsa/ucm2/conf.d/chtrt5645
/usr/share/alsa/ucm2/conf.d/chtrt5650
/usr/share/alsa/ucm2/conf.d/hda-dsp
/usr/share/alsa/ucm2/conf.d/kblrt5660
/usr/share/alsa/ucm2/conf.d/mtk-rt5650
/usr/share/alsa/ucm2/conf.d/rockchip_es8316
/usr/share/alsa/ucm2/conf.d/sdm845
/usr/share/alsa/ucm2/conf.d/simple-card
/usr/share/alsa/ucm2/conf.d/skylake-rt286
/usr/share/alsa/ucm2/conf.d/sm8250
/usr/share/alsa/ucm2/conf.d/sof-ehl-rt5660
/usr/share/alsa/ucm2/conf.d/sof-hda-dsp
/usr/share/alsa/ucm2/conf.d/sof-soundwire
/usr/share/alsa/ucm2/conf.d/tegra
/usr/share/alsa/ucm2/conf.d/tegra-hda
/usr/share/alsa/ucm2/conf.virt.d
/usr/share/alsa/ucm2/lib
/usr/share/alsa/ucm2/lib/card-init.conf
/usr/share/alsa/ucm2/lib/ctl-remap.conf
/usr/share/alsa/ucm2/lib/generic.conf
/usr/share/alsa/ucm2/module
/usr/share/alsa/ucm2/platforms
/usr/share/alsa/ucm2/platforms/bytcr
/usr/share/alsa/ucm2/platforms/bytcr/PlatformDisableSeq.conf
/usr/share/alsa/ucm2/platforms/bytcr/PlatformEnableSeq.conf
/usr/share/alsa/ucm2/sof-soundwire
/usr/share/alsa/ucm2/sof-soundwire/Hdmi.conf
/usr/share/alsa/ucm2/sof-soundwire/HiFi.conf
/usr/share/alsa/ucm2/sof-soundwire/dmic.conf
/usr/share/alsa/ucm2/sof-soundwire/rt1308-1.conf
/usr/share/alsa/ucm2/sof-soundwire/rt1308-2.conf
/usr/share/alsa/ucm2/sof-soundwire/rt1316-1.conf
/usr/share/alsa/ucm2/sof-soundwire/rt1316-2.conf
/usr/share/alsa/ucm2/sof-soundwire/rt5682.conf
/usr/share/alsa/ucm2/sof-soundwire/rt700.conf
/usr/share/alsa/ucm2/sof-soundwire/rt711-sdca.conf
/usr/share/alsa/ucm2/sof-soundwire/rt711.conf
/usr/share/alsa/ucm2/sof-soundwire/rt715-sdca.conf
/usr/share/alsa/ucm2/sof-soundwire/rt715.conf
/usr/share/alsa/ucm2/sof-soundwire/sof-soundwire.conf
/usr/share/alsa/ucm2/ucm.conf
/usr/share/doc
/usr/share/doc/alsa-ucm-conf
/usr/share/doc/alsa-ucm-conf/changelog.Debian.gz
/usr/share/doc/alsa-ucm-conf/copyright
/usr/share/alsa/ucm2/Librem_5/wm8962.conf
/usr/share/alsa/ucm2/conf.d/DB410c/DB410c.conf
/usr/share/alsa/ucm2/conf.d/DB820c/DB820c.conf
/usr/share/alsa/ucm2/conf.d/HDA-Intel/HDA-Intel.conf
/usr/share/alsa/ucm2/conf.d/SC7180/sc7180-rt5682-max98357a-1mic.conf
/usr/share/alsa/ucm2/conf.d/SOF/SOF.conf
/usr/share/alsa/ucm2/conf.d/USB-Audio/USB-Audio.conf
/usr/share/alsa/ucm2/conf.d/acp/acp.conf
/usr/share/alsa/ucm2/conf.d/acp6x/acp6x.conf
/usr/share/alsa/ucm2/conf.d/bdw-rt5677/bdw-rt5677.conf
/usr/share/alsa/ucm2/conf.d/broadwell-rt286/broadwell-rt286.conf
/usr/share/alsa/ucm2/conf.d/broxton-rt298/broxton-rt298.conf
/usr/share/alsa/ucm2/conf.d/bytcht-cx2072x/bytcht-cx2072x.conf
/usr/share/alsa/ucm2/conf.d/bytcht-es8316/bytcht-es8316.conf
/usr/share/alsa/ucm2/conf.d/bytcr-rt5640/bytcr-rt5640.conf
/usr/share/alsa/ucm2/conf.d/bytcr-rt5651/bytcr-rt5651.conf
/usr/share/alsa/ucm2/conf.d/bytcr-wm5102/bytcr-wm5102.conf
/usr/share/alsa/ucm2/conf.d/cht-bsw-rt5672/cht-bsw-rt5672.conf
/usr/share/alsa/ucm2/conf.d/chtmax98090/chtmax98090.conf
/usr/share/alsa/ucm2/conf.d/chtnau8824/chtnau8824.conf
/usr/share/alsa/ucm2/conf.d/chtrt5645/chtrt5645.conf
/usr/share/alsa/ucm2/conf.d/chtrt5650/chtrt5650.conf
/usr/share/alsa/ucm2/conf.d/hda-dsp/hda-dsp.conf
/usr/share/alsa/ucm2/conf.d/kblrt5660/kblrt5660.conf
/usr/share/alsa/ucm2/conf.d/mtk-rt5650/mtk-rt5650.conf
/usr/share/alsa/ucm2/conf.d/rockchip_es8316/rockchip_es8316.conf
/usr/share/alsa/ucm2/conf.d/sdm845/DB845c.conf
/usr/share/alsa/ucm2/conf.d/simple-card/Librem 5 Devkit.conf
/usr/share/alsa/ucm2/conf.d/skylake-rt286/skylake-rt286.conf
/usr/share/alsa/ucm2/conf.d/sm8250/Qualcomm-RB5-WSA8815-Speakers-DMIC0.conf
/usr/share/alsa/ucm2/conf.d/sof-ehl-rt5660/sof-ehl-rt5660.conf
/usr/share/alsa/ucm2/conf.d/sof-hda-dsp/sof-hda-dsp.conf
/usr/share/alsa/ucm2/conf.d/sof-hda-dsp/sof-skl_hda_card.conf
/usr/share/alsa/ucm2/conf.d/sof-skl_hda_card
/usr/share/alsa/ucm2/conf.d/sof-soundwire/sof-soundwire.conf
/usr/share/alsa/ucm2/conf.d/tegra/ASUS Google Nexus 7 ALC5642.conf
/usr/share/alsa/ucm2/conf.d/tegra/Acer Iconia Tab A500 WM8903.conf
/usr/share/alsa/ucm2/conf.d/tegra/Compal PAZ00.conf
/usr/share/alsa/ucm2/conf.d/tegra/GoogleNyanBig.conf
/usr/share/alsa/ucm2/conf.d/tegra/GoogleNyanBlaze.conf
/usr/share/alsa/ucm2/conf.d/tegra-hda/tegra-hda.conf
/usr/share/alsa/ucm2/module/snd_soc_apq8016_sbc.conf
/usr/share/alsa/ucm2/module/snd_soc_apq8096.conf
/usr/share/alsa/ucm2/module/snd_soc_omap_abe_twl6040.conf
/usr/share/alsa/ucm2/module/snd_soc_rk3399_gru_sound.conf
/usr/share/alsa/ucm2/module/snd_soc_rockchip_max98090.conf
/usr/share/alsa/ucm2/module/snd_soc_sdm845.conf
/usr/share/alsa/ucm2/module/snd_soc_snow.conf
/usr/share/alsa/ucm2/module/snd_soc_tegra_alc5632.conf
/usr/share/alsa/ucm2/module/snd_soc_tegra_max98090.conf
/usr/share/alsa/ucm2/wm8962

Thoughts on caching `apt update`?

It's cool to cache the packages, but it's a little less cool to have to update the packages every time first if they aren't already in the image.

What are your thoughts on the value and/or feasibility of caching the result of apt update?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.