使用 Github Actions token 从私有 Github 存储库进行 Git 克隆

3

在我的应用程序准备好进行测试或部署之前,我需要进行一些目录整理。我想利用一个 Makefile 目标来调用存储库中的 shell 脚本以使其与 CI/CD 无关。可以使用 make prepare_directory 命令调用此目标。

我正在使用的 CI 平台是 Github Actions。以下是在新拉取请求上运行的工作流程的相关部分:

name: PR Tests
env:
  GIT_TOKEN: ${{ secrets.GITHUB_TOKEN }}
jobs:
  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 1
      - name: Prep directoy
        run: make prepare_directory

这是Makefile的相关部分(在本地完全按预期工作):

...
prepare_directory:
    ./scripts/prepare_directory.sh

clean:
    @rm -Rf ./$(BUILDPREFIX)

.PHONY: all clean docker lint prep_avro $(dockerbuilds)

以下是 ./scripts/prepare-directory.sh 脚本的相关部分:

#!/bin/bash -e
# ...
# clone repo using https and GITHUB_TOKEN
git clone https://$GIT_TOKEN@github.com:USERNAME/REPO.git

当我尝试使用该URL进行克隆操作时,从shell脚本中执行时,脚本失败了(连同Github工作流管道一起),出现以下错误:fatal: unable to access 'https://github.com:USERNAME/REPO.git/': URL using bad/illegal format or missing URL 有人知道我做错了什么吗?
3个回答

1

您的prepare-directory.sh脚本中git clone调用中的URL存在拼写错误:

# clone repo using https and GITHUB_TOKEN
git clone https://$GIT_TOKEN@github.com:USERNAME/REPO.git

该URL在HTTPS git URL和SSH之间。冒号:应该是斜杠/。假设您的$GIT_TOKEN只包含令牌而没有其他内容,您还需要在@之前加上一个:

git clone https://$GIT_TOKEN:@github.com/USERNAME/REPO.git

如果您的$GIT_TOKEN包含完整的身份验证字符串,对于Github应用程序安装访问令牌,它可能是类似于"x-access-token:ghs_..."的内容,那么您就不需要在$GIT_TOKEN后面加上:,您只需要使用$GIT_TOKEN@github.com即可。

1
URL格式有问题,你发现得很好。在你的帖子中,跟随$GIT_TOKEN的冒号语法对我无效。从他的工作流程中我们知道,$GIT_TOKEN并不包括x-access-token,因为我们可以看到$GIT_TOKEN是如何设置的,所以我们必须在$GIT_TOKEN之前添加x-access-token:。此外,我不明白他为什么要使用环境变量;这只会使事情变得更加复杂,没有任何好处。应该只是git clone https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/USERNAME/REPO.git - LinuxDisciple

1

我创建了一个 GitHub 应用和 Github Action 来避免这些限制,名为 GitHub Actions Access Manager。欢迎提供反馈。

工作流程

enter image description here

  1. 此 GitHub Action 将请求在应用服务器中以 GitHub Action ID Token (由 GitHub 签署的 JWT) 授权的方式,从目标仓库请求访问令牌。
  2. 应用服务器请求GitHub 应用安装令牌来读取目标仓库中的 .github/access.yaml 文件。
  3. 应用服务器通过步骤 2. 中的GitHub 应用安装令牌,从目标仓库中读取 .github/access.yaml 文件,并确定应该授予请求仓库的权限。
  4. 应用服务器请求授予源目录授权的GitHub 应用安装令牌并将其作为响应发送回步骤 1. 的 GitHub action。
  5. GitHub Action 将该令牌设置为环境变量 $GITHUB_ACCESS_TOKEN 和步骤输出值 ${{ steps.github-actions-access.outputs.token }}
  6. 随后的步骤可以利用这个令牌来访问目标仓库的资源。

1
您可以在检出步骤之后添加此操作,GitHub 可以访问您的私有存储库依赖项。
注意:请确保将服务器的私钥添加为机密,公钥添加到 GitHub SSH 密钥中,并将您的私有存储库 URL 从 https+auth_token 替换为 SSH。 ssh://git@github.com/your_group/your_project.git
以下是示例。
      - uses: webfactory/ssh-agent@v0.4.1
        with:
          ssh-private-key: ${{ secrets.SSH_KEY }}

SSH_KEY 是您创建的私钥密码。


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