在工作流/ Github Actions 之间共享构件

46

我知道你可以在同一工作流程的不同作业之间共享构件...

但是,我如何在不同的工作流程之间共享构件?


据我所知,这已经被列入路线图了:https://github.com/github/roadmap/issues/755 - WoodyWoodsta
6个回答

41

GitHub现在添加了一个REST API用于下载构件。基本上,您可以这样做:

GET repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}

然后你需要在响应中查找Location:,并访问该URL以下载工件。该URL有效期为1分钟。

有一个GitHub Action使用上述API,您可以轻松地将其添加到您的工作流程中。我使用它的方式如下

- name: Download artifact
  uses: dawidd6/action-download-artifact@v2
  with:
    workflow: ${{ github.event.workflow_run.workflow_id }}
    workflow_conclusion: success

在这里阅读更多相关信息:https://github.com/dawidd6/action-download-artifact


只是注意到使用这个操作很重要,而不是官方的Github操作 - 我起初没有意识到Github下载工件操作需要在同一工作流运行中使用工件。 - Tim Trewartha
1
如果工作流程是可重复使用的,我该如何设置 with.workflow - Dimitri Kopriwa

5

我已经能够使用actions/upload-artifactactions/download-artifact在工作流之间共享数据,而无需使用第三方操作。

例如: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

然后是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 }}'
            })

1
这似乎更像是一条注释,是的,正如其他人指出的那样,这也是一个选项...在过去的两年中,事情也发生了变化,现在你有可重用的工作流和接受输入的工作流调用。 - Hitmands
2
我希望能看到更多关于这个问题的上下文。在撰写本文时,我认为没有使用第三方https://github.com/dawidd6/action-download-artifact操作是不可行的。GitHub仍然存在工作流之间共享构件的问题。 - demisx
2
@demisx 添加了代码示例 :) - Maria Ines Parnisari
1
这是有效的,但只有在依赖的工作流程触发 workflow_run 事件时才会生效。请参见 重新使用工作流程 - cmbuckley
2
请编辑答案以解释当前情况下它是如何工作的,因为它并没有回答一般性问题。 - WoodyWoodsta
显示剩余3条评论

3

可能目前还无法实现:

当工作流结束时,您可以在“Actions”选项卡中找到工作流运行记录并下载上传的工件的存档文件。GitHub目前没有提供REST API以检索上传的工件。

如果您需要访问以前运行的工作流程的工件,则需要将这些工件存储在某个位置。例如,您可以在工作流程结束时运行一个脚本,将构建工件存储在Amazon S3或Artifactory上,然后使用存储服务的API在未来的工作流程中检索这些工件。

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


1

仅为了记录。

我想在工作流程之间共享一些轻量级的上下文字符串,并创建了这个https://github.com/marcoslopes/git-notes-action

我的具体用例是有不同的工作流程处理构建和部署。 构建将使用packer创建ami,而部署将使用创建的映像进行部署terraform。

当我写这篇文章时,我意识到我本可以将sha添加为图像本身的标记,并通过cli搜索它,哦好吧。


1
使用Github Cli下载构件。
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 

这个答案会受益于对如何获取感兴趣的作业的RUN_ID进行解释。硬编码它似乎不是一个可行的解决方案。不过,感谢您展示了这种可能的方法。 - undefined

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接