如何将 heroku ssh 密钥添加到 known_hosts(以前可以使用)

how to add heroku ssh keys to known_hosts (used to work before)

我有一个 CI 管道,我在其中部署到 Heroku(在 gitlab 上)。我不想使用我的个人 api 密钥,因为这是一个共享存储库。所以我让这个 CI-config 一直工作到几周前:

deploy-heroku:
  variables:
    GIT_DEPTH: 200
  stage: deploy
  only:
    - master
  except:
    - schedules
  script:
    - apk update && apk upgrade && apk add curl bash git openssh-client
    - curl https://cli-assets.heroku.com/install.sh | sh
    - heroku git:remote -a $HEROKU_APP_NAME --ssh-git
    - mkdir -p ~/.ssh
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_ed25519
    - chmod 700 ~/.ssh/id_ed25519
    - eval "$(ssh-agent -s)"
    - ssh-add ~/.ssh/id_ed25519
    - ssh-keyscan -H 'heroku.com' >> ~/.ssh/known_hosts
    - git push -f heroku HEAD:master --no-verify

这完美地工作,并且在日志中:

$ ssh-keyscan -H 'heroku.com' >> ~/.ssh/known_hosts
# heroku.com:22 SSH-2.0-endosome
# heroku.com:22 SSH-2.0-endosome
# heroku.com:22 SSH-2.0-endosome
# heroku.com:22 SSH-2.0-endosome
# heroku.com:22 SSH-2.0-endosome

然而,几个星期以来,这在 ssh-keyscan:

上失败了
$ ssh-keyscan -H 'heroku.com' >> ~/.ssh/known_hosts
Cleaning up project directory and file based variables
00:01
ERROR: Job failed: exit code 1

所以 ssh-keyscan 似乎不再起作用了。当 运行 ssh-keyscan -H 'heroku.com' 时,它不再给出任何结果(它曾经给出一些结果)。

如何使按键扫描工作(或如何确保 known_hosts 中的按键正确)?

或者,更一般地说:如何在不使用个人 API 密钥的情况下使 heroku 部署工作?

git over ssh 已弃用并从 Heroku 中删除。

这个脚本确实有效:

    - apk update && apk upgrade && apk add curl bash git openssh-client
    - curl https://cli-assets.heroku.com/install.sh | sh
    - git push  --no-verify https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git HEAD:master

在这种情况下,--no-verify 是必需的,因为 git 在其中一个钩子中查找 git-lfs。使用 --no-verify 标志,将跳过此挂钩。

可以在本地生成HEROKU_API_KEY,当你登录到heroku并生成一个long-living密钥时:

$ heroku login
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/89f5...?requestor=SFMyN...
Logging in... done
Logged in as ...
$ heroku authorizations:create
Creating OAuth Authorization... done
Client:      <none>
ID:          ...
Description: Long-lived user authorization
Scope:       global
Token:       <HEROKU_API_KEY>
Updated at:  Tue Apr 12 2022 17:34:15 GMT+0200 (Central European Summer Time) (less than a minute ago)

从令牌字段中获取 api 密钥。 (您可以通过 ID heroku authorizations 查看所有 tokens/keys)

在您的存储库中添加 HEROKU_API_KEYHEROKU_APP_NAME 作为受保护的变量。