I know that you can share artifacts between jobs of the same workflow...
But how can I share artifacts across different workflows?
I know that you can share artifacts between jobs of the same workflow...
But how can I share artifacts across different workflows?
GitHub has now added a REST API for downloading artifacts. Basically you do
GET repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}
And then you'll have to look for Location:
in the response, and then access that url to download the artifact. The url is valid for 1 minute.
There's a GitHub Action that uses the API above that you can easily add to your workflow. I use it like this
- name: Download artifact
uses: dawidd6/action-download-artifact@v2
with:
workflow: ${{ github.event.workflow_run.workflow_id }}
workflow_conclusion: success
Read more about it here: https://github.com/dawidd6/action-download-artifact
I've been able to use actions/upload-artifact and actions/download-artifact to share data between workflows, without the need for 3rd party actions.
For example: microservice-A_pull_request.yml
on: workflow_run
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- ...
- name: Test Functional
run: make test-microservice-a-functional
- name: Store code coverage file
uses: actions/upload-artifact@v3
with:
name: coveragemicroservicea-${{ github.sha }}
path: coveragemicroservicea.out
And then main.yml
:
name: PR
on:
pull_request:
branches:
- master
jobs:
microserviceAPR:
uses: auth0/sandcastle/.github/workflows/microservice-A_pull_request.yml@master
secrets: inherit
microserviceBPR:
uses: auth0/sandcastle/.github/workflows/microservice-B_pull_request.yml@master
secrets: inherit
coverage:
runs-on: ubuntu-latest
needs: [microserviceAPR, microserviceBPR]
timeout-minutes: 5
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Install Go
uses: actions/setup-go@v3
with:
go-version-file: './go.mod'
- uses: actions/download-artifact@v3
with:
name: coveragemicroservicea-${{ github.sha }}
- uses: actions/download-artifact@v3
with:
name: coveragemicroserviceb-${{ github.sha }}
- name: Merge coverage files
id: getcoverage
run: |
output=$(make get-coverage)
echo "coverage=$output" >> $GITHUB_OUTPUT
- name: Comment on PR
uses: actions/github-script@v6
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '${{ steps.getcoverage.outputs.coverage }}'
})
Probably not yet doable:
After a workflow ends, you can download an archive of the uploaded artifacts on GitHub by finding the workflow run in the Actions tab. GitHub does not currently offer a REST API to retrieve uploaded artifacts.
If you need to access artifacts from a previously run workflow, 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.
Just for posterity.
I wanted to share some lightweight contextual strings amongst workflows and created this https://github.com/marcoslopes/git-notes-action.
My specific use-case was to have different workflows dealing with build and deploy. Build would create an ami with packer and Deploy use that created image to be deployed with terraform.
As I am writing this I realise I could have added the sha as a tag on the image itself and search for it through the cli, oh well.
Looks like the related feature issue is download-artifact/issues#3, which references the dawidd6/action-download-artifact action that @Tobbe mentions in his accepted answer above.
Use Github Cli to download artifacts.
steps:
- uses: actions/checkout@v3
- name: Github cli Bolivia
env:
GH_TOKEN: ${{ github.token }}
run: | # gh run download RUN_ID -n ARTIFACT_NAME
gh run download 5268888888 -n downloader-artifact