Neste tutorial, você verá como usar o Azure Pipelines, o Cloud Run e o Container Registry para criar um pipeline de integração/implantação contínuas (CI/CD) para um aplicativo da Web MVC ASP.NET Core.
O pipeline de CI/CD usa dois projetos do Google Cloud, um para desenvolvimento e outro para produção, como mostra o diagrama a seguir.
No início do pipeline, os desenvolvedores confirmam as alterações no codebase de exemplo. Esta ação aciona o pipeline para criar uma versão e implantá-la no Cloud Run no cluster de desenvolvimento. Um gerente de versão promove a versão para que ela seja implantada no projeto de produção.
Este tutorial se destina a desenvolvedores e engenheiros de DevOps. Ele pressupõe que
você tenha conhecimentos básicos sobre .NET Core, Azure Pipelines,
Cloud Run e git
. Para concluir este tutorial, você precisa
ter acesso administrativo a uma conta do Azure DevOps.
Objetivos
- Conectar o Container Registry ao Azure Pipelines para publicar imagens do Docker.
- Prepare um aplicativo de amostra .NET Core para implantação no Cloud Run.
- Configure a autenticação entre o Azure Pipelines e o Google Cloud.
- Use o gerenciamento de versões do Azure Pipelines para orquestrar implantações do Cloud Run.
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
Verifique a página de preços do Azure DevOps para ver as taxas aplicáveis ao uso do Azure DevOps.
Antes de começar
Neste tutorial são usados dois projetos separados, um para desenvolvimento e outro para produção. O uso de projetos separados permite testar as versões antes de implantá-las na produção e também permite gerenciar papéis e permissões do Gerenciamento de identidade e acesso (IAM, na sigla em inglês) individualmente.
- Crie um projeto do Google Cloud para desenvolvimento. O tutorial refere-se a este projeto como o projeto de desenvolvimento.
- Crie um projeto do Google Cloud para produção. O tutorial refere-se a este projeto como o projeto de produção.
-
Make sure that billing is enabled for your Google Cloud project.
- Verifique se você tem uma conta do Azure DevOps e se tem acesso de administrador a ela. Se você ainda não tiver uma conta do Azure DevOps, inscreva-se na página inicial do Azure DevOps.
Criar um projeto do Azure DevOps
Use o Azure DevOps para gerenciar o código-fonte, executar compilações e testes e orquestrar a implantação no Cloud Run. Para começar, crie um projeto na sua conta do Azure DevOps.
- Acesse a página inicial do Azure DevOps (https://dev.azure.com/YOUR_AZURE_DEVOPS_ACCOUNT_NAME).
- Clique em New project.
- Insira um nome de projeto, como
CloudDemo
. - Defina Visibility como Private e clique em Create project.
- Depois de criar o projeto, clique em Repos no menu à esquerda.
- Clique em Import para bifurcar o repositório
dotnet-docs-samples
do GitHub e defina os seguintes valores:- Tipo de repositório:
Git
- URL do clone:
https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
- Tipo de repositório:
Clique em Importar.
Quando o processo de importação estiver concluído, você verá o código-fonte do repositório
dotnet-docs-samples
.
Conectar o Azure Pipelines ao Container Registry
Antes de configurar a integração contínua para o aplicativo CloudDemo
, é preciso conectar o Azure Pipelines ao Container Registry. Essa conexão permite que o Azure Pipelines publique imagens de contêiner no Container Registry.
Configurar uma conta de serviço para publicar imagens
Crie uma conta de serviço do Google Cloud no seu projeto de produção:
- No Console do Google Cloud, mude para o projeto de produção.
-
In the Google Cloud console, activate Cloud Shell.
Inicialize as seguintes variáveis de ambiente:
DEV_PROJECT_ID=DEV_PROJECT_ID PROD_PROJECT_ID=PROD_PROJECT_ID
Substitua:
DEV_PROJECT_ID
: o código do projeto de desenvolvimentoPROD_PROJECT_ID
: o código do projeto de produção
Ative a API Container Registry no projeto de produção:
gcloud services enable containerregistry.googleapis.com \ --project=$PROD_PROJECT_ID
Crie uma conta de serviço que o Azure Pipelines usa para publicar imagens do Docker:
gcloud iam service-accounts create azure-pipelines-publisher \ --display-name="Azure Pipelines Publisher" \ --project=$PROD_PROJECT_ID
Conceda o papel de IAM do Storage Admin (
roles/storage.admin
) à conta de serviço para permitir que o Azure Pipelines seja enviado ao Container Registry:AZURE_PIPELINES_PUBLISHER=azure-pipelines-publisher@$PROD_PROJECT_ID.iam.gserviceaccount.com gcloud projects add-iam-policy-binding $PROD_PROJECT_ID \ --member serviceAccount:$AZURE_PIPELINES_PUBLISHER \ --role roles/storage.admin \ --project=$PROD_PROJECT_ID
Gere uma chave de conta de serviço:
gcloud iam service-accounts keys create azure-pipelines-publisher.json \ --iam-account $AZURE_PIPELINES_PUBLISHER \ --project=$PROD_PROJECT_ID tr -d '\n' < azure-pipelines-publisher.json > azure-pipelines-publisher-oneline.json
Veja o conteúdo do arquivo de chave da conta de serviço:
echo $(<azure-pipelines-publisher-oneline.json)
Você precisa da chave da conta de serviço em uma das etapas a seguir.
Como criar uma conexão de serviço para o Container Registry
No Azure Pipelines, crie uma nova conexão de serviço para o Container Registry:
- No menu do Azure DevOps, selecione Configurações do projeto e, em seguida, selecione Pipelines > Conexões do serviço.
- Clique em Criar conexão de serviço.
- Na lista, selecione Registro do Docker e clique em Avançar.
- Na caixa de diálogo, insira valores para os seguintes campos:
- Tipo de registro: Outros
- Docker Registry:
https://gcr.io/PROD_PROJECT_ID
, substituindoPROD_PROJECT_ID
pelo nome do projeto de produção (por exemplo,https://gcr.io/azure-pipelines-test-project-12345
). - ID do Docker:
_json_key
- Senha: cole o conteúdo de
azure-pipelines-publisher-oneline.json
. - Nome da conexão de serviço:
gcr-tutorial
- Clique em Salvar para criar a conexão.
Como compilar continuamente
Agora, use o Azure Pipelines para configurar a integração contínua. Para cada confirmação enviada para o repositório Git, o Azure Pipelines cria o código e empacota os artefatos de build em um contêiner do Docker. Em seguida, o contêiner é publicado no Container Registry.
O repositório já contém o seguinte Dockerfile:
Agora, crie um novo pipeline que use a sintaxe YAML:
- Usando o Visual Studio ou um cliente de linha de comando
git
, clone seu novo repositório Git. - Na raiz do repositório, crie um arquivo chamado
azure-pipelines.yml
. Copie o seguinte código no arquivo:
resources: - repo: self fetchDepth: 1 queue: name: Hosted Ubuntu 1604 trigger: - master variables: TargetFramework: 'net6.0' BuildConfiguration: 'Release' DockerImageName: 'PROD_PROJECT_ID/CloudDemo' steps: - task: DotNetCoreCLI@2 displayName: Publish inputs: projects: 'applications/clouddemo/netcore/CloudDemo.MvcCore.sln' publishWebProjects: false command: publish arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)' zipAfterPublish: false modifyOutputPath: false - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact' inputs: PathtoPublish: '$(build.artifactstagingdirectory)' - task: Docker@2 displayName: 'Login to Container Registry' inputs: command: login containerRegistry: 'gcr-tutorial' - task: Docker@2 displayName: 'Build and push image' inputs: Dockerfile: 'applications/clouddemo/netcore/Dockerfile' command: buildAndPush repository: '$(DockerImageName)'
Substitua
PROJECT_ID
pelo nome do projeto de produção e salve o arquivo.Como o Cloud Run é um ambiente baseado em Linux, o pipeline usa agentes de versão baseados em Linux.
Confirme as alterações e envie-as para o Azure Pipelines.
Visual Studio
- Abra o Team Explorer e clique no ícone Home.
- Clique em Changes.
- Insira uma mensagem de confirmação como
Add pipeline definition
. - Clique em Confirmar tudo e enviar por push.
Linha de comando
Organize todos os arquivos modificados:
git add -A
Confirme as alterações no repositório local:
git commit -m "Add pipeline definition"
Envie as alterações para o Azure DevOps:
git push
No menu do Azure DevOps, selecione Pipelines e clique em Criar pipeline.
Selecione Azure Repos Git.
Selecione seu Repositório.
Na página Revise o YAML do pipeline, clique em Executar.
Uma nova versão é acionada. Pode levar cerca de dois minutos para que a compilação seja concluída.
Para verificar se a imagem foi publicada no Container Registry, alterne para o projeto de produção no Console do Cloud, selecione Container Registry > Imagens e, em seguida, Clique em CloudDemo.
Uma única imagem e a tag desta imagem são exibidas. A tag corresponde ao ID numérico da compilação executada no Azure Pipelines.
Como implantar continuamente
Agora que o Azure Pipelines está compilando automaticamente seu código e publicando imagens do Docker para cada commit, retorne sua atenção para a implantação.
Ao contrário de alguns outros sistemas de integração contínua, o Azure Pipelines distingue entre criação e implantação e fornece um conjunto especializado de ferramentas chamado Gerenciamento de versões para todas as tarefas relacionadas à implantação.
O Gerenciamento de versões do Azure Pipelines é criado com base nestes conceitos:
- Uma versão se refere a um conjunto de artefatos que compõem uma versão específica do app e que geralmente é o resultado de um processo de compilação.
- Implantação refere-se ao processo de escolher uma versão e implantá-la em um ambiente específico.
- Uma implantação executa um conjunto de tarefas, que podem ser agrupadas em jobs.
- Os estágios permitem segmentar o pipeline e podem ser usados para orquestrar implantações em vários ambientes, como ambientes de desenvolvimento e teste.
Configure o pipeline de versão a ser acionado sempre que uma nova compilação for concluída. O pipeline consiste em dois estágios: desenvolvimento e produção. Em cada estágio, o pipeline de versão usa a imagem do Docker que o pipeline de compilação produz e o implanta no Cloud Run.
O pipeline de compilação que você configurou anteriormente marca cada imagem do Docker com
o código da compilação antes de publicá-la no Container Registry. Portanto, no
pipeline de versão, use a variável $BUILD_BUILDID
para identificar a imagem
do Docker correta a ser implantada.
Configurar o Cloud Run
O Cloud Run é um ambiente totalmente gerenciado e sem servidor. Portanto, você não precisa provisionar nenhuma infraestrutura. Para ajudar a manter as implantações do Cloud Run seguras, é necessário configurar o IAM.
A implantação e execução de um serviço do Cloud Run envolve várias identidades, como mostra o diagrama a seguir.
Cada uma destas identidades é implementada como uma conta de serviço e usada para uma finalidade específica, conforme descrito na tabela a seguir.
Conta de serviço | Usada por | Finalidade | Papéis necessários |
---|---|---|---|
Editor do Azure Pipelines | Pipeline de criação | Publicar imagens do Docker no Container Registry | roles/storage.admin (somente projeto de produção) |
Implantador do Azure Pipelines | Pipeline de versão | Iniciar implantações do Cloud Run | roles/run.admin |
Inicie o serviço CloudDemo. | roles/iam.serviceAccountUser |
||
Agente de serviço do Cloud Run | Cloud Run | Retire as imagens do Docker do Container Registry | roles/storage.objectViewer (somente projeto de produção) |
Executor do CloudDemo (conta de serviço do ambiente de execução) | Serviço CloudDemo | Acessar os recursos no Google Cloud | Nenhum |
Você criou e configurou a conta de serviço do editor do Azure Pipelines. Nas seções a seguir, você cria e configura as contas de serviço restantes.
Configurar a conta de serviço do Cloud Run
Abra o Cloud Shell.
Inicialize as seguintes variáveis de ambiente:
DEV_PROJECT_ID=DEV_PROJECT_ID PROD_PROJECT_ID=PROD_PROJECT_ID
Substitua:
DEV_PROJECT_ID
: o código do projeto de desenvolvimentoPROD_PROJECT_ID
: o código do projeto de produção
Ative as APIs do Cloud Run e do Compute Engine nos projetos de desenvolvimento e produto:
gcloud services enable run.googleapis.com --project=$DEV_PROJECT_ID gcloud services enable run.googleapis.com --project=$PROD_PROJECT_ID
A ativação destas APIs faz com que as contas do agente de serviço do Cloud Run sejam criadas nos seus projetos.
Conceda às duas contas de agente de serviço do Cloud Run acesso ao Container Registry no projeto de produção em que as imagens do Docker estão armazenadas:
DEV_PROJECT_NUMBER=$(gcloud projects describe $DEV_PROJECT_ID \ --format='value(projectNumber)') PROD_PROJECT_NUMBER=$(gcloud projects describe $PROD_PROJECT_ID \ --format='value(projectNumber)') gcloud projects add-iam-policy-binding $PROD_PROJECT_ID \ --member=serviceAccount:service-$DEV_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \ --role roles/storage.objectViewer gcloud projects add-iam-policy-binding $PROD_PROJECT_ID \ --member=serviceAccount:service-$PROD_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \ --role roles/storage.objectViewer
Configurar a conta de executor do CloudDemo
Agora é possível configurar a conta de executor do CloudDemo, que é uma conta de serviço do ambiente de execução personalizada para o serviço CloudDemo:
Crie uma conta de serviço chamada
CloudDemo-runner
:gcloud iam service-accounts create clouddemo-runner \ --display-name="CloudDemo Runner" \ --project=$DEV_PROJECT_ID gcloud iam service-accounts create clouddemo-runner \ --display-name="CloudDemo Runner" \ --project=$PROD_PROJECT_ID DEV_CLOUDDEMO_RUNNER=clouddemo-runner@$DEV_PROJECT_ID.iam.gserviceaccount.com PROD_CLOUDDEMO_RUNNER=clouddemo-runner@$PROD_PROJECT_ID.iam.gserviceaccount.com
Configure a conta do implantador do Azure Pipelines
Por fim, crie e configure a conta do implantador do Azure Pipelines, que o pipeline de versão do Azure usa para implantar no Cloud Run.
Crie uma conta de serviço chamada
azure-pipelines-deployer
:gcloud iam service-accounts create azure-pipelines-deployer \ --display-name="Azure Pipelines Deployer" \ --project=$PROD_PROJECT_ID AZURE_PIPELINES_DEPLOYER=azure-pipelines-deployer@$PROD_PROJECT_ID.iam.gserviceaccount.com
Atribua os papéis necessários do AM para implantar novos serviços ou revisões do Cloud Run no projeto de desenvolvimento:
gcloud projects add-iam-policy-binding $DEV_PROJECT_ID \ --member serviceAccount:$AZURE_PIPELINES_DEPLOYER \ --role roles/run.admin gcloud iam service-accounts add-iam-policy-binding \ $DEV_CLOUDDEMO_RUNNER \ --member=serviceAccount:$AZURE_PIPELINES_DEPLOYER \ --role="roles/iam.serviceAccountUser" \ --project=$DEV_PROJECT_ID
Atribua o mesmo conjunto de papéis para o projeto de produção:
gcloud projects add-iam-policy-binding $PROD_PROJECT_ID \ --member serviceAccount:$AZURE_PIPELINES_DEPLOYER \ --role roles/run.admin gcloud iam service-accounts add-iam-policy-binding \ $PROD_CLOUDDEMO_RUNNER \ --member=serviceAccount:$AZURE_PIPELINES_DEPLOYER \ --role="roles/iam.serviceAccountUser" \ --project=$PROD_PROJECT_ID
Gere uma chave de conta de serviço:
gcloud iam service-accounts keys create azure-pipelines-deployer.json \ --iam-account=$AZURE_PIPELINES_DEPLOYER \ --project=$PROD_PROJECT_ID cat azure-pipelines-deployer.json | base64 -w 0
Use a saída deste comando ao configurar o pipeline de versão.
Configurar o pipeline de versão
Agora você pode retornar ao Azure Pipelines para automatizar a implantação, que inclui as seguintes etapas:
- Implantação no ambiente de desenvolvimento.
- Solicitação de aprovação manual antes de iniciar uma implantação no ambiente de produção
- Implantação no ambiente de produção
Crie uma definição de versão
Primeiro, crie uma definição de versão:
- No menu do Azure DevOps, selecione Pipelines > Releases.
- Clique em New pipeline.
- Na lista de modelos, selecione Job vazio.
- Quando for necessário inserir um nome para o estágio, digite
Development
. - Na parte superior da tela, nomeie o pipeline como
CloudDemo
. - No diagrama de pipeline, ao lado de Artefatos, clique em Adicionar.
- Selecione Build e adicione as seguintes configurações:
- Tipo de origem: Compilação
- Origem (build pipeline): selecione a definição de compilação. Haverá apenas uma opção
- Versão padrão: Latest
- Alias de origem:
build
- Clique em Adicionar.
- Na caixa Artifact, clique em Continuous deployment trigger (ícone de raio) para adicionar um gatilho de implantação.
- Em Continuous deployment trigger, defina a chave como Enabled.
- Clique em Save.
Insira um comentário, se quiser, e confirme clicando em OK.
O pipeline será assim:
Implante no projeto de desenvolvimento
Com a definição da versão criada é possível configurar a implantação do Cloud Run no projeto de desenvolvimento.
- No menu, alterne para a guia Tasks.
- Clique em Agent job.
- Defina Agent specification para ubuntu-18.04.
- Ao lado de Agent job, clique em Add a task to agent job para adicionar uma etapa à fase.
- Selecione a tarefa Command Line e clique em Add.
Clique na tarefa recém-adicionada e defina as seguintes configurações:
- Nome de exibição:
Deploy image to development project
Script:
gcloud auth activate-service-account \ --quiet \ --key-file <(echo $(ServiceAccountKey) | base64 -d) && \ gcloud run deploy clouddemo \ --quiet \ --service-account=clouddemo-runner@$(CloudRun.ProjectId.Development).iam.gserviceaccount.com \ --allow-unauthenticated \ --image=gcr.io/$(ContainerRegistry.ProjectId)/clouddemo:$BUILD_BUILDID \ --platform=managed \ --region=$(CloudRun.Region) \ --project=$(CloudRun.ProjectId.Development)
Esse comando recebe uma chave de conta de serviço de uma variável de ambiente e usa a CLI gcloud para implantar o aplicativo no Cloud Run. A CLI gcloud está disponível por padrão nos agentes do Azure Pipelines.
- Nome de exibição:
Alterne para a guia Variables e adicione as seguintes variáveis.
Nome Valor Secret ServiceAccountKey
Chave da conta de serviço criada para azure-pipelines-deployer
anteriormente.Sim ContainerRegistry.ProjectId
Código do projeto de produção. CloudRun.Region
Região em que você selecionou anteriormente para implantar recursos do Cloud Run. CloudRun.ProjectId.Development
Código do projeto de desenvolvimento. CloudRun.ProjectId.Production
Código do projeto de produção. Clique em Save.
Insira um comentário se quiser e clique em OK para confirmar.
Implante no cluster de produção
Por fim, configure a implantação no projeto de produção:
- No menu, alterne para a guia Pipeline.
- Na caixa Stages, select Add > New stage.
- Na lista de modelos, selecione Job vazio.
- Quando for necessário inserir um nome para o estágio, digite
Production
. - Clique no ícone de raio, referente ao cenário recém-criado.
Defina as configurações a seguir:
- Select trigger: After stage
- Stages: Development
- Pre-deployment approvals: (ativada)
- Approvers: selecione seu nome de usuário.
O pipeline exibe uma visualização semelhante à seguinte.
Alterne para a guia Tasks.
Mantenha o mouse sobre a guia Tasks e selecione Tasks > Production.
Clique em Agent job.
Defina Agent specification para ubuntu-18.04.
Clique em Add a task to agent job
para adicionar uma etapa à fase.Selecione a tarefa Command Line e clique em Add.
Clique na tarefa recém-adicionada e defina as seguintes configurações:
- Nome de exibição:
Deploy image to production project
Script:
gcloud auth activate-service-account \ --quiet \ --key-file <(echo $(ServiceAccountKey) | base64 -d) && \ gcloud run deploy clouddemo \ --quiet \ --service-account=clouddemo-runner@$(CloudRun.ProjectId.Production).iam.gserviceaccount.com \ --allow-unauthenticated \ --image=gcr.io/$(ContainerRegistry.ProjectId)/clouddemo:$BUILD_BUILDID \ --platform=managed \ --region=$(CloudRun.Region) \ --project=$(CloudRun.ProjectId.Production)
- Nome de exibição:
Clique em Save.
Insira um comentário se quiser e clique em OK para confirmar.
Executar o pipeline
Agora que você configurou o pipeline inteiro, é possível testá-lo executando uma alteração no código-fonte:
- No computador local, abra o arquivo
applications\clouddemo\netcore\CloudDemo.MvcCore\Views\Home\Index.cshtml
no repositório Git que você clonou anteriormente. - Na linha 26, altere o valor de
ViewBag.Title
deHome Page
paraHome Page Cloud Run
. Confirme as alterações e envie-as para o Azure Pipelines.
Visual Studio
- Abra o Team Explorer e clique no ícone Home.
- Clique em Changes.
- Insira uma mensagem de confirmação como
Change site title
. - Clique em Confirmar tudo e enviar por push.
Linha de comando
Organize todos os arquivos modificados:
git add -A
Confirme as alterações no repositório local:
git commit -m "Change site title"
Envie as alterações para o Azure Pipelines:
git push
No menu do Azure DevOps, selecione Pipelines. Um build é acionada.
Após a conclusão do build, selecione Pipelines > Releases. Um processo de versão será iniciado.
Clique em Release-1 para abrir a página de detalhes e aguarde até que o status do estágio Development mude para Succeeded.
No Console do Google Cloud, mude para o projeto de desenvolvimento.
No menu, selecione Compute > Cloud Run.
O serviço clouddemo é implantado com sucesso.
Clique em clouddemo para ver mais detalhes.
Será exibido um URL que mostrará que o Cloud Run forneceu o serviço.
Abra o URL em uma nova guia do navegador para verificar se o aplicativo CloudDemo está implantado e usa o título personalizado.
No Azure Pipelines, clique em Approve (adjacent to the Production stage) para promover a implantação no ambiente de produção.
(Opcional) Digite um comentário.
Confirme clicando em Approve e aguarde o status do ambiente Production mudar para Succeeded.
No Console do Google Cloud, mude para o projeto de produção.
No menu, selecione Compute > Cloud Run.
O serviço clouddemo é implantado no projeto de produção.
Clique em clouddemo para ver mais detalhes.
Um URL é exibido e mostra que o Cloud Run forneceu o serviço.
Abra o URL em uma nova guia do navegador para verificar se o aplicativo CloudDemo está implantado na produção e se usa o título personalizado.
Limpeza
Para evitar custos adicionais depois de concluir este tutorial, exclua as entidades criadas.
Excluir o projeto do Azure Pipelines
Para excluir o projeto do Azure Pipelines, consulte a documentação de serviços do Azure DevOps. A exclusão do projeto do Azure Pipelines faz com que todas as alterações no código-fonte sejam perdidas.
Excluir os projetos de desenvolvimento e produção do Google Cloud
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
A seguir
- Configure um domínio personalizado para o serviço do Cloud Run.
- Saiba como usar o Azure Pipelines para implantar o mesmo aplicativo no Google Kubernetes Engine .
- Leia mais sobre como implantar aplicativos .NET no Google Cloud.
- Confira arquiteturas de referência, diagramas e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.