我试图使用官方的GitHub缓存操作(https://github.com/actions/cache)来缓存一些二进制文件,以加快我的一些工作流程,但是当指定多个缓存路径时,我无法让它工作。
下面是我使用单个缓存路径设置的一个简单的工作测试:有一个操作用于写入该高速缓存,另一个操作用于阅读缓存(两者都在不同的工作流中执行,但在同一个仓库和分支上)。首先执行write-action,并创建一个文件“subdir/a.txt”,然后使用“actions/cache@v2”操作将其缓存:
# Test with single path
- name: Create file
shell: bash
run: |
mkdir subdir
cd subdir
printf '%s' "Lorem ipsum" >> a.txt
- name: Write cache (Single path)
uses: actions/cache@v2
with:
path: "D:/a/cache_test/cache_test/**/*.txt"
key: test-cache-single-path
read-action检索该高速缓存,递归地打印目录中所有文件的列表以确认它已经从缓存中恢复了文件,然后打印缓存的txt文件的内容:
- name: Get cached file
uses: actions/cache@v2
id: get-cache
with:
path: "D:/a/cache_test/cache_test/**/*.txt"
key: test-cache-single-path
- name: Print files
shell: bash
run: |
echo "Cache hit: ${{steps.get-cache.outputs.cache-hit}}"
cd "D:/a/cache_test/cache_test"
ls -R
cat "D:/a/cache_test/cache_test/subdir/a.txt"
这工作没有任何问题。
现在,该高速缓存操作的描述包含一个指定多个缓存路径的示例:
- uses: actions/cache@v2
with:
path: |
path/to/dependencies
some/other/dependencies
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
但是当我在示例操作中尝试时,它失败了。在新的write-action中,我创建了两个文件,“subdir/a.txt”和“subdir/b.md”,然后通过指定两个路径来缓存它们:
# Test with multiple paths
- name: Create files
shell: bash
run: |
mkdir subdir
cd subdir
printf '%s' "Lorem ipsum" >> a.txt
printf '%s' "dolor sit amet" >> b.md
#- name: Write cache (Multi path)
uses: actions/cache@v2
with:
path: |
"D:/a/cache_test/cache_test/**/*.txt"
"D:/a/cache_test/cache_test/**/*.md"
key: test-cache-multi-path
新的read-action与旧的相同,但也指定了两个路径:
# Read cache
- name: Get cached file
uses: actions/cache@v2
id: get-cache
with:
path: |
"D:/a/cache_test/cache_test/**/*.txt"
"D:/a/cache_test/cache_test/**/*.md"
key: test-cache-multi-path
- name: Print files
shell: bash
run: |
echo "Cache hit: ${{steps.get-cache.outputs.cache-hit}}"
cd "D:/a/cache_test/cache_test"
ls -R
cat "D:/a/cache_test/cache_test/subdir/a.txt"
cat "D:/a/cache_test/cache_test/subdir/b.md"
这一次,我仍然得到该高速缓存已被读取的确认:
Cache restored successfully
Cache restored from key: test-cache-multi-path
Cache hit: true
但是,“ls -R”没有列出这些文件,并且“cat”命令会失败,因为这些文件不存在。
我的错误在哪里?用该高速缓存操作指定多个路径的正确方法是什么?
3条答案
按热度按时间5cnsuln71#
我做了一些修改就能使它工作;
看起来至少bash的绝对路径看起来像这样:
其中so-foobar-cache是存储库的名称。
.github/workflows/foobar.yml
日志
第一份工作
第二份工作
vsdwdz232#
来到这里,看看我是否可以缓存多个二进制文件.我看到有一个单独的工作流推缓存和另一个检索.我们有一个单独的用例,我们需要安装某些依赖.在这里共享相同.
用例
gcc
和python3
才能运行。(依赖项也可以是任何其他依赖项)./install-dependencies.sh
的脚本,并为脚本提供适当的env,如ENV_INSTALL_PYTHON=true
或ENV_INSTALL_GCC=true
注意事项
./install-dependencies.sh
负责在路径~/bin
中安装依赖项,并在同一路径中生成可执行二进制文件。它还确保使用新的二进制路径更新$PATH
环境变量check cache
和install binaries
复制两次(因为我们现在有两个二进制文件),而是只需要一个即可完成。python-gcc-cache-key
可以是任何名称,但必须确保它是唯一的。- name: install python, gcc
负责创建名为python-gcc-cache-key
的键,如果没有找到它,即使我们在这一步中没有提到这个keyname。工作流程
福利
这将取决于你试图安装的二进制文件。对我们来说,每次缓存命中时节省的时间几乎是
50sec
。kyxcudwk3#
我的用途是 * 缓存pip和APT包 *,在Sphinx中编译文档。虽然多个路径可以开箱即用,但重要的部分是将apt缓存链接到用户空间。工作流程如下:
demonstrated to work here .