Ошибка при использовании gcloud compute scp с Google Cloud Build - PullRequest
1 голос
/ 14 апреля 2020

Я пытался запустить команду gcloud compute scp, используя триггер Google Cloud Build. Я хочу, чтобы мой код был скопирован в соответствующие каталоги на перечисленных серверах.

Однако, довольно странно, что когда я делаю gcloud compute scp * username@instance-name:/home/directory --zone=us-central1-a --recurse в Cloud Shell, он работает.

Но когда я записать эквивалент в файл 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/*, ./* et c. но никто из них не работал. Выполнение с исходным кодом как /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 для копирования моего кода на виртуальные машины. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 16 апреля 2020

Для опции образа контейнера 'gcr.io/cloud-builders/gcloud':

Звездочка "*" интерпретируется как bash и расширяется перед передачей ссылается на команду, и, поскольку gcloud в этом образе контейнера используется напрямую, а не через bash в качестве посредника, «*» не раскрывается, а передается буквально команде gcloud, которая не находит любой файл с именем "*". Если вам нужно скопировать весь код (рекурсивно каталоги и их файлы) в хранилище, используйте ту же команду, но написав символ root, "/" (который, кстати, является литералом -не расширяемый- до bash) вместо "*".

Для опции образа контейнера ОС с bash:

В образе контейнера должна быть установлена ​​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
...