在GitHub Actions中,是否可以在Actions之间保留WORKDIR?

16
今天早上我收到了GitHub Actions BETA的邀请(哇),开始使用它,并打算迁移一些我当前在CircleCI上运行的简单构建、测试和部署流水线。虽然我还在试图理解Actions,但我的思路是,在push之后,工作流中的第一个Action将启动一个Docker容器。在该容器内,我将运行一些简单的构建过程,例如最小化资源和删除文件等。接下来的Action将对构建运行一些测试。在流水线中的下一个或多个Action将根据我推送到的分支部署到多个环境中的其中一个。我遵循了https://developer.github.com/actions/creating-github-actions/creating-a-docker-container/上的文档,并拥有了一个基本的工作流,可以启动一个Docker容器并在WORKDIR内运行一些构建命令。我还能够从这个WORKDIR内运行部署(通过rsync)。然而,我想将其拆分为不同的步骤/Action,但是我无法想出一种方法来实现。本质上,这与我正在使用的CircleCI作业/工作流模型类似。但是,在CircleCI中,第一个作业运行构建,然后在整个工作流期间持续保留所得到的目录结构,就像这样:
# Persist dist directory
  - persist_to_workspace:
      root: ~/project
      paths:
        - .

所以,我有点将CircleCI的Jobs与GitHub的Actions相提并论,这可能是错误的吗?本质上,我想要找出的是是否可以在第一个Action的Docker容器中保留WORKDIR并使其对后续的Actions可用。
这是可能的吗,还是我对GitHub Actions的想象完全错了?
谢谢!

太好的问题了!我真的很想念CircleCI中的persist_to_workspace,以及GitHub Actions中没有的按时间分割。任何建议通过上传/下载来完成都不是完全错误的,但也不是正确的。当你进入严肃的企业级别并拥有许多Docker镜像的测试容器时,这种方法根本不是一个选项。 - Eugene
4个回答

10

为了回答这个问题,我将提供以下翻译(以防别人遇到同样的问题,就像我一样没有完全阅读文档!:o)。

文档这里有解释,但基本上,您启动的任何容器作为操作的一部分的工作目录存在于/github/workspace。操作可以修改此工作目录的内容,当在工作流期间启动后续操作中的容器时,这些操作/容器的工作目录将包含先前在工作流中进行的修改。

因此,答案是是的,Docker WORKDIR位于/github/workspace在 GitHub Actions 工作流中会被保留,类似于其在 CircleCI 工作流中可能保留的方式。


5
如果您能在使用“job.needs”并行运行作业以获得更快的反馈(例如不必多次运行昂贵的“yarn install”或“yarn build”步骤)的同时保留工作区,那将是很好的。 - JaKXz
我认为这个功能已经改变了。我很想尝试一下,但不幸的是,我认为作业根本不再持久化。 - Greg
我和@JaKXz处于同样的境地。如果我能有一个工作来执行“checkout && npm install”,并使用“needs”来进行其他工作,如lint、检查类型和最终构建项目,那就太好了。这还不可能吗? - s.meijer
1
这个页面在此处说:“工作流中的每个作业都在虚拟机的新实例中执行”,因此我认为您无法通过这种方式在多个虚拟机之间保留数据。 - Hritik
2
这里有一个可行的解决方案 https://dev59.com/ClMH5IYBdhLWcg3w8l4D#57877438 - Hritik

5
在我的测试中,GitHub Actions 无法在作业之间保留文件。CircleCi可以,在那里你可以存储一些内容以在下一个作业中阅读,但在 GitHub Actions 上我不能这样做。
以下是我的测试:

在作业中编写文件,并尝试在下一个作业中读取

使用测试文件

1)GITHUB_WORKSPACE 上写入
我的路径:/home/runner/work/github-actions-test/github-actions-test)
结果:第一个作业上可读可写,但在第二个作业上为空。 操作链接

2)/github/home 上写入
我的路径:/github/home
结果:无法访问 '/github/home/ 操作链接

3)/home 上写入
我的路径:/home
结果:touch: 无法触碰 '/home/myFile.txt':权限被拒绝
操作链接


你有找到在步骤之间共享文件的解决方案吗? - Milind Singh
@MilindSingh 你试过上面的解决方案了吗?使用 /github/workspace - undefined
好的,我会在下面写一个答案。 - undefined

0
我尝试过actions/upload-artifact@v3,但对于像1GB这样的大文件,压缩和上传大约需要40分钟。
我建议使用actions/cache@v3来在作业之间共享文件,只需大约2分钟。

name: build-deploy

on:
  push:
    branches: [ production ]
  workflow_dispatch:

jobs:

  your-job-1:
      runs-on: ubuntu-latest
      name: 'build'

      steps:
      - name: Cache Build
        id: cache-build
        uses: actions/cache/save@v3
        with:
          path: ${{ github.workspace }}/your-folder-to-cache
          key: ${{ github.sha }}-your-cache-key

  your-job-2:
      runs-on: ubuntu-latest
      name: 'deploy'

      steps:
      - uses: actions/cache/restore@v3
        id: restore-build
        with:
          path: ${{ github.workspace }}/your-folder-to-cache
          key: ${{ github.sha }}-your-cache-key

  cleanup:
      runs-on: ubuntu-latest
      needs: ['your-job-1', 'your-job-2']
      name: 'cache cleanup'

      steps:
      - uses: adapttive/cache-delete
        with:
          github-token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
          cache-key: ${{ github.sha }}-your-cache-key 

另外,在部署后,你可以使用我的操作adapttive/cache-deletecleanup任务中删除缓存。

0

我认为actions/upload-artifact@v3是最新的解决方案。

  - name: Create a file
    run: echo "I won't live long" > my_file.txt

  - name: Upload Artifact
    uses: actions/upload-artifact@v3
    with:
      name: my-artifact
      path: my_file.txt
      retention-days: 5

实际案例 mdn/content 存储库:

  1. 构建和上传发生在 pr-test.yml
  2. 构建被下载并部署在 pr-review-companion.yml

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