如何使用私有存储库中存在的复合操作?

Dan*_*lan 11 github repository github-actions

我们对第三方服务进行了大量的健康检查。我们希望它们定期运行,因为当它们出现故障时,它会像代码中的错误一样影响我们的应用程序。知道“是他们而不是我们”可以显着减少故障排除时间。

我们已经通过 github 操作设置了此运行状况检查并计划运行,但我们希望每个第三方服务都有一个运行状况检查。这样,有关失败的 slack 消息将非常具体地说明发生了什么情况。但这会创建大量重复的 yml 内容。

我发现了一个叫做github 复合操作的东西,它似乎是为了解决这个问题,但我找不到有关复合操作是否可以存在于私有存储库中的信息。

uses密钥的文档仅在提及存储库时才提及公共存储库。有没有办法在私有存储库中进行复合操作并使用它?

我尝试制作他们的 hello world 示例,运行它,并且运行正确。然后我将操作存储库设为私有,并且使用操作构建的存储库失败并显示:

Unable to resolve action `user/repo@v1`, repository not found
Run Code Online (Sandbox Code Playgroud)

Ben*_* W. 12

更新(2023 年 2 月):现在无需跳过任何额外的障碍即可实现这一点,这使得Debos 的答案成为迄今为止最简单的方法。


gmode最近添加的答案使用 SSH 密钥而不是个人访问令牌,避免了 PAT 授予的权限过于广泛的问题,我建议使用该方法而不是我的答案中描述的方法。


原答案:

您必须首先使用个人访问令牌签出包含您的操作的存储库,然后使用签出位置的相对路径:

- name: Check out main repository
  uses: actions/checkout@v2

- name: Get composite run steps repository
  uses: actions/checkout@v2
  with:
    repository: myorg/myaction
    # Select revision
    ref: v1.0.0
    # Personal access token to check out private repository
    token: ${{ secrets.PAT_TOKEN }}
    # Indicate where to check action out to
    path: .github/myaction

- name: Run action from private repo
  uses: ./.github/myaction
Run Code Online (Sandbox Code Playgroud)

这假设这myaction是一个位于action.yml其根目录中的存储库。如果情况并非如此,则uses必须调整最后一步以使用正确的路径。

请注意,如果您使用dependentabot 更新操作,则私有操作引用将不会更新。

在未来的某个时候,来自内部存储库的操作将得到本机支持,请从 GitHub 路线图查看此问题,但是截至 2021 年 10 月,该问题已更新为“github enterprise”标志,这意味着它仅适用于GitHub 企业版用户。


gmo*_*ode 9

我使用了来自 GitHub 的复合操作小示例,并将其修改为使用基于本杰明出色答案构建的私人存储库。

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - uses: actions/checkout@v3
      - name: Get composite run steps repository
        uses: actions/checkout@v3
        with:
          # action file is located in another repo called workflows at /workflows/actions/action.yaml
          repository: my-org/workflows
          #  ref: mybranch  # in case it's not master branch
          # use deploy key instead of personal access token
          ssh-key: ${{ secrets.WORKFLOWS_DEPLOYMENT_KEY }}
          path: .github/workflows
      - id: foo
        uses: ./.github/workflows/actions
        with:
          who-to-greet: 'Mona the Octocat'
      - run: echo random-number ${{ steps.foo.outputs.random-number }}
        shell: bash
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • 不要使用个人访问令牌。不建议用于此用例。相反,请按照此处所述创建一个部署密钥来访问存储您的操作的一个特定存储库
  • 不要actions/checkout在复合操作 yaml 中使用。即使操作本身成功,后操作也会失败


小智 6

除非我错过了自 3 月 4 日以来的一些明显的事情,否则根据之前跟踪的问题,该功能在 dotcom 上已正式发布,从而使上述答案被取代。现在唯一的要求是包含组合的私有存储库允许从同一组织或企业中的其他存储库进行访问。我希望它有帮助。