Github Actions - 在任何运行步骤中都找不到文件或目录

36

我想尝试在一个小型网络项目中使用Github Actions进行测试。 在存储库中有两个项目,我希望只为Web客户端创建部署脚本。

存储库的结构如下:

root
|
|-src
|  |-API
|  |
|  |-WebClient
|
|-docs

我想在WebClient目录中运行脚本。当我尝试cd进入./src/webclient时,出现错误no such file or directory

name: CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js environment
        uses: actions/setup-node@v2.1.2
        
      - name: Open Web Client Directory
        run: |
          ls -la
          cd ./src/webclient
          ls -la
          
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.
          ls -la

“Open Web Client Directory” 步骤的输出:

total 28
drwxr-xr-x 5 runner docker 4096 Oct 17 18:05 .
drwxr-xr-x 3 runner docker 4096 Oct 17 18:05 ..
drwxr-xr-x 8 runner docker 4096 Oct 17 18:05 .git
drwxr-xr-x 3 runner docker 4096 Oct 17 18:05 .github
-rw-r--r-- 1 runner docker 6215 Oct 17 18:05 .gitignore
drwxr-xr-x 4 runner docker 4096 Oct 17 18:05 src
/home/runner/work/_temp/43164e53-98ec-41c2-8773-72e94c3453e5.sh: line 2: cd: ./src/webclient: No such file or directory
Error: Process completed with exit code 1.

它似乎成功执行了ls -la命令,但是无法找到目录./src/webclient。

我是否漏掉了一些显而易见的东西?我尝试将命令更改为cd src/webclient,但它也失败了。这在两台不同的本地机器上都可以工作,一个是Ubuntu,另一个是MacOS。


目录名称是 WebClient 还是 webclient?文件系统区分大小写,如果它是你最初展示的 WebClient,那么你必须使用 cd src/WebClient 而不是 cd src/webclient - Benjamin W.
5个回答

124

我遇到了一个问题,无论我如何配置,都会出现以下错误:

Error: No such file or directory

后来发现这是因为我之前没有在先前的步骤中检出仓库!

如果您要访问仓库中的文件,需要先执行checkout操作:

steps:
  - uses: actions/checkout@v2

20
这是一件看起来非常明显的事情,应该在文档中更清晰地表述。 - Ben
1
“- uses: actions/checkout@v2” 是否需要才能访问由 “run: dotnet publish” 生成的文件? - codea
1
如果您尝试在子目录上使用echo,并且您不需要您的代码,则会发生这种情况。在echo之前,您需要在运行中添加mkdir {dir} - nelson6e65
这个事实表明,GitHub Actions在未执行actions/checkout时应该附加一个“无此文件或目录”的错误消息,因为它已经获得了约70个投票。 - Ed Smith

5

试试这个:

- name: Open Web Client Directory
  working-directory: src/webclient
  run: |
    ls -la

4
根据你的日志,这似乎是由于大小写敏感性造成的:你展示的存储库包含src/WebClient(驼峰命名!),但是接下来你尝试使用cd src/webclient(小写)。
在 macOS 上,这将起作用,因为文件系统默认不区分大小写;不确定为什么它在你的 Ubuntu 系统上工作,除非你使用像制表符自动完成之类的东西,可以为你执行大小写操作。
要检查子目录中有哪些内容,可以运行find src而不是ls -la以查看src中的整个目录树。

1
这就是问题所在。我的WSL为我自动补全了。看起来是一个一流的PEBCAK! - jlat96

3
一个不同的解决方案,但它可能会帮助其他人。
在我的情况下,我正在读取一个像这样带有换行符的秘密变量:
echo ${{ secrets.STORE_FILE_BASE64 }} | base64 --decode > ${{ github.workspace }}/android/key.jks

这引发了一个"错误:没有这样的文件或目录"。将其更改为"${{ secrets.STORE_FILE_BASE64 }}"(注意引号)解决了我的问题!

0
在阅读了许多帖子后,我成功解决了一个类似的问题。我的操作失败是因为无法找到我的 "tmp/" 目录,并且我收到了以下错误信息:
[Errno 2] No such file or directory: 'tmp/video.mp4'

在我的脚本尝试在临时目录中创建一个名为"video.mp4"的文件时出现了这个错误,但是由于GitHub找不到我的tmp文件夹,所以一直失败。然而,在本地却可以正常工作。

在按照以下两个步骤后,我成功解决了这个问题。

  1. 第一步是进行健全性检查和验证,以确定在我的GitHub Actions环境中看到了哪些文件。在我检出之后,我通过将此步骤添加到我的GitHub Actions yml文件中来完成:
      - name: Get directory
        run: ls

这个命令产生了以下输出:
ETL.py
README.md
google_cloud_functions
requirements.txt
tests.py

如您所见,没有找到“tmp”目录。因此,我尝试的做法是向未找到的目录中添加一个空文件。我通过将一个空白文本文件添加到tmp目录中来实现这一点。
然后再次推送到GitHub,并触发操作。当在工作流程中运行ls命令时,我得到了以下输出:
ETL.py
README.md
google_cloud_functions
requirements.txt
tests.py
tmp

Boom,我的tmp文件夹出现了。
总结一下,当GitHub无法找到我的空目录时,我向该目录添加了一个新的虚拟文件,然后进行git add、git commit和git push操作,然后git就能找到之前无法找到的目录了。我怀疑这种方法对于非空目录以及无法找到的文件也同样适用。例如,你可以尝试通过给代码添加一个简单的注释来修改无法找到的文件。
我不确定这种行为的根本原因是什么,但可能与我的git历史有关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接