在 GitHub Action Workflow 中安装 GitHub 存储库

Posted

技术标签:

【中文标题】在 GitHub Action Workflow 中安装 GitHub 存储库【英文标题】:Install GitHub repo within GitHub Action Workflow 【发布时间】:2020-09-19 04:47:41 【问题描述】:

我正在尝试构建一个 GitHub 操作工作流,其中涉及安装存在于其他私人代表中的依赖项。我已经尝试了各种排列方式(我现在有点迷失了方向)但我无法让它们中的任何一个起作用。

我创建了一个秘密,存储在 TOKEN_GITHUB 中,授予对其他存储库的访问权限,因此我可以正确安装,因为我相信提供的只是当前代表的范围。

这是一个示例 GitHub 工作流文件,它最终通过 CDK 部署多个 Lambda,但为简单起见,我将其排除在外:deploy.yml

name: Lint, Audit, Test & Deploy

on:
    push:
        branches: [master]

jobs:
    build:
        runs-on: ubuntu-latest
        if: "!contains(github.event.head_commit.message, 'ci skip')"

        steps:
            - uses: actions/checkout@v2
            - uses: actions/setup-node@v1
              with:
                  node-version: 12
            - name: getList Lambda
              run: |
                  cd lambdas
                  cd getList
                  npm ci
                  npm audit --production --audit-level=moderate
            - name: getItem Lambda
              run: |
                  cd lambdas
                  cd getItem
                  npm ci
                  npm audit --production --audit-level=moderate
            - name: saveItem Lambda
              run: |
                  cd lambdas
                  cd saveItem
                  npm ci
                  npm audit --production --audit-level=moderate


所以基本上这在npm cigetList lambda 期间失败了。我遇到了各种错误,例如:

npm 错误! git@github.com:权限被拒绝(公钥)。 npm 错误!致命:无法从远程存储库读取。

我的 getList lambda 的 package.json 看起来像:


    "name": "getList",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": 
        "test": "jest"
    ,
    "dependencies": 
        "dotenv": "^8.2.0",
        "mongodb": "^3.5.7",
        "get-db": "MyUsername/getDB"
    ,
    "devDependencies": 
        "jest": "^26.0.1"
    

我也尝试在 package.json 文件中包含 username:token,尽管我不喜欢将我的令牌放在他们的而不是秘密中,但这无论如何都不起作用。我还尝试使用https 路径安装 npm:

https://x-oauth-basic@github.com/MyUsername/getDB.git

带有 gitconfig 行 git config --global url."https://$secrets.TOKEN_GITHUB:x-oauth-basic@github.com/".insteadOf https://x-oauth-basic@github.com/

谁能看到我在这里做错了什么?唯一想到的可能是设置gitconfig 不跨步骤共享?

值得注意的是,我的所有步骤都需要安装私有依赖项,这就是我以这种方式拆分它的原因。此外,我尝试的几乎所有东西都在本地运行良好,只是在行动中失败了。

【问题讨论】:

【参考方案1】:

您的 git config 行不起作用的原因是身份验证与 actions/checkout 一起工作的方式。您更改身份验证的尝试被操作所保留的凭据所覆盖。我之前遇到过与此相关的其他问题,如果您有兴趣,可以阅读一下我发现的内容here。

您会很高兴知道这里有一个简单的解决方法。只需禁用 actions/checkout 将身份验证保留在 git config 中即可。

      - uses: actions/checkout@v2
        with:
          persist-credentials: false

您的 package.json 依赖项没有问题。

    "dependencies": 
        ...
        "get-db": "MyUsername/getDB"
    ,

这是一个示例工作流程。 PAT 是一个repo 作用域Personal Access Token。请注意,git config 更改在步骤之间持续存在,因此您只需在每个作业中运行一次。

      - uses: actions/checkout@v2
        with:
          persist-credentials: false
      - uses: actions/setup-node@v1
        with:
          node-version: 12.x
      - run: git config --global url."https://$ secrets.PAT @github.com/".insteadOf ssh://git@github.com/
      - run: npm ci
      ...

【讨论】:

非常感谢,希望我能在花费数小时与之抗争之前问这个问题:)

以上是关于在 GitHub Action Workflow 中安装 GitHub 存储库的主要内容,如果未能解决你的问题,请参考以下文章

Github-Action-Workflow-概念和基本操作

在 GitHub Action Workflow 中安装 GitHub 存储库

GitHub Action 相互构建环境变量

iOS Workflow 分享 - Debug Action

在另一个作业中重用 GitHub Action 工作流程步骤

Oozie-自定义实现WorkFlow中shell action