在 package.json 中使用私有 git 存储库部署 Google App Engine

2023-12-29

我的 package.json 依赖于私有 Bitbucket 存储库

{
   "my-dependency": "git+ssh://[email protected] /cdn-cgi/l/email-protection/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 和 #1 中定义的 SSH 密钥:

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://[email protected] /cdn-cgi/l/email-protection/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 https://cloud.google.com/cloud-build/docs/access-private-github-repos

[2] 链接部署到 gcloud 的应用程序中的 packages.json 中的私有存储库 https://stackoverflow.com/questions/57215411/link-private-repository-in-packages-json-in-app-deployed-to-gcloud


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

{
   "my-dependency": "git+ssh://[email protected] /cdn-cgi/l/email-protection/something/my-dependency.git"
}

不管用!

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

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

我编写了一个小的 bash 脚本,用于检查是否可以访问存储库并克隆/拉取是否可以:

GIT_PROJECT=$1
GIT_REPO=$2
NAME=${GIT_REPO}
REMOTE="[email protected] /cdn-cgi/l/email-protection:${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",
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 package.json 中使用私有 git 存储库部署 Google App Engine 的相关文章

随机推荐

  • required_if Laravel 5 验证

    我有用户可以填写的表格来出售他们的房屋 对于其中一项输入 用户必须选择 出售 或 出租 如果是出售 则会出现两个价格输入字段 如果是出租 则会出现基于 jQuery 的其他价格输入字段 我的问题是我希望价格字段是必需的 但是例如 如果我选择
  • 通过 SOS 调查 CLR

    目前 我正在深入研究 CLR 并尝试找到托管对象的适当大小 我有两种简单的类型 XClass class XClass public XStruct StructField new XStruct public int IntField p
  • 为什么在 javascript 中列出类的实际构造函数很重要

    我正在阅读 javascript 花园http bonsaiden github com JavaScript Garden http bonsaiden github com JavaScript Garden 关于 javascript
  • 为什么我的 OBJ 解析器渲染网格是这样的?

    我自己决定将 OBJ 解析器 导入器支持添加到我一直在开发的 3D 渲染引擎中 我已遵循规范在这里找到 http www martinreddy net gfx 3d OBJ spec几乎 到了发球台 除了当前限制对组 面 顶点 法线和纹理
  • IllegalStateException:PWC3990:已为此响应调用 getWriter()

    java lang IllegalStateException PWC3990 getWriter has already been called for this response 如何解决这个错误 我运行一个简单的 servlet 代码
  • 如何使用 FirefoxProfile 或 FirefoxOptions 通过 Selenium 设置 Firefox 浏览器的窗口位置

    我需要通过创建驱动程序来更改 Firefox 窗口的位置 driver webdriver Firefox 我知道创建驱动程序后可以更改窗口位置 driver set window position 我不知道如何使用 Firefox 配置文
  • 如何读取.net中的SQL Server架构信息?

    我如何在 C 中知道数据库中的表列表 每个表具有完整规范的列列表 例如第一列是 Id 其数据类型为 int 50 等 Use the 获取模式 http msdn microsoft com en us library ms136366 a
  • 全新安装后 EKEventStore.calendars 始终为空

    我的 iOS 应用程序有一个奇怪的问题 在全新安装后 如果我尝试添加日历事件 在接受本机日历权限提示后 我的 eventStore 单例永远不会显示任何可用的日历 并且defaultCalendarForNewEvents总是nil 我尝试
  • jquery中如何将密码转换成md5? [复制]

    这个问题在这里已经有答案了 实际上我正在创建更改密码页面 这是我检查旧密码是否与现有密码匹配的功能 该密码存储在数据库中的 MD5 中 因此我想首先将该密码转换为 MD5 然后我可以检查该密码 这是代码 function fnIsValid
  • iOS“当前图形上下文”-那是什么

    当我绘制线条和形状等时 我会在 iOS 中获得 当前图形上下文 到底什么是 当前图形上下文 我正在寻找 30 000 英尺的描述 现在我只是复制并粘贴 UI 代码 不太确定它在做什么 图形上下文是存储有关绘图状态的信息的地方 这包括填充颜色
  • C# MVC 从 S3 异步下载大文件

    我必须从 aws S3 async 下载文件 我有一个锚标记 单击它时 将在控制器中点击一个方法以供下载 该文件应该在浏览器底部开始下载 就像其他文件下载一样 In View a href controller action paramet
  • HTML PDF 查看器

    除了使用 Acrobat Reader 之外 还有其他方法可以在网络上查看 PDF 文件吗 我需要控制查看器以编程方式触发文档的打印 PDF 的来源应来自网络服务 URL AspX 我认为最简单的方法是使用 Google Doc Viewe
  • 使用显式类型初始化 ImmutableMap? [复制]

    这个问题在这里已经有答案了 我需要初始化一个 ImmutableMap guava 21 0 并且我需要它解析为一个 Map gt 对于这个例子 我将只使用 String 所以我有 import com google common coll
  • 如何使用 Python 获取带有 Selenium 的

    我正在使用 Selenium WebDriver 使用 Python 进行 UI 测试 我想检查以下 HTML ul li Something here li li And here li li Even more here li ul 我
  • Java JDBC - 如何使用 tnsnames.ora 连接到 Oracle

    tnsnames ora文件包含Databases以及它们的描述 host port 是否可以依赖上述文件建立连接 仅提供数据库名称 为了找到这个文件 我必须知道默认的 oracle 主目录 我需要在 Windows 注册表中检查HKEY
  • 带子边距的 Div 高度

    我有 2 个 div 我想让它们的高度相等 var highestCol SecondColumn height column first height highestCol 我知道第二个 div 总是高于第一个 div 当两个 div 中
  • 如何将 Phillips Hue 灯泡的 RGB 值转换为 XY 值

    如何正确地将我拍摄的图片中的像素 RGB 值转换为发送到 Phillips Hue 设备所需的 XY 值 我当前的代码执行以下操作 1 拍一张照片 找出最常见的颜色 2 循环扔它们 然后再拍一张照片 3 将值发送到 Phillips Hue
  • 正则表达式匹配 html 标签之外的文本,而不是特定标签之间的文本

    我试图获得一个正则表达式来匹配 html 标签外部和之间的一些单词 而不是标签本身 但我还需要在它们位于 html 标题标签 h1 h2 h3 等 之间时排除它们 这是我尝试过的 bword b gt lt i 实例 https regex
  • 等待多重未来?

    我想运行相同类型的任务 工作线程 但一次不超过一定数量的任务 当任务完成时 其结果是新任务的输入 然后可以启动该新任务 有没有什么好的方法可以在 C 11 中使用异步 未来范例来实现这一点 乍一看 它看起来很简单 您只需使用以下命令生成多个
  • 在 package.json 中使用私有 git 存储库部署 Google App Engine

    我的 package json 依赖于私有 Bitbucket 存储库 my dependency git ssh email protected cdn cgi l email protection something my depend