簡體   English   中英

GitHub 操作 - 空環境機密

[英]GitHub Actions - empty env secrets

我已經開始使用 GitHub 操作,但我在努力訪問我作為 env 傳遞的存儲庫機密。

我的工作流程文件:

name: Invite

on: 
  pull_request:
    branches: [master]
    types: [closed]
jobs:
  invite:
    runs-on: ubuntu-latest
    steps:
      - name: Hello world action
        uses: lekterable/inclusive-organization-action@master
        env:
          SECRET_TOKEN: ${{ secrets.SECRET_TOKEN }}
          organization: string
          SUPER_SECRET: ${{ secrets.SUPER_SECRET }}

動作索引文件

const core = require('@actions/core')
const github = require('@actions/github')

const run = async () => {
  try {
    ...
    console.log('env', process.env)
    const token = process.env.SECRET_TOKEN
    const secret = process.env.SUPER_SECRET
    const organization = process.env.organization
    console.log('organization', organization)
    console.log('token?', !!token)
    console.log('secret?', !!secret)
    console.log('token length', token.length)
    ...
  } catch (error) {
    core.setFailed(error.message)
  }
}

run()

如您所見,我正在傳遞 3 個 env,具有“字符串”值的組織按預期存在,但 SECRET_TOKEN 和 SUPER_SECRET 為空。

在此處輸入圖像描述

是的,我確實在運行該操作的存儲庫中設置了秘密:

在此處輸入圖像描述

有什么我做錯了嗎?

更新

雖然下面的原始答案仍然適用於公共存儲庫,但有一些新的更新可能對某些用例有所幫助。

  • 如果您的存儲庫是私有的,您現在可以從復刻啟用工作流

  • 如果您的存儲庫是公共的,則有一個不受任何令牌限制的新pull_request_target事件。

原始答案

您遇到此行為的原因是Invite工作流是由來自分叉存儲庫的拉取請求觸發的。

除了 GITHUB_TOKEN 之外,當從分叉存儲庫觸發工作流時,秘密不會傳遞給運行器。

發生這種情況時,工作流的actor是打開拉取請求的用戶。 如果該用戶沒有對您的存儲庫的寫入權限,則他們不能使用機密(除GITHUB_TOKEN )。

對存儲庫具有寫入權限的任何人都可以創建、讀取和使用機密。

參考: https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets#using-encrypted-secrets-in-a-workflow

如果您在工作流程中運行此步驟,您會發現它與您的操作無關。 TEST_SECRET秘密在工作流中也將不可用。

      - name: Test
        env:
          TEST_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TEST_SECRET: ${{ secrets.TEST_SECRET }}
        run: |
          echo ${#TEST_GITHUB_TOKEN}
          echo ${#TEST_SECRET}

測試來自分叉的拉取請求的秘密

檢查 GitHub 上下文中的事件數據,您會看到actor是派生存儲庫並打開拉取請求的用戶。

      - name: Dump GitHub context
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
        run: echo "$GITHUB_CONTEXT"

這是 GitHub 工作人員回答的一個不同但相關的問題,其中解釋說存在對分叉存儲庫的這些限制是為了“防止惡意行為者使用操作來毒害上游或下游存儲庫”。

我找到了一個解決方案,我解決它的方法不是在關閉 PR 時運行操作,而是在 master 上的新提交上運行它,這必須由具有“寫權限”的人觸發因此,repo 可以訪問 repo 機密。

檢查提交是否是合並提交有點困難,我們必須明確獲取有關 PR 的更多信息,但它有效。 如果有人感興趣,我嘗試構建的操作的源代碼: https://github.com/lekterable/inclusive-organization-action

我已經實施了https://stackoverflow.com/a/61450807/177275中記錄的解決方法來解決這些類型的問題。 本質上,在 PR 上運行的操作會創建一些工件,然后每 5 分鍾運行一次的 cron 作業會掃描這些工件並對其進行操作。 我使用它將構建結果作為評論發布到拉取請求頁面,但您可以將相同的方法應用於其他用例。

要達到預期的效果,請使用 Github 操作工具包,即 @actions/core

const core = require('@actions/core');
//myToken: ${{ secrets.GITHUB_TOKEN }
const myToken = core.getInput('myToken');

有關更多詳細信息,請參閱此鏈接https://github.com/actions/toolkit/pull/131/commits/87bfae207900deafa6d0f4013761df37835c433f Z5E056C500A1C4B6A7110B50Dsaction/7BADE.com
https://github.com/actions/toolkit/blob/master/packages/core

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM