【问题标题】:Google App Engine deployment with private git repo in package.json使用 package.json 中的私有 git 存储库部署 Google App Engine
【发布时间】:2020-01-29 20:50:36
【问题描述】:

我的 package.json 中有一个私有 Bitbucket 存储库的依赖项

{
   "my-dependency": "git+ssh://git@bitbucket.org/something/my-dependency.git"
}

我按照 [1] 和 [2] 中的说明创建了一个使用 kms 加密的 SSH 密钥。

我创建了一个自定义cloudbuild.yaml,如下所示:

# Decrypt the file containing the key
steps:
  - name: 'gcr.io/cloud-builders/gcloud'
    args:
      - kms
      - decrypt
      - --ciphertext-file=bitbucket_rsa.enc
      - --plaintext-file=/root/.ssh/id_rsa
      - --location=global
      - --keyring=default
      - --key=bitbucket-key
    volumes:
      - name: 'ssh'
        path: /root/.ssh

  # Set up git with key and domain
  - name: 'gcr.io/cloud-builders/git'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        chmod 600 /root/.ssh/id_rsa
        cat <<EOF >/root/.ssh/config
        Hostname bitbucket.org
        IdentityFile /root/.ssh/id_rsa
        EOF
        mv known_hosts /root/.ssh/known_hosts
    volumes:
      - name: 'ssh'
        path: /root/.ssh

  # Install
  - name: 'gcr.io/cloud-builders/yarn'
    args: ['install']
    volumes:
      - name: 'ssh'
        path: /root/.ssh

  # Build
  - name: "gcr.io/cloud-builders/yarn"
    args: ["build"]
    volumes:
      - name: 'ssh'
        path: /root/.ssh

  # Deploy
  - name: "gcr.io/cloud-builders/gcloud"
    args: ["app", "deploy", "my-service.yaml"]
    volumes:
      - name: 'ssh'
        path: /root/.ssh

当我通过gcloud builds submit --config=cloudbuild.yaml 运行它时,步骤 #0 到 #3 运行良好,但步骤 #4 失败,因为 app deploy 触发另一个 yarn install,它无法访问步骤 #0 中定义的 SSH 密钥和#1:

Step #4: INFO     rm_node_modules took 0 seconds
Step #4: INFO     starting: yarn_install
Step #4: INFO     yarn_install yarn install
Step #4: INFO     `yarn_install` stdout:
Step #4: yarn install v1.9.4
Step #4: [1/5] Validating package.json...
Step #4: [2/5] Resolving packages...
Step #4: [3/5] Fetching packages...
Step #4: info Visit https://yarnpkg.com/en/docs/cli/install for     documentation about this command.
Step #4:
Step #4: INFO     `yarn_install` had stderr output:
Step #4: error Command failed.
Step #4: Exit code: 128
Step #4: Command: git
Step #4: Arguments: ls-remote --tags --heads     ssh://git@bitbucket.org/something/my-dependency.git
Step #4: Directory: /workspace
Step #4: Output:
Step #4: Host key verification failed.
Step #4: fatal: Could not read from remote repository.
Step #4:
Step #4: Please make sure you have the correct access rights
Step #4: and the repository exists.
Step #4:
Step #4: ERROR    error: `yarn_install` returned code: 1
Step #4: INFO     yarn_install took 11 seconds
Step #4: INFO     build process for FTL image took 11 seconds
Step #4: INFO     full build took 11 seconds
Step #4: ERROR    `yarn_install` had stderr output:
Step #4: error Command failed.

感谢您的帮助!

参考资料:

[1]https://cloud.google.com/cloud-build/docs/access-private-github-repos

[2]Link private repository in packages.json in app deployed to gcloud

【问题讨论】:

  • 忘了提到在.gcloudignore 中添加!node_modules/,从而将所有模块发送到应用程序部署产生INVALID_ARGUMENT: This deployment has too many files. New versions are limited to 10000 files for this app

标签: node.js google-app-engine npm google-cloud-platform google-cloud-build


【解决方案1】:

每当出现Host Key verification failed 错误时,很可能与您的known_hosts 文件有关,这意味着bitbucket.org 的主机密钥不在您的known_hosts 文件中,因此客户端无法验证它。尝试运行ssh-keyscan -t rsa bitbucket.org &gt; known_hosts,然后运行cat known_hosts,看看是否存在bitbucket.org 主机密钥。

如果答案是否定的并且输出为空,则可能是网络问题干扰了进程。按照thread 中接受的答案进行故障排除。

如果答案是肯定的,那就完美了,只缺少一个步骤,那就是将您的 SSH 密钥配置到 Bitbucket 中。进入“Bitbucket 设置”下的 bitbucket.org,然后在其中一个选项中单击“SSH 密钥”。添加一个密钥(将其标记为您决定的任何名称)并将您从运行 cat ~/.ssh/id_rsa.pub 获得的输出粘贴到密钥部分。

基本上,在您linked 的线程之一中,我将私有存储库克隆到与我的应用程序根目录相同的文件夹中。这样,在 package.json 中我可以简单地添加这一行 dependencies: {“circular-structure-stringify”: “./circular-structure-stringify”} 这将允许我像任何 npm 包一样 require() 它。

我意识到我应该保持 Github 链接打开,但是,我正在研究另一个示例,我将很快在 cmets 部分发布。同时,让我知道结果。

【讨论】:

  • 非常感谢您对@JKleinne 的支持。正如我在最初的帖子中提到的,来自第 2 步的yarn install(计数从 0 开始)工作正常。在这个yarn install 中,SSH 密钥可用。我还使用您建议的ssh-keyscan 步骤验证了这一点。问题是在运行gcloud app deploy时。
  • 我想避免使用dependencies: {“my-dependency”: “./my-dependency”},因为这在本地机器上调用yarn install 时需要一些额外的脚本,因此在通过git+ssh 添加更多依赖项时不能很好地扩展.
  • 嘿,不用担心,这实际上是我用来解决您遇到的同一问题的方法。克隆时它似乎工作得很好,但在依赖项中将其指定为git+ssh 将给出Host key verification error,这就是我采用上述方法的原因。无论如何,我建议也在 Gitlab 的论坛中创建一个帖子。肯定有一种方法可以解决这个问题,而无需执行 frankenstein 解决方法,并且那里的人肯定能够为您提供所需的支持。我仍然会积极尝试寻找解决方案,并会告诉你我的发现
【解决方案2】:

显然不可能为gcloud app deploy 步骤提供SSH 密钥。因此使用

{
   "my-dependency": "git+ssh://git@bitbucket.org/something/my-dependency.git"
}

行不通!

解决方法(正如@JKleinne 在链接线程中提到的那样)是克隆存储库并从本地文件夹安装它:

{
  "my-dependency": "lib/my-dependency"
}

我编写了一个小型 bash 脚本,用于检查是否可以访问 repo,如果可以,则克隆/拉取:

GIT_PROJECT=$1
GIT_REPO=$2
NAME=${GIT_REPO}
REMOTE="git@bitbucket.org:${GIT_PROJECT}/${GIT_REPO}.git"

if [[ ! -d ./lib ]]
then
    mkdir -p ./lib
fi

## Test if git repo is accessible
if ! git ls-remote --exit-code -h ${REMOTE}; then
    echo "Unable to access git repo, skipping"
    exit 0
fi

## Clone or pull
if [[ ! -d ./lib/${NAME} ]]
then
    git clone ${REMOTE} ./lib/${NAME}
else
    git -C ./lib/${NAME} pull
fi

然后我在预安装脚本中使用它:

"preinstall": "./get-internal-package.sh something my-dependency",

【讨论】:

    猜你喜欢
    • 2018-12-17
    • 2017-05-09
    • 2015-11-13
    • 1970-01-01
    • 2015-03-11
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    相关资源
    最近更新 更多