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

Posted

技术标签:

【中文标题】是否可以在 GitHub Actions 中的 Actions 之间保留 WORKDIR?【英文标题】:Is it possible to persist a WORKDIR between Actions in GitHub Actions? 【发布时间】:2019-06-26 06:03:54 【问题描述】:

今天早上我收到了我的 GitHub Actions BETA 邀请 (wooo) 并开始使用它,目的是迁移我目前在 CircleCI 上运行的一些简单的构建、测试和部署管道。

我仍在尝试了解 Actions,但我想到的流程是,在推送之后,工作流中的第一个 Action 将启动 Docker 容器。在该容器内,我将运行一些简单的构建过程,例如最小化资产和移除人工制品。然后,下一个 Action 将对构建运行一些测试。管道中的下一个操作将部署到多个环境之一,具体取决于我推送到的分支。

我遵循了https://developer.github.com/actions/creating-github-actions/creating-a-docker-container/ 的文档,并有一个基本的工作流程,可以启动 Docker 容器并在WORKDIR 中运行一些构建命令。我也可以在 WORKDIR 内部运行部署(通过 rsync)。

但是,我想将其拆分为单独的步骤/操作,但我无法找到解决此问题的方法。

基本上,这类似于我正在使用的 CircleCI 工作/工作流模型。但是,使用 CircleCI,第一个作业会运行构建,然后在整个工作流程的其余部分中保留生成的目录结构,如下所示:

# Persist dist directory
  - persist_to_workspace:
      root: ~/project
      paths:
        - .

所以,我在这里将 CircleCI 的 Jobs 等同于 GitHub 的 Actions,这可能是错误的做法吗?从本质上讲,我想知道的是我是否可以在第一个 Action 的 Docker 容器中保留 WORKDIR 并使其 WORKDIR 可用于后续 Action。

这可能吗,还是我想象中的 GitHub Actions 可以做的事情离我很远?

谢谢!

【问题讨论】:

【参考方案1】:

自己回答这个问题,以防其他人遇到这个问题(并且像我一样,没有完全阅读文档!)。 :o)

文档here 进行了解释,但本质上,您作为操作的一部分启动的任何容器的工作目录都以/github/workspace 存在。 Actions 可以修改这个工作目录的内容,并且当在工作流的后续操作中启动容器时,这些操作/容器的工作目录将包含工作流之前所做的修改。

所以,答案是肯定的,Docker WORKDIR /github/workspace 在整个 GitHub Actions 工作流程中持续存在,其方式与在 CircleCI 工作流程中持续存在的方式类似。

【讨论】:

如果您可以在作业之间保留工作区,同时使用job.needs 并行运行作业以获得更快的反馈(不必多次运行昂贵的yarn installyarn build 步骤,例如)。 我认为这个功能已经改变了。我很想尝试这个,但不幸的是,我认为工作不再持久。 我和@JaKXz 在同一条船上。如果我能有一份工作来做checkout && npm install,并使用needs 来做其他工作来检查、检查类型并最终构建项目,那就太好了。这仍然不可能吗? here 页面显示“工作流中的每个作业都在虚拟机的新实例中执行”,所以我认为您不能通过这种方式在多个虚拟机之间保存数据。 这是一个有效的解决方案***.com/a/57877438/2251364【参考方案2】:

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

接下来,我的测试:

在一个作业上写入文件,在下一个尝试读取

使用test file。

1) 写在GITHUB_WORKSPACE 我的路径:/home/runner/work/github-actions-test/github-actions-test) 结果:第一份工作可写和可读,但第二份工作为空 Action link

2) 写在/github/home 我的路径:/github/home 结果:cannot access '/github/home/ Action link

3) 写在/home 我的路径:/home 结果:touch: cannot touch '/home/myFile.txt': Permission deniedAction link

【讨论】:

以上是关于是否可以在 GitHub Actions 中的 Actions 之间保留 WORKDIR?的主要内容,如果未能解决你的问题,请参考以下文章

[,foreach和github-actions中的其他循环

在 Github Actions 中创建动态密钥名称

如何从 GitHub Actions 克隆 BitBucket 项目?

检查 GitHub Actions 工作流程中的对象是不是为空

如何在本地运行 GitHub Actions 工作流程?

使用GitHub Actions自动构建DockerHub镜像