CI/CD

Os pipelines de integração contínua e implantação (CI/CD) ajudam a garantir que suas funções funcionem localmente e em um ambiente de teste no Google Cloud.

Depois de concluir o desenvolvimento local, é possível configurar uma plataforma de CI/CD, como Cloud Build, para executar os testes atuais do Cloud Functions regularmente. Os testes contínuos ajudam a garantir que o código continue funcionando conforme o esperado e que as dependências permaneçam atualizadas. Também é possível configurar pipelines de CIs e CDs (inclusive aqueles criados no Cloud Build) para testar e reimplementar automaticamente suas funções a partir de um repositório de origem, como o GitHub, Bitbucket ou Cloud Source Repositories, já que o Cloud Functions não é atualizado automaticamente.

Antes de começar

Antes de iniciar este guia, configure o ambiente.

Frameworks de teste

Frameworks de teste proporcionam um ambiente de execução para testes automatizados que permitem que você mantenha implantações de produção testadas com cuidado sem fazer muito esforço durante o processo. Frameworks fictícios permitem a simulação de dependências externas. Uma dependência externa é aquela que a função usa e que não faz parte do código da função.

Node.js

Os exemplos neste guia usam o Mocha como um framework de teste para executar testes, e o Sinon como um framework fictício para simular dependências externas.

Uma dependência externa é aquela que a função usa e que não faz parte do código da função. Exemplos comuns de dependências externas são outros serviços e bibliotecas do Google Cloud instalados usando gerenciadores de pacotes, como NPM, PyPI ou Maven.

Python

Os exemplos neste guia usam o Pytest como um framework de teste para executar testes e unittest como um framework fictício para simular dependências externas.

Uma dependência externa é aquela que a função usa e que não faz parte do código da função. Exemplos comuns de dependências externas são outros serviços e bibliotecas do Google Cloud instalados usando gerenciadores de pacotes, como o PIP.

Go

Os exemplos neste guia usam o pacote da biblioteca padrão testing pacote para executar testes. No entanto, os testes do sistema têm dependências externas.

Uma dependência externa é aquela que a função usa e que não faz parte do código da função. Exemplos comuns de dependências externas são outros serviços do Google Cloud e outros pacotes que você fez download.

Java

Nos exemplos deste guia, usamos a biblioteca JUnit para executar testes, além do Mockito como um framework de simulação para simular dependências externas.

Uma dependência externa é uma dependência na qual sua função confia e que não faz parte do código da sua função.

Como configurar o Cloud Build

Siga as instruções no guia Como automatizar versões com acionadores de versão usando o arquivo de configuração cloudbuild.yaml da versão abaixo para configurar o Cloud Build para testar e implantar sua função automaticamente.

Node.js

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']
  dir: 'function/dir/from/repo/root'
- name: 'gcr.io/cloud-builders/npm'
  args: ['test']
  dir: 'function/dir/from/repo/root'
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['functions', 'deploy', '[YOUR_DEPLOYED_FUNCTION_NAME]', '[YOUR_FUNCTION_TRIGGER]', '--runtime', '[YOUR_RUNTIME]', '--entry-point', '[YOUR_FUNCTION_NAME_IN_CODE]']
  dir: 'function/dir/from/repo/root'

Python

steps:
- name: 'docker.io/library/python:3.10'
  entrypoint: /bin/sh
  # Run pip install and pytest in the same build step
  # (pip packages won't be preserved in future steps!)
  args: [-c, 'pip install -r requirements.txt && pytest']
  dir: 'function/dir/from/repo/root'
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['functions', 'deploy', '[YOUR_DEPLOYED_FUNCTION_NAME]', '[YOUR_FUNCTION_TRIGGER]', '--runtime', 'python37', '--entry-point', '[YOUR_FUNCTION_NAME_IN_CODE]']
  dir: 'function/dir/from/repo/root'

Go

steps:
- name: golang
  args: ['go', 'version']
- name: golang
  args: ['go', 'test']
  dir: 'function/dir/from/repo/root'
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['functions', 'deploy', '[YOUR_DEPLOYED_FUNCTION_NAME]', '[YOUR_FUNCTION_TRIGGER]', '--runtime', 'go113', '--entry-point', '[YOUR_FUNCTION_NAME_IN_CODE]']
  dir: 'function/dir/from/repo/root'

Java

steps:
- name: 'gcr.io/cloud-builders/mvn'
  args: ['clean', 'verify']
  dir: 'function/dir/from/repo/root'
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['functions', 'deploy', '[YOUR_DEPLOYED_FUNCTION_NAME]', '[YOUR_FUNCTION_TRIGGER]', '--runtime', 'java11', '--entry-point', '[YOUR_FUNCTION_NAME_IN_CODE]']
  dir: 'function/dir/from/repo/root'

Substitua:

  • [YOUR_DEPLOYED_FUNCTION_NAME] com o nome do Cloud Functions a ser usado no Console do Google Cloud, no SDK do Cloud e no URL.
  • [YOUR_FUNCTION_TRIGGER] com o valor do gatilho sendo --trigger-http.
  • [YOUR_RUNTIME] com o identificador do ambiente de execução sendo nodejs10.
  • [YOUR_FUNCTION_NAME_IN_CODE] com o nome da função como aparece no código. --entry-point somente será necessário se esse valor for diferente de [YOUR_DEPLOYED_FUNCTION_NAME].
  • function/dir/from/repo/root com o caminho para o diretório que contém a função.

Como conceder permissões para executar criações e implantações

Se você estiver usando o Cloud Build para implantar o Cloud Functions, precisará conceder permissões à conta de serviço do Cloud Build (PROJECT_NUMBER@cloudbuild.gserviceaccount.com). Essa conta é usada para executar versões em seu nome.

  1. Encontre seu número do projeto:

    gcloud projects describe PROJECT_ID
    

    Para mais informações sobre como identificar seu projeto, consulte Como criar e gerenciar projetos.

  2. Permita que a conta de serviço do Cloud Build aja como a conta de serviço do ambiente de execução do Cloud Functions:

    gcloud iam service-accounts add-iam-policy-binding PROJECT_ID@appspot.gserviceaccount.com \
     --member serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
     --role roles/iam.serviceAccountUser
    
  3. Atribua o papel de desenvolvedor do Cloud Functions à conta de serviço do Cloud Build. Ela permite que o Cloud Build implante o Cloud Functions:

    gcloud projects add-iam-policy-binding PROJECT_ID \
     --member serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
     --role roles/cloudfunctions.developer
    

Para mais informações, consulte Papéis do IAM do Cloud Functions.

Agora, sempre que você enviar conteúdo por push para o repositório com o Cloud Build ativado, as etapas no arquivo cloudbuild.yaml serão executadas.