Neste tutorial, mostramos 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 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, Azure Pipelines, Cloud Run e
git. Para concluir este tutorial, você precisa ter acesso administrativo a uma conta do Azure DevOps.
Objetivos
- Conecte o Artifact Registry ao Azure Pipelines para publicar imagens do Docker.
- Prepare um aplicativo de amostra.NET 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ê vai usar os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na sua projeção de uso, utilize a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpar.
Confira a página de preços do Azure DevOps para saber quais taxas podem ser aplicadas 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 se refere a esse projeto como o projeto de desenvolvimento.
- Crie um projeto do Google Cloud para produção. O tutorial se refere a esse projeto como o projeto de produção.
-
Verify 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 builds e testes e orquestrar a implantação no Cloud Run. Para começar, crie um novo 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 Importar para bifurcar o repositório
dotnet-docs-samplesdo 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 Artifact Registry
Antes de configurar a integração contínua para o app CloudDemo, é preciso conectar o Azure Pipelines ao Artifact Registry. Essa conexão permite que o Azure Pipelines publique imagens de contêiner no Artifact Registry.
Configurar uma conta de serviço para publicar imagens
Crie uma conta de serviço doGoogle 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 Artifact Registry no projeto de produção:
gcloud services enable artifactregistry.googleapis.com \ --project=$PROD_PROJECT_IDCrie um repositório do Artifact Registry para armazenar suas imagens do Docker:
gcloud artifacts repositories create docker \ --project=$PROD_PROJECT_ID \ --repository-format=docker \ --location REGIONSubstitua
REGIONpela região do seu repositório do Artifact Registry, por exemplo,us-central1.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_IDConceda o papel de gravador do Artifact Registry (
roles/artifactregistry.writer) à conta de serviço para permitir que o Azure Pipelines seja enviado ao Artifact 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/artifactregistry.writer \ --project=$PROD_PROJECT_IDGere 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.jsonVeja 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.
- 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
Registro do Docker:
https://REGION-docker.pkg.dev/PROD_PROJECT_ID/docker/Substitua:
REGION: a região do repositório do Artifact RegistryPROD_PROJECT_ID: o nome do seu projeto de produção
ID do Docker:
_json_keySenha: 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.
- 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 pool: vmImage: ubuntu-22.04 trigger: - master variables: TargetFramework: 'net6.0' BuildConfiguration: 'Release' DockerImageName: 'PROD_PROJECT_ID/docker/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_IDpelo 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 -AConfirme 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 Artifact Registry, alterne para o projeto de produção no console Google Cloud , selecione Artifact Registry > docker e 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.
- 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.
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_IDA 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 Artifact 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/artifactregistry.reader gcloud projects add-iam-policy-binding $PROD_PROJECT_ID \ --member=serviceAccount:service-$PROD_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \ --role roles/artifactregistry.readerCrie 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.comCrie 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.comAtribua os papéis necessários do IAM 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_IDAtribua 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_IDGere 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 0Use a saída deste comando ao configurar o pipeline de versão.
- 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
- 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 Add.
- 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:
- No menu, alterne para a guia Tasks.
- Clique em Agent job.
- Defina Especificação do agente como ubuntu-22.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=$(CloudRun.Region)-docker.pkg.dev/$(ContainerRegistry.ProjectId)/docker/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 ServiceAccountKeyChave da conta de serviço criada para azure-pipelines-deployeranteriormente.Sim ContainerRegistry.ProjectIdCódigo do projeto de produção. CloudRun.RegionRegião em que você selecionou anteriormente para implantar recursos do Artifact Registry. CloudRun.ProjectId.DevelopmentCódigo do projeto de desenvolvimento. CloudRun.ProjectId.ProductionCódigo do projeto de produção. Clique em Save.
Insira um comentário se quiser e clique em OK para confirmar.
- 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 Especificação do agente como ubuntu-22.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=$(CloudRun.Region)-docker.pkg.dev/$(ContainerRegistry.ProjectId)/docker/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.
- No computador local, abra o arquivo
applications\clouddemo\netcore\CloudDemo.MvcCore\Views\Home\Index.cshtmlno repositório Git que você clonou anteriormente. - Mude o valor de
ViewBag.TitledeHome PageparaHome 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 -AConfirme 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 Google Cloud console, 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.
Criar uma conexão de serviço para o Artifact Registry
No Azure Pipelines, crie uma conexão de serviço para o Artifact Registry:
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 Artifact Registry.
O repositório já contém o seguinte Dockerfile:
Agora, crie um novo pipeline que use a sintaxe YAML:
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:
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 build que você configurou anteriormente marca cada imagem do Docker com
o ID do build antes de publicá-la no Artifact 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 Artifact Registry | roles/artifactregistry.writer (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 | Extrair imagens Docker do Artifact Registry | roles/artifactregistry.reader (somente projeto de produção) |
| Executor do CloudDemo (conta de serviço do ambiente de execução) | Serviço CloudDemo | Acessar recursos em 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
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:
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.
Configurar o pipeline de versão
Agora você pode retornar ao Azure Pipelines para automatizar a implantação, que inclui as seguintes etapas:
Crie uma definição de versão
Primeiro, crie uma definição de versão:
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.
Implante no cluster de produção
Por fim, configure a implantação no projeto de produção:
Executar o pipeline
Agora que você configurou o pipeline inteiro, é possível testá-lo executando uma alteração no código-fonte:
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 app no Google Kubernetes Engine.
- Leia mais sobre como implantar aplicativos .NET no Google Cloud.
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.