Как развернуть несколько облачных функций, которые были добавлены с помощью облачной сборки Google и репозитория исходного кода? - PullRequest
0 голосов
/ 05 марта 2020

У меня есть папка проекта с различными папками облачных функций, например

Project_Folder
    -Cloud-Function-Folder1
         -main.py
         -requirements.txt
         -cloudbuild.yaml
    -Cloud-Function-Folder2
         -main.py
         -requirements.txt
         -cloudbuild.yaml
    -Cloud-Function-Folder3
         -main.py
         -requirements.txt
         -cloudbuild.yaml
            --------- and so on!

Теперь то, что у меня есть сейчас. Я отправляю sh код в репозиторий исходного кода один за другим из папки Cloud Fucntions в репозиторий исходного кода (отдельные репозитории для каждой папки функций). И затем он имеет включенный триггер, который запускает сборку облака и затем развертывает функцию. Файл cloudbuild.yaml, который у меня есть, выглядит следующим образом.

 steps:

 - name: 'python:3.7'
 entrypoint: 'bash'
 args: 
   - '-c'
   - |
       pip3 install -r requirements.txt
       pytest

 - name: 'gcr.io/cloud-builders/gcloud'
  args:
  - functions 
  - deploy
  - Function
  - --runtime=python37
  - --source=.
  - --entry-point=function_main
  - --trigger-topic=Function
  - --region=europe-west3  

Теперь я хотел бы сделать репо с одним исходным кодом и всякий раз, когда я изменяю код в одной облачной функции. и pu sh тогда только он получает развертывание, а остальные остаются как прежде.


Обновление

Теперь я также попробовал что-то подобное ниже, но он также развернул все функции в в то же время, хотя я работаю над одной функцией.

Project_Folder
    -Cloud-Function-Folder1
         -main.py
         -requirements.txt
    -Cloud-Function-Folder2
         -main.py
         -requirements.txt
    -Cloud-Function-Folder3
         -main.py
         -requirements.txt
    -cloudbuild.yaml
    -requirements.txt

Файл cloudbuild.yaml выглядит следующим образом

 steps:

 - name: 'python:3.7'
 entrypoint: 'bash'
 args: 
   - '-c'
   - |
       pip3 install -r requirements.txt
       pytest

 - name: 'gcr.io/cloud-builders/gcloud'
  args:
  - functions 
  - deploy
  - Function1
  - --runtime=python37
  - --source=./Cloud-Function-Folder1
  - --entry-point=function1_main
  - --trigger-topic=Function1
  - --region=europe-west3  

 - name: 'gcr.io/cloud-builders/gcloud'
  args:
  - functions 
  - deploy
  - Function2
  - --runtime=python37
  - --source=./Cloud-Function-Folder2
  - --entry-point=function2_main
  - --trigger-topic=Function2
  - --region=europe-west3 

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Это сложнее, и вам нужно играть с ограничением и ограничением Cloud Build.

Я делаю это:

  • чтобы получить каталог, обновленный после предыдущего коммита
  • l oop в этом каталоге и делайте, что я хочу

Гипотеза 1 : все подпапки развертываются с использованием одних и тех же команд

Итак, для этого я поставил cloudbuild.yaml в root моего каталога, а не в подпапках

steps:
- name: 'gcr.io/cloud-builders/git'
  entrypoint: /bin/bash
  args:
    - -c
    - |
        # Cloud Build doesn't recover the .git file. Thus checkout the repo for this
        git clone --branch $BRANCH_NAME https://github.com/guillaumeblaquiere/cloudbuildtest.git /tmp/repo ;
        # Copy only the .git file
        mv /tmp/repo/.git .
        # Make a diff between this version and the previous one and store the result into a file
        git diff --name-only --diff-filter=AMDR @~..@ | grep "/" | cut -d"/" -f1 | uniq > /workspace/diff

# Do what you want, by performing a loop in to the directory
- name: 'python:3.7'
  entrypoint: /bin/bash
  args:
    - -c
    - |
       for i in $$(cat /workspace/diff); do
       cd $$i
           # No strong isolation between each function, take care of conflicts!!
           pip3 install -r requirements.txt
           pytest
       cd ..
       done

- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: /bin/bash
  args:
    - -c
    - |
       for i in $$(cat /workspace/diff); do
       cd $$i
           gcloud functions deploy .........           
       cd ..
       done

Гипотеза 2 : развертывание определено c в подпапке

Итак, для этого я положил cloudbuild.yaml в root моего каталога, а другой в подпапки

steps:
- name: 'gcr.io/cloud-builders/git'
  entrypoint: /bin/bash
  args:
    - -c
    - |
        # Cloud Build doesn't recover the .git file. Thus checkout the repo for this
        git clone --branch $BRANCH_NAME https://github.com/guillaumeblaquiere/cloudbuildtest.git /tmp/repo ;
        # Copy only the .git file
        mv /tmp/repo/.git .
        # Make a diff between this version and the previous one and store the result into a file
        git diff --name-only --diff-filter=AMDR @~..@ | grep "/" | cut -d"/" -f1 | uniq > /workspace/diff

# Do what you want, by performing a loop in to the directory. Here launch a cloud build
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: /bin/bash
  args:
    - -c
    - |
       for i in $$(cat /workspace/diff); do
       cd $$i
           gcloud builds submit
       cd ..
       done

Будьте осторожны с timeout здесь, потому что вы можете активировать много Cloud Build, и это займет время.


Хотите запустить сборку вручную, не забудьте добавить $ BRANCH_NAME в качестве переменной подстановки

gcloud builds submit --substitutions=BRANCH_NAME=master
0 голосов
/ 06 марта 2020

Если вы создаете репо с одним исходным кодом и изменяете свой код как одну облачную функцию, вы должны создать один файл конфигурации cloudbuild.yaml . Вам необходимо подключить этот репо к Cloud Build. Затем создайте триггер сборки и выберите этот репо в качестве источника. Также вам нужно настроить развертывание и каждый раз, когда вы добавляете sh новый код в свой репозиторий, вы автоматически запускаете сборку и развертывание в облачных функциях.

...