Github 动作在作业之间共享 workspace/artifacts?
Github actions share workspace/artifacts between jobs?
尝试使用 Github 的 beta 操作,我有两项工作,一项是构建代码,另一项是部署代码。但是,我似乎无法在部署作业中获取构建工件。
我最近的尝试是为每个作业手动设置一个具有相同卷的容器镜像,根据文档,这应该是解决方案:https://help.github.com/en/articles/workflow-syntax-for-github-actions#jobsjob_idcontainervolumes
Sets an array of volumes for the container to use. You can use volumes to share data between services or other steps in a job. You can specify named Docker volumes, anonymous Docker volumes, or bind mounts on the host.
工作流程
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
标志。
您可以使用 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
https://github.com/actions/upload-artifact
https://github.com/actions/download-artifact
如果您正在使用 upload/download GitHub 操作,请注意工件的结构。
从 2020 年 1 月开始,请参阅“GitHub Actions: Changes to artifact download experience”:
We have changed the artifact download experience in GitHub Actions so it no longer adds an extra root directory to the downloaded archive.
Previously, if you uploaded the following files and folders as an artifact named foo
, the downloaded archive would contain the following structure:
foo/
|-- file1.txt
|-- dir1/
| |-- dir1-file1.txt
Now, you will get an archive that only contains the files and folders you uploaded:
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
深受启发 https://github.com/unfor19/install-aws-cli-action/actions/runs/400601222/workflow
谢谢@unfor19
使用Cache or Artifacts Upload/Download
缓存用于在作业或工作流之间re-usedata/files,而工件用于保存文件工作流程结束后。
尝试使用 Github 的 beta 操作,我有两项工作,一项是构建代码,另一项是部署代码。但是,我似乎无法在部署作业中获取构建工件。
我最近的尝试是为每个作业手动设置一个具有相同卷的容器镜像,根据文档,这应该是解决方案:https://help.github.com/en/articles/workflow-syntax-for-github-actions#jobsjob_idcontainervolumes
Sets an array of volumes for the container to use. You can use volumes to share data between services or other steps in a job. You can specify named Docker volumes, anonymous Docker volumes, or bind mounts on the host.
工作流程
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
标志。
您可以使用 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
https://github.com/actions/upload-artifact
https://github.com/actions/download-artifact
如果您正在使用 upload/download GitHub 操作,请注意工件的结构。
从 2020 年 1 月开始,请参阅“GitHub Actions: Changes to artifact download experience”:
We have changed the artifact download experience in GitHub Actions so it no longer adds an extra root directory to the downloaded archive.
Previously, if you uploaded the following files and folders as an artifact named
foo
, the downloaded archive would contain the following structure:foo/ |-- file1.txt |-- dir1/ | |-- dir1-file1.txt
Now, you will get an archive that only contains the files and folders you uploaded:
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
深受启发 https://github.com/unfor19/install-aws-cli-action/actions/runs/400601222/workflow
谢谢@unfor19
使用Cache or Artifacts Upload/Download
缓存用于在作业或工作流之间re-usedata/files,而工件用于保存文件工作流程结束后。