Github动作在作业之间共享工作空间/工件?

时间:2019-08-14 16:24:50

标签: github continuous-integration github-actions

尝试使用Github的beta操作,我有两项工作,一项工作是构建代码,然后一项将部署代码。但是,我似乎无法在部署作业中获得构建工件。

我最近的尝试是为每个作业手动设置具有相同卷数的容器映像,根据文档,这应该是解决方案:https://help.github.com/en/articles/workflow-syntax-for-github-actions#jobsjob_idcontainervolumes

  

设置容器要使用的卷阵列。您可以使用卷在服务或作业中的其他步骤之间共享数据。您可以指定命名的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

第一个作业(构建)具有一个构建目录,但是当第二个作业(部署)运行时,它没有并且仅包含源代码。

该项目是一个单声道仓库,其代码我尝试将其部署在路径server下,因此带有所有working-directory标志。

3 个答案:

答案 0 :(得分:12)

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

在工作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

https://github.com/actions/upload-artifact
https://github.com/actions/download-artifact

答案 1 :(得分:9)

如果您使用的是上传/下载GitHub Action,请当心构件的结构。

从2020年1月开始,请参阅“ GitHub Actions: Changes to artifact download experience”:

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

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

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

现在,您将获得一个存档,其中仅包含您上载的文件和文件夹:

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

答案 2 :(得分:3)

对于那些有兴趣在两个作业之间共享 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

非常受https://github.com/unfor19/install-aws-cli-action/actions/runs/400601222/workflow

的启发

谢谢@unfor19