如何设置Heroku使用SSH密钥读取链接到我的服务器应用程序的私有存储库?

6yjfywim  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(258)

Heroku在部署我的Vapor应用程序时没有找到正确的SSH密钥,并立即失败。当我尝试在Heroku上部署我的服务器时,当我向我的应用程序添加一个私有存储库时,我得到了这个错误。

  • (在添加此私有存储库之前,部署工作正常)*
Fetching git@github.com:MyName/MyRepository.git
warning: 'myrepository.git': skipping cache due to an error: Failed to clone repository git@github.com:MyName/MyRepository.git:
    Cloning into bare repository '/app/.cache/org.swift.swiftpm/repositories/MyRepository-65a67a5f'...
    Load key "/app/.ssh/id_rsa": error in libcrypto
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
    Please make sure you have the correct access rights
    and the repository exists.
error: Failed to clone repository git@github.com:MyName/MyRepository.git:
    Cloning into bare repository '/tmp/build_e6a4655b/.build/repositories/MyRepository-65a67a5f'...
    Load key "/app/.ssh/id_rsa": error in libcrypto
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
    Please make sure you have the correct access rights
    and the repository exists.
 !     Push rejected, failed to compile Swift app.
 !     Push failed

私有存储库在我的Vapor应用程序的Package.swift文件中是这样设置的。

dependencies: [
  .package(url: "git@github.com:MyName/MyRepository.git", branch: "develop")
]

在部署Vapor应用程序时,Heroku会查找app/.ssh/id_rsa密钥,但这不是我设置要使用的密钥。我在我的Mac上创建了一个名为~/ssh/id_heroku的密钥,我在GitHub和Heroku上设置了这个密钥,没有任何问题。
我已经在Heroku上使用了buildpack https://github.com/heroku/heroku-buildpack-ssh-key.git,我在Heroku应用程序设置上的Vapor之前添加了它。
我的Mac上的.ssh/config文件设置看起来是这样的:

Host heroku
  HostName heroku.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_heroku
jljoyd4f

jljoyd4f1#

Credits转到@vzsg,来自Vapor Discord Channel。

Heroku上的私人Github仓库(2023)

1.不需要添加额外的构建包,因为https://github.com/vapor-community/heroku-buildpack可以完成这项工作。
1.在服务器应用的根目录下创建一个名为bin/pre_compile的文件,内容如下:

#!/bin/bash

if [ ! -f Package.swift ]; then
    echo "File Package.swift does not exist."
    exit 1
fi

if [ -f "$ENV_DIR/GITHUB_USER" ]; then
  GITHUB_USER=`cat "$ENV_DIR/GITHUB_USER"`
fi

if [ -f "$ENV_DIR/GITHUB_AUTH_TOKEN" ]; then
  GITHUB_AUTH_TOKEN=`cat "$ENV_DIR/GITHUB_AUTH_TOKEN"`
fi

if [ -z "$GITHUB_USER" ]; then
    echo "GITHUB_USER is not set."
    exit 1
fi

if [ -z "$GITHUB_AUTH_TOKEN" ]; then
    echo "GITHUB_AUTH_TOKEN is not set."
    exit 1
fi

sed -i "s#git@github\.com:#https://$GITHUB_USER:$GITHUB_AUTH_TOKEN@github.com/#g" Package.swift

1.将文件设置为可执行文件并提交到git:

chmod +x bin/pre_compile
git add bin/pre_compile
git commit -m "Add pre_compile hook for private git repos"

1.创建具有存储库权限的个人访问令牌:
GitHub documentation
1.设置两个配置变量:使用您的GitHub用户名的GITHUB_USER(您为其创建了令牌并有权访问私有存储库),以及使用新创建的令牌值的GITHUB_AUTH_TOKEN

heroku config:set GITHUB_USER=<YOUR_GITHUB_USERNAME> GITHUB_AUTH_TOKEN=<YOUR_GITHUB_TOKEN>

1.从终端或Heroku网站部署数据库。
请注意,私有存储库的名称必须以git@github.com:开头,而不是https://github.com

相关问题