Node.js 在package.json中使用私有git repo部署Google应用程序引擎

Node.js 在package.json中使用私有git repo部署Google应用程序引擎,node.js,google-app-engine,npm,google-cloud-platform,google-cloud-build,Node.js,Google App Engine,Npm,Google Cloud Platform,Google Cloud Build,我对package.json中的私有Bitbucket repo有依赖关系 { "my-dependency": "git+ssh://git@bitbucket.org/something/my-dependency.git" } 我按照[1]和[2]中给出的说明创建了一个SSH密钥,并用kms加密 我创建了一个定制的cloudbuild.yaml,如下所示: # Decrypt the file containing the key steps: - name: 'gcr.io/

我对package.json中的私有Bitbucket repo有依赖关系

{
   "my-dependency": "git+ssh://git@bitbucket.org/something/my-dependency.git"
}
我按照[1]和[2]中给出的说明创建了一个SSH密钥,并用kms加密

我创建了一个定制的
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
谢谢你的帮助

参考资料:

[1]


[2]

每当出现
主机密钥验证失败
错误时,它很可能与您的
已知\u主机
文件有关,这意味着
bitbucket.org
的主机密钥不在您的已知\u主机文件中,因此客户端无法对其进行验证。尝试运行
ssh keyscan-t rsa bitbucket.org>known_hosts
,然后运行
cat known_hosts
,查看bitbucket.org主机密钥是否存在

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

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

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


我意识到我应该保持Github链接的开放性,但是,我正在研究另一个例子,我很快就会在评论部分发布这个例子。同时,让我知道结果。

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

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

解决方法(如链接线程中@JKleinne所述)是克隆repo并从本地文件夹安装它:

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

忘了提到添加
.gcloudignore
中的节点\u modules/
,因此将所有模块发送到应用程序部署会产生一个
无效\u参数:此部署的文件太多。此应用程序的新版本限制为10000个文件
非常感谢@JKleinne的支持。正如我在第一篇帖子中提到的,步骤2(计数从0开始)中的
纱线安装
工作正常。在此
安装中,SSH密钥可用。我还通过您建议的
ssh keyscan
步骤验证了这一点。问题是在运行
gcloud app deploy
时。我希望避免使用
依赖项:{“我的依赖项”:“/mydependency”}
,因为在本地计算机上调用
warn install
时,这需要一些额外的脚本,由于这个原因,当通过
git+ssh
添加更多依赖项时,无法很好地扩展。嘿,不用担心,这实际上是我用来解决您遇到的同一问题的方法。克隆时它似乎工作得很好,但在依赖项中将其指定为
git+ssh
将导致
主机密钥验证错误
,这就是我使用上述方法的原因。无论如何,我建议也在Gitlab的论坛上创建一个帖子。肯定有一种方法可以解决这个问题,而不必执行弗兰肯斯坦的变通方法,那里的人肯定能够为您提供所需的支持。我仍将积极尝试找到解决方案,并将让您知道我的发现
"preinstall": "./get-internal-package.sh something my-dependency",