Github操作在作业之间共享工作区/工件?

Github操作在作业之间共享工作区/工件?,github,continuous-integration,github-actions,Github,Continuous Integration,Github Actions,尝试使用Github的测试版操作时,我有两项工作,一项是构建代码,另一项是部署代码。然而,我似乎无法在部署作业中获得构建工件 我最近的一次尝试是为每个作业手动设置具有相同卷的容器映像,根据文档,这应该是一个解决方案: 设置容器要使用的卷数组。您可以使用卷在作业中的服务或其他步骤之间共享数据。您可以指定主机上的命名Docker卷、匿名Docker卷或绑定装载 工作流 name: CI on: push: branches: - master paths: - .

尝试使用Github的测试版操作时,我有两项工作,一项是构建代码,另一项是部署代码。然而,我似乎无法在部署作业中获得构建工件

我最近的一次尝试是为每个作业手动设置具有相同卷的容器映像,根据文档,这应该是一个解决方案:


设置容器要使用的卷数组。您可以使用卷在作业中的服务或其他步骤之间共享数据。您可以指定主机上的命名Docker卷、匿名Docker卷或绑定装载

工作流

name: CI
on:
  push:
    branches:
    - master
    paths:
    - .github/workflows/server.yml
    - server/*
jobs:
  build:
    runs-on: ubuntu-latest
    container:
      image: docker://node:10
      volumes:
      - /workspace:/github/workspace
    steps:
    - uses: actions/checkout@master
    - run: yarn install
      working-directory: server
    - run: yarn build
      working-directory: server
    - run: yarn test
      working-directory: server
    - run: ls
      working-directory: server
  deploy:
    needs: build
    runs-on: ubuntu-latest
    container:
      image: docker://google/cloud-sdk:latest
      volumes:
      - /workspace:/github/workspace
    steps:
      - uses: actions/checkout@master
      - run: ls
        working-directory: server
      - run: gcloud --version
第一个作业(build)有一个build目录,但当第二个作业(deploy)运行时,它没有,只包含源代码


这个项目是一个mono repo,我试图部署的代码位于路径
服务器下,因此所有
工作目录都有标记。

您可以使用Github操作上载工件和下载工件在作业之间共享数据

在作业1中:

steps:
- uses: actions/checkout@v1

- run: mkdir -p path/to/artifact

- run: echo hello > path/to/artifact/world.txt

- uses: actions/upload-artifact@master
  with:
    name: my-artifact
    path: path/to/artifact
和工作2:

steps:
- uses: actions/checkout@master

- uses: actions/download-artifact@master
  with:
    name: my-artifact
    path: path/to/artifact
    
- run: cat path/to/artifact/world.txt


如果您正在使用上载/下载GitHub操作,请注意工件的结构

从2020年1月开始,请参见“”:

我们已经更改了GitHub Actions中的工件下载体验,因此它不再向下载的归档文件添加额外的根目录

以前,如果您将以下文件和文件夹作为名为
foo
的工件上载,则下载的存档将包含以下结构:

foo/
 |-- file1.txt
 |-- dir1/
 |    |-- dir1-file1.txt
现在,您将获得一个仅包含您上载的文件和文件夹的存档:

file1.txt
dir1/
|-- dir1-file1.txt

对于那些有兴趣在两份工作之间共享Docker图像的人,我是这样做的:

jobs:
  docker-build:
    name: Docker build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Build Docker image
        run: |
          docker build -t foo/bar:$GITHUB_SHA
          mkdir -p path/to/artifacts
          docker save foo/bar:$GITHUB_SHA > path/to/artifacts/docker-image.tar
          
      - name: Temporarily save Docker image
        uses: actions/upload-artifact@v2
        with:
          name: docker-artifact
          path: path/to/artifacts
          retention-days: 1

  docker-deploy:
    name: Deploy to Docker Hub
    runs-on: ubuntu-latest
    needs: docker-build
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Retrieve saved Docker image
        uses: actions/download-artifact@v2
        with:
          name: docker-artifact
          path: path/to/artifacts

      - name: Docker load
        run: |
          cd path/to/artifacts
          docker load < docker-image.tar
          # docker_build_push.sh
作业:
docker build:
名称:Docker build
运行于:ubuntu最新版本
步骤:
-姓名:结帐
用途:行动/checkout@v2
-名称:构建Docker映像
运行:|
码头工人建造-t foo/bar:$GITHUB_SHA
mkdir-p路径/到/工件
docker save foo/bar:$GITHUB_SHA>path/to/artifacts/docker-image.tar
-名称:临时保存Docker映像
用途:操作/上传-artifact@v2
与:
名称:docker工件
路径:路径/到/工件
保留天数:1
docker部署:
名称:部署到Docker Hub
运行于:ubuntu最新版本
需求:docker build
步骤:
-姓名:结帐
用途:行动/checkout@v2
-名称:检索保存的Docker图像
用途:操作/下载-artifact@v2
与:
名称:docker工件
路径:路径/到/工件
-名称:Docker load
运行:|
cd路径/到/工件
docker加载
非常受启发


Merci@unform19

请参见-假设“每个作业都在runs on指定的虚拟环境的新实例中运行”。我的猜测(我不是beta版,所以我只是猜测)是部署作业要么需要成为
构建
作业中的一个步骤,要么需要在新容器中再次复制
构建
步骤。(可能减去
纱线测试步骤,因为你已经知道它成功了)。你有没有找到答案?我也在想怎么做。。据我所知,作业应该共享工作区文件系统,但事实似乎并非如此。@Joseph nope,我只是在运行一个作业并使用自定义docker映像。我认为问题在于GitHub,可能是由于从HCL到YML语法的转换。奇怪的是,他们计划在9月底停止HCL,而在工作之间共享人工制品的基本能力还没有发挥作用。希望在一个月后,问题会得到解决。“您可以使用卷在服务或作业中的其他步骤之间共享数据。”这意味着在单个作业中的步骤之间共享数据。它不用于在步骤或工作流之间共享数据。您现在还可以删除工件:对于遇到此问题并想知道如何避免弄乱您的工件的任何人,因为github没有提供相应的操作:有几个社区操作,例如@AlanPlum Well。我们现在使用参数
保留天数
清理工件。我会更新我的答案。谢谢