About workflow artifacts
Artifacts allow you to persist data after a job has completed, and share that data with another job in the same workflow. An artifact is a file or collection of files produced during a workflow run. For example, you can use artifacts to save your build and test output after a workflow run has ended. For pushes and pull requests, GitHub stores artifacts for 90 days. The retention period for a pull request restarts each time someone pushes a new commit to the pull request.
These are some of the common artifacts that you can upload:
- Log files and core dumps
- Test results, failures, and screenshots
- Binary or compressed files
- Stress test performance output and code coverage results
Storing artifacts uses storage space on GitHub. GitHub Actions usage is free for public repositories. For private repositories, each GitHub account receives a certain amount of free minutes and storage, depending on the product used with the account. For more information, see "Managing billing for GitHub Actions."
Artifacts are uploaded during a workflow run, and you can view an artifact's name and size in the UI. When an artifact is downloaded using the GitHub UI, all files that were individually uploaded as part of the artifact get zipped together into a single file. This means that billing is calculated based on the size of the uploaded artifact and not the size of the zip file.
GitHub provides two actions that you can use to upload and download build artifacts. For more information, see the actions/upload-artifact and download-artifact actions.
For GitHub-hosted runners, each job in a workflow runs in a fresh instance of a virtual environment. When the job completes, the runner terminates and deletes the instance of the virtual environment.
To share data between jobs:
- Uploading files: Give the uploaded file a name and upload the data before the job ends.
- Downloading files: You can only download artifacts that were uploaded during the same workflow run. When you download a file, you can reference it by name.
The steps of a job share the same environment on the runner machine, but run in their own individual processes. To pass data between steps in a job, you can use inputs and outputs. For more information about inputs and outputs, see "Metadata syntax for GitHub Actions."
Passing data between jobs in a workflow
You can use the upload-artifact and download-artifact actions to share data between jobs in a workflow. This example workflow illustrates how to pass data between jobs in the same workflow. For more information, see the actions/upload-artifact and download-artifact actions.
Jobs that are dependent on a previous job's artifacts must wait for the dependent job to complete successfully. This workflow uses the needs keyword to ensure that job_1, job_2, and job_3 run sequentially. For example, job_2 requires job_1 using the needs: job_1 syntax.
Job 1 performs these steps:
- Performs a math calculation and saves the result to a text file called
math-homework.txt. - Uses the
upload-artifactaction to upload themath-homework.txtfile with the namehomework. The action places the file in a directory namedhomework.
Job 2 uses the result in the previous job:
- Downloads the
homeworkartifact uploaded in the previous job. By default, thedownload-artifactaction downloads artifacts to the workspace directory that the step is executing in. You can use thepathinput parameter to specify a different download directory. - Reads the value in the
homework/math-homework.txtfile, performs a math calculation, and saves the result tomath-homework.txt. - Uploads the
math-homework.txtfile. This upload overwrites the previous upload because both of the uploads share the same name.
Job 3 displays the result uploaded in the previous job:
- Downloads the
homeworkartifact. - Prints the result of the math equation to the log.
The full math operation performed in this workflow example is (3 + 7) x 9 = 90.
name: Share data between jobs
on: [push]
jobs:
job_1:
name: Add 3 and 7
runs-on: ubuntu-latest
steps:
- shell: bash
run: |
expr 3 + 7 > math-homework.txt
- name: Upload math result for job 1
uses: actions/upload-artifact@v1
with:
name: homework
path: math-homework.txt
job_2:
name: Multiply by 9
needs: job_1
runs-on: windows-latest
steps:
- name: Download math result for job 1
uses: actions/download-artifact@v1
with:
name: homework
- shell: bash
run: |
value=`cat homework/math-homework.txt`
expr $value \* 9 > homework/math-homework.txt
- name: Upload math result for job 2
uses: actions/upload-artifact@v1
with:
name: homework
path: homework/math-homework.txt
job_3:
name: Display results
needs: job_2
runs-on: macOS-latest
steps:
- name: Download math result for job 2
uses: actions/download-artifact@v1
with:
name: homework
- name: Print the final result
shell: bash
run: |
value=`cat homework/math-homework.txt`
echo The result is $value

Sharing data between workflow runs
After a workflow ends, you can download a compressed file of the uploaded artifacts on GitHub by finding the workflow run in the Actions tab. You can also use the GitHub REST API to download artifacts. For more information, see "Artifacts."
If you need to access artifacts from a previous workflow run, you'll need to store the artifacts somewhere. For example, you could run a script at the end of your workflow to store build artifacts on Amazon S3 or Artifactory, and then use the storage service's API to retrieve those artifacts in a future workflow.
Uploading build and test artifacts
You can create a continuous integration (CI) workflow to build and test your code. For more information about using GitHub Actions to perform CI, see About continuous integration.
The output of building and testing your code often produces files you can use to debug test failures and production code that you can deploy. You can configure a workflow to build and test the code pushed to your repository and report a success or failure status. You can upload the build and test output to use for deployments, debugging failed tests or crashes, and viewing test suite coverage.
You can use the upload-artifact action to upload artifacts. For more information, see the actions/upload-artifact action.
Example
For example, your repository or a web application might contain SASS and TypeScript files that you must convert to CSS and JavaScript. Assuming your build configuration outputs the compiled files in the dist directory, you would deploy the files in the dist directory to your web application server if all tests completed successfully.
|-- hello-world (repository)
| └── dist
| └── tests
| └── src
| └── sass/app.scss
| └── app.ts
| └── output
| └── test
|
This example shows you how to create a workflow for a Node.js project that builds the code in the src directory and runs the tests in the tests directory. You can assume that running npm test produces a code coverage report named code-coverage.html stored in the output/test/ directory.
The workflow uploads the production artifacts in the dist directory and the code-coverage.html as two separate artifacts.
name: Node CI
on: [push]
jobs:
build_and_test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
npm test
- name: Archive production artifacts
uses: actions/upload-artifact@v1
with:
name: dist
path: dist
- name: Archive code coverage results
uses: actions/upload-artifact@v1
with:
name: code-coverage-report
path: output/test/code-coverage.html

Downloading or deleting artifacts
You can download artifacts that were uploaded during a workflow. Artifacts automatically expire after 90 days, but you can always reclaim used GitHub Actions storage by deleting artifacts before they expire on GitHub.
Warning: Once you delete an artifact, it can not be restored.
- On GitHub, navigate to the main page of the repository.
- Under your repository name, click Actions.

- In the left sidebar, click the workflow you want to see.

- Under "Workflow runs", click the name of the run you want to see.

- To download artifacts, use the Artifacts drop-down menu, and select the artifact you want to download.

- To delete artifacts, use the Artifacts drop-down menu, and click .
