44

I know that you can share artifacts between jobs of the same workflow...

But how can I share artifacts across different workflows?

Daniel Mann
  • 57,011
  • 13
  • 100
  • 120
Hitmands
  • 13,491
  • 4
  • 34
  • 69

6 Answers6

39

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

Tobbe
  • 3,282
  • 6
  • 41
  • 53
  • Just noting that it's important to use this action and not the official github one - I did not realise at first that the Github download artifact action requires the artifact to be in the same workflow run – Tim Trewartha Nov 30 '22 at 15:30
  • 1
    if the workflow is reusable, how do I setup the `with.workflow` ? – Dimitri Kopriwa Dec 01 '22 at 13:44
5

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 }}'
            })
cmbuckley
  • 40,217
  • 9
  • 77
  • 91
Maria Ines Parnisari
  • 16,584
  • 9
  • 85
  • 130
  • 1
    this looks more like a comment, and yes, as others pointed out, that is an option too... Things have also evolved in the past 2 years and now you have reusable workflows and workflow calls that accept inputs – Hitmands Oct 31 '22 at 07:28
  • @Hitmands i posted this as an answer because it's the most up-to-date solution – Maria Ines Parnisari Nov 14 '22 at 05:44
  • 2
    I would love to see more context around this. I don't see who it's doable without using 3rd party https://github.com/dawidd6/action-download-artifact action at the time of writing. GitHub still has the issue to share artifacts between workflows open. – demisx Dec 08 '22 at 20:01
  • 2
    @demisx added code examples :) – Maria Ines Parnisari Feb 28 '23 at 17:36
  • I tried this using two different workflows, and it most definitely does not work. – Matimus Mar 16 '23 at 23:46
  • 1
    This does work, but only if the dependent workflow fires on a `workflow_run` event. See [reusing workflows](https://docs.github.com/en/actions/using-workflows/reusing-workflows). – cmbuckley Mar 17 '23 at 21:58
  • 2
    Answer should be edited to explain in which circumstances this does currently work, as it does not address the general question. – WoodyWoodsta Apr 14 '23 at 14:26
3

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.

https://help.github.com/en/actions/configuring-and-managing-workflows/persisting-workflow-data-using-artifacts#sharing-data-between-workflow-runs

Community
  • 1
  • 1
Hitmands
  • 13,491
  • 4
  • 34
  • 69
1

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.

Dharman
  • 30,962
  • 25
  • 85
  • 135
0

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.

Jens
  • 8,423
  • 9
  • 58
  • 78
0

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