在GitHub Action Workflow中安装GitHub repo

时间:2020-05-31 21:40:45

标签: github github-actions

我正在尝试构建一个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 ci lambda的getList期间,此操作失败。我遇到了各种错误,例如:

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

我的package.json lambda的getList如下:

{
    "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"
    }
}

我也尝试过将username:token包含在package.json文件中,尽管我不愿意将令牌放在其中而不是秘密,但这还是行不通的。我也尝试过使用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 个答案:

答案 0 :(得分:2)

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

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

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

您的package.json依存关系很好。

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

这是示例工作流程。 PATrepo范围内的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
      ...