我一直在尝试使用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/*
,./*
等,但是它们都不起作用。使用source作为/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将我的代码复制到VM。请帮助。
对于'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