107

尝试使用 Github 的 beta 操作时,我有两份工作,一份负责构建代码,另一份负责部署代码。但是,我似乎无法在部署工作中获得构建工件。

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

第一个作业 (build) 有一个 build 目录,但是当第二个作业 (deploy) 运行时它没有并且只包含源代码。

这个项目是一个单声道存储库,其中的代码我试图部署在路径下,server因此所有的working-directory标志。

4

4 回答 4

82

您可以使用 Github Actions upload-artifact 和 download-artifact 在作业之间共享数据。

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

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

于 2019-09-10T19:56:36.153 回答
16

如果您使用上传/下载 GitHub Actions,请注意工件的结构。

从 2020 年 1 月开始,请参阅“ GitHub Actions:对工件下载体验的更改”:

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

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

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

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

file1.txt
dir1/
|-- dir1-file1.txt
于 2020-01-14T21:46:39.503 回答
14

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

于 2020-12-19T11:22:13.543 回答
1

使用缓存或工件上传/下载

缓存用于在作业或工作流之间重用数据/文件,而工件用于在工作流结束后保存文件。

于 2022-02-24T11:30:20.567 回答