【问题标题】:Error using gcloud compute scp with Google Cloud Build将 gcloud compute scp 与 Google Cloud Build 一起使用时出错
【发布时间】:2020-04-14 15:03:57
【问题描述】:

我一直在尝试使用 Google Cloud Build 触发器运行 gcloud compute scp 命令。我希望将我的代码复制到列出的服务器中的相应目录中。

但是,当我在 Cloud Shell 中执行 gcloud compute scp * username@instance-name:/home/directory --zone=us-central1-a --recurse 时,它会起作用,这有点奇怪。

但是当我在cloudbuild.yaml 文件中写入等效项时,它会失败并出现错误:*: No such file or directory

这是我的cloudbuild.yaml的内容:

- name: 'gcr.io/cloud-builders/gcloud'
  args: ['compute' , 'scp' , '*', 'username@instance-name:/home/directory' , '--zone=us-central1-a', '--recurse']

我也尝试过使用remote-builder,但同样失败并出现错误:

ssh: connect to host <ip_address> port 22: Connection timed out
lost connection
ERROR: (gcloud.compute.scp) [/usr/bin/scp] exited with return code [1].

我还尝试了其他组合,将源 * 替换为 /workspace/*./* 等,但它们都不起作用。使用/workspace/ 的源代码执行,但会复制整个workspace 目录,而不是根据需要复制目录的内容。

我也尝试过运行以下设置,但也失败了。

cloudbuild.yaml:

- name: 'ubuntu'
  args: ['bash', '-c' , 'scp', '*', 'username@instance-name:/home/directory']

错误:

Already have image: ubuntu
scp: command not found

同样,我只想使用 Cloud Build 将我的代码复制到虚拟机。请帮忙。

【问题讨论】:

  • 我怀疑有几件事。首先,您需要向您的虚拟机授予 Cloud Build 的服务帐号权限。其次,Cloud Shell 作为您的个人云凭据进行身份验证,这些凭据可能对虚拟机具有权限。我没有尝试过,但是一旦 Cloud Build 的帐户获得了 VM 的权限,我认为您需要将 scproot@instance
  • 在这种情况下,将源替换为/workspace/ 也不应该奏效。我现在假设当我想复制 workspace 挂载的内容时,这里出了点问题,通过说明源类似 /workspace/*
  • 嘿Pranay... 你能正常SSH吗(没有云壳);如果不是,您可能需要一种方法来获取这些密钥。请查看此stackoverflow.com/questions/52204216/…
  • 嘿 Dharmesh,是的,这行得通。如果我明确命名文件,我可以复制文件,但如果我在源代码中添加 *,则不能。

标签: google-cloud-platform gcloud scp google-cloud-build


【解决方案1】:

对于 'gcr.io/cloud-builders/gcloud' 容器镜像选项:

星号“*”由bash 解释并在将所指对象传递给命令之前扩展,并且由于此容器映像中的gcloud 直接使用而不是通过bash 作为中介,“ *" 没有展开,而是按字面意思传递给gcloud 命令,该命令找不到任何名为"*" 的文件。如果您需要复制存储库中的所有代码(递归目录及其文件),请使用相同的命令,但写入根符号“/”(顺便说一下,它是一个文字 - 不可扩展 - 到 bash ),而不是“*”。

对于带有 bash 的 OS 容器映像选项:

容器镜像必须默认安装scp才能以这种方式工作,而“ubuntu”镜像默认没有。您可以使用默认安装了 openssh-client 软件包的映像,或者将其安装到位然后运行命令,如下所示(有关步骤语法,请检查 this):

steps:
- name: 'ubuntu'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    sudo apt update && sudo apt install openssh-client -y && scp * username@instance-name:/home/directory

【讨论】:

  • 我有点猜到解释 '*' 可能是 'gcr.io/cloud-builders/gcloud' 容器的原因。我尝试了您的建议,但很抱歉,没有奏效。这就是我尝试过的:- name: 'gcr.io/cloud-builders/gcloud' args: ['compute', 'scp', '/', 'username@instance-name:/home/directory', '--zone=us-central1-a', '--recurse']。我也试过这个,它也没有工作:- name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: ['gcloud', 'compute', 'scp', '*', 'username@instance-name:/home/directory', '--zone=us-central1-a', '--recurse']
  • 同时,我正在使用- name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | for d in *; do gcloud compute scp $d username@instance-name:/home/directory --zone=us-central1-a --recurse done
  • 您的意思是您尝试使用“/”而不是“*”?你展示的东西不是我建议的:步骤的名称需要是'ubuntu'(或'debian'等)。
  • 哦,我的错。我试过用这个:- name: 'gcr.io/cloud-builders/gcloud' args: ['compute', 'scp', '/', 'username@instance-name:/home/directory', '--zone=us-central1-a', '--recurse'] 错了吗?应该改为以下吗? - name: 'ubuntu' args: ['gcloud', 'compute', 'scp', '/', 'username@instance-name:/home/directory', '--zone=us-central1-a', '--recurse']
  • 你试过steps: - name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: ['gcloud' 'compute' , 'scp' , '*', 'username@instance-name:/home/directory' , '--zone=us-central1-a', '--recurse']吗?
【解决方案2】:

我有同样的问题。我最终创建了两个步骤:

  - name: 'google/cloud-sdk:slim'
    args:
      - compute
      - scp
      - '--recurse'
      - '--compress'
      - /workspace/dist
      - 'build@instance-1:/var/www/'
      - '--zone'
      - us-west2-a
    id: copy-file-to-server
    entrypoint: gcloud
  - name: 'google/cloud-sdk:slim'
    args:
      - compute
      - ssh
      - '--zone'
      - us-west2-a
      - build@instance-1
      - '--'
      - 'mv /var/www/dist /var/www/$_SHORT_SHA '
    id: rename-dist
    entrypoint: gcloud

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2019-04-07
    • 2018-07-23
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多