Tutorial: Implantar um aplicativo ASP.NET Core e um Banco de Dados em Aplicativos de Contêiner do Azure usando o GitHub Actions

Neste tutorial, você aprenderá a implantar um aplicativo ASP.NET Core e o Banco de Dados SQL nos Aplicativos de Contêiner do Azure usando o Visual Studio e o GitHub Actions. Você também aprenderá a gerenciar migrações do Entity Framework e atualizações de banco de dados no GitHub Actions, embora os conceitos também possam ser aplicados a outras ferramentas e ambientes de CI/CD.

Pré-requisitos

Você precisa do Visual Studio 2022 instalado com as cargas de trabalho de desenvolvimento do ASP.NET e para a Web e desenvolvimento do Azure.

Se você já instalou o Visual Studio:

  • Instale as atualizações mais recentes no Visual Studio selecionando Ajuda>Verificar atualizações.
  • Verifique se as cargas de trabalho desenvolvimento do ASP.NET e para a Web e desenvolvimento do Azure estão instaladas selecionando Ferramentas>Obter Ferramentas e Recursos.

Configurar o aplicativo de exemplo localmente

Use o aplicativo de exemplo TODO para acompanhar este tutorial. Clone o aplicativo do GitHub usando o seguinte comando:

git clone https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore.git
cd msdocs-app-service-sqldb-dotnetcore

Navegue até a pasta do projeto e abra a solução DotNetCoreSqlDb.sln no Visual Studio.

O aplicativo TODO está pronto para ir, mas você precisará estabelecer uma conexão com o localdb SQL Server que está disponível no Visual Studio. A conexão com localdb permitirá que você execute o aplicativo e persista listas de tarefas enquanto trabalha localmente.

  1. Clique com o botão direito do mouse no nó Serviços Conectados no Gerenciador de Soluções do Visual Studio e selecione Adicionar > Banco de Dados SQL Server.
  2. Na caixa de diálogo Conectar-se a dependência, selecione SQL Server Express LocalDB (Local) e Avançar.
  3. Na caixa de diálogo Conectar-se ao SQL Server Express LocalDB (Local), defina os seguintes valores:
    • Nome da cadeia de conexão: Deixe o valor padrão.
    • Valor da cadeia de conexão: Deixe o valor padrão.
    • Salvar o valor da cadeia de conexão em: selecione Nenhum.
    • Selecione Próximo
  4. Na tela Resumo das alterações, deixe as configurações em seus valores padrão e selecione Concluir para concluir o fluxo de trabalho.

O Visual Studio exibe um resumo das dependências de serviço, incluindo a conexão com LocalDB.

Uma captura de tela mostrando como adicionar uma migração usando o Visual Studio.

Em seguida, você precisará criar uma migração inicial e usá-la para atualizar o banco de dados local com o esquema correto para o aplicativo TODO.

  1. Selecione o ícone ... à direita da lista de dependências de serviço ao lado da conexão LocalDB e escolha Adicionar migração.
  2. Na caixa de diálogo Migrações do Entity Framework, aguarde um momento para que o Visual Studio localize a classe DbContext incluída no projeto. Depois que os valores forem carregados, selecione Concluir.
  3. O Visual Studio gera uma pasta Migrations no projeto e cria uma classe de migrações iniciais. Essa classe pode ser usada para atualizar o banco de dados com o esquema correto.
  4. Selecione o ícone ... ao lado do serviço LocalDB novamente e selecione Atualizar banco de dados.
  5. Na caixa de diálogo Migrações do Entity Framework, aguarde um momento para que o Visual Studio localize a classe DbContext novamente e escolha Concluir. O Visual Studio executa a migração e cria o esquema para o banco de dados no servidor LocalDB.

Inicie o projeto selecionando o botão executar DotNetCoreSqlDb na parte superior do Visual Studio.

Quando o aplicativo for carregado, verifique se o banco de dados está funcionando corretamente inserindo um novo TODO. A TAREFA pendente aparece no modo de exibição de lista principal na home page do aplicativo.

Explorar a configuração de inicialização do aplicativo

O aplicativo de exemplo inclui o seguinte código no arquivo Program.cs:

if(builder.Environment.IsDevelopment())
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
}
else
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")));
}

Esse código aplica as seguintes configurações:

  • Quando o aplicativo é executado localmente, a cadeia de conexão localdb é extraída do arquivo appsettings.json e fornecida ao Entity Framework. Essa configuração permite que a cadeia de conexão localdb seja verificada no controle do código-fonte para que outros desenvolvedores possam se conectar facilmente a um banco de dados local durante o desenvolvimento. Ele também permite que as migrações do Entity Framework sejam executadas localmente. Por padrão, o Entity Framework não descobrirá cadeias de conexão armazenadas na variável de ambiente ao executar migrações.
  • Quando o aplicativo é executado em fluxos de trabalho do GitHub Actions ou em Produção, a cadeia de conexão é extraída de variáveis de ambiente. As variáveis de ambiente podem impedir que cadeias de conexão seguras de produção sejam verificadas no controle do código-fonte ou incluídas em arquivos de configuração.

Criar os serviços do Azure

O aplicativo exigirá que os seguintes serviços do Azure sejam criados para uma implantação bem-sucedida:

  • Aplicativo de Contêiner: Necessário para hospedar e executar o aplicativo implantado.
  • Registro de Contêiner: armazena o artefato de imagem compilado do aplicativo em contêineres.
  • Banco de Dados SQL: Um banco de dados do Azure SQL para armazenar os dados do Aplicativo.

Os recursos de publicação do Visual Studio podem lidar com a criação desses recursos para você.

Criar o Aplicativo de Contêiner do Azure e o Registro de Contêiner do Azure

  1. No Gerenciador de Soluções do Visual Studio, clique com o botão direito do mouse no nó do projeto de nível superior e selecione Publicar.

  2. Na caixa de diálogo de publicação, selecione Azure como destino de implantação e selecione Avançar.

  3. Para o destino específico, selecione Aplicativos de Contêiner do Azure (Linux) e, em seguida, Avançar.

  4. Crie um novo aplicativo de contêiner para o qual implantar. Selecione o botão + Criar nova para abrir uma nova caixa de diálogo e insira os seguintes valores:

    Uma captura de tela mostrando como criar um aplicativo de contêiner.

    • Nome do aplicativo contêiner: Deixe o valor padrão ou insira um nome.
    • Nome da assinatura: Selecione a assinatura na qual implantar.
    • Grupo de recursos: Selecione Novo e crie um novo grupo de recursos chamado msdocs-app-db-ef.
    • Ambiente de aplicativos de contêiner: selecione Novo para abrir a caixa de diálogo do ambiente de aplicativos de contêiner e insira os seguintes valores:
      • Nome do ambiente: Manter o valor padrão.
      • Local: Selecione um local próximo a você.
      • Workspace do Azure Log Analytics: selecione Novo para abrir a caixa de diálogo do workspace do Log Analytics.
        • Nome: Deixe o valor padrão.
        • Local: Selecione um local próximo a você e selecione Ok para fechar a caixa de diálogo.
      • Selecione Ok para fechar a caixa de diálogo de ambiente de aplicativos de contêiner.
    • Selecione Criar para fechar a caixa de diálogo original do aplicativo de contêiner. O Visual Studio cria o recurso de aplicativo de contêiner no Azure.
  5. Depois que o recurso for criado, verifique se ele está selecionado na lista de aplicativos de contêiner e selecione Próximo.

  6. Você precisará criar um registro de contêiner do Azure para armazenar o artefato de imagem publicado para seu aplicativo. Selecione o ícone verde + na tela do Registro de Contêiner .

    Uma captura de tela mostrando como criar um registro de contêiner.

  7. Deixe os valores padrão e selecione Criar.

  8. Depois que o registro de contêiner for criado, verifique se ele está selecionado e selecione o próximo.

  9. Na tela Tipo de implantação, selecione CI/CD usando fluxos de trabalho do GitHub Actions (gera o arquivo yml) e escolha Concluir. Se o Visual Studio solicitar que você habilite o usuário administrador a acessar o contêiner publicado do Docker, selecione Sim.

O Visual Studio cria e exibe o perfil de publicação. A maioria das etapas de publicação e detalhes são descritos no arquivo .yml do GitHub Actions, que pode ser exibido clicando no botão Editar fluxo de trabalho na exibição de resumo do perfil de publicação. Esse arquivo é abordado com mais profundidade posteriormente no artigo.

Criar o Banco de Dados SQL do Azure

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no nó Serviços Conectados e selecione Adicionar > Banco de Dados do SQL Server.
  2. Na caixa de diálogo Conectar-se a dependência, selecione Banco de Dados SQL do Azure e escolha Avançar.
  3. Selecione + Criar Novo para adicionar um novo banco de dados.
  4. Na caixa de diálogo do Banco de Dados SQL do Azure, insira os seguintes valores:
    • Nome do Banco de Dados: Deixe o valor padrão.
    • Nome da Assinatura: Selecione a mesma assinatura que anteriormente.
    • Grupo de Recursos: Selecione o mesmo grupo de msdocs-app-db-ef criado anteriormente.
    • Servidor de Banco de Dados: Selecione Novo... e insira os seguintes valores no novo POP-up:
      • Nome do Servidor de Banco de Dados: Insira um nome de servidor exclusivo ou acrescente números aleatórios ao final do nome gerado automaticamente.
      • Local: Selecione um local próximo a você.
      • Nome de usuário administrador: Insira um valor de sua escolha.
      • Senha de administrador: Insira um valor de sua escolha.
      • Senha do Administrador (confirme): Insira a mesma senha para confirmar. Selecione OK para fechar a caixa de diálogo SQL Server
    • Selecione Criar para criar o SQL Server e o banco de dados.
    • Quando a operação for concluída, selecione o servidor na lista e escolha Próximo
  5. Na caixa de diálogo Conectar-se ao Banco de Dados SQL do Azure, deixe os valores padrão, mas verifique se Nenhum está selecionado na parte inferior para a opção Salvar valor da cadeia de conexão em.
  6. Selecione Concluir e o Visual Studio criará os recursos do SQL.

Conectar o aplicativo de contêiner ao SQL do Azure

  1. Na página de visão geral do Aplicativo de Contêiner que você criou, selecione Conector de Serviço (versão prévia) na navegação à esquerda.

  2. Selecione + Criar para criar uma nova conexão.

  3. No submenu Criar conexão, insira os seguintes valores:

    • Contêiner: Selecione o contêiner dotnetcoresqldb que você criou.

    • Tipo de Serviço: Selecione Banco de Dados SQL.

    • Assinatura : Selecione a mesma assinatura usada para criar o aplicativo de contêiner.

    • Nome da conexão: Deixe o valor padrão.

    • SQL Server: Selecione o servidor de banco de dados criado anteriormente.

    • Banco de dados SQL: selecione o banco de dados criado anteriormente.

    • Tipo de cliente: Selecionar .NET.

      Uma captura de tela mostrando como usar o conector de serviço.

  4. Selecione Avançar: Autenticação e insira os seguintes valores:

    • Selecione Cadeia de conexão para o tipo de autenticação.
    • Nome de usuário: Insira o nome de usuário usado ao criar o servidor de banco de dados.
    • Senha: Insira a senha usada ao criar o servidor de banco de dados.
  5. Deixe o restante das configurações em seu padrão e selecione Avançar: Rede.

  6. Deixe o valor padrão selecionado e escolha Avançar: Revisar + Criar.

  7. Depois que o Azure validar as configurações, selecione Criar.

Após um momento, a conexão com o banco de dados SQL deve aparecer. Selecione a seta para expandir a conexão e veja o valor AZURE_SQL_CONNECTIONSTRING. Esse nome de conexão corresponde ao nome da cadeia de conexão de variável de ambiente definida no aplicativo de exemplo.

Configurar o fluxo de trabalho do GitHub Actions

O arquivo de fluxo de trabalho do GitHub Actions gerado pelo Visual Studio pode ser usado pelo GitHub para criar e implantar o aplicativo no Azure quando as alterações são enviadas por push. Atualmente, esse processo funcionaria, mas o aplicativo implantado geraria uma exceção. Embora o banco de dados SQL do Azure tenha sido criado, uma etapa deve ser adicionada ao fluxo de trabalho do GitHub Actions para gerar o esquema. A cadeia de conexão do banco de dados SQL do Azure pode ser armazenada com segurança como um segredo no GitHub e recuperada pelo fluxo de trabalho quando ele é executado.

Recuperar a cadeia de conexão e adicioná-la aos segredos do GitHub

  1. No portal do Azure, pesquise o banco de dados que você criou na barra de pesquisa principal e selecione-o nos resultados.

  2. Na página de visão geral do banco de dados, selecione Cadeias de conexão na navegação à esquerda.

  3. Na guia ADO.NET, copie a cadeia de conexão para fora do campo de formulário.

    Uma captura de tela mostrando como recuperar a cadeia de conexão.

  4. Navegue até o repositório GitHub clonado do aplicativo.

  5. Na guia Configurações, selecione Segredos > Ações na navegação à esquerda e escolha Novo segredo do repositório.

  6. Na página Novo segredo, insira os seguintes valores:

    • Nome: Insira um nome de DbConnection.

    • Segredo: cole a cadeia de conexão copiada do Azure. Substitua o espaço reservado de senha na cadeia de conexão pela senha escolhida ao criar o banco de dados.

    • Selecione Adicionar segredo.

      Uma captura de tela mostrando como criar um segredo do GitHub.

A cadeia de conexão agora é armazenada com segurança nos segredos do repositório GitHub e pode ser recuperada usando um fluxo de trabalho do GitHub.

Modificar o fluxo de trabalho do GitHub Actions para habilitar migrações

  1. Abra o arquivo do fluxo de trabalho .yml do GitHub Actions gerado pelo Visual Studio, selecionando o botão Editar Fluxo de Trabalho na página de resumo de publicação.

    Uma captura de tela mostrando como editar o fluxo de trabalho.

  2. Acrescente o seguinte yaml ao final do arquivo de fluxo de trabalho:

    - name: Run EF 
      run: | 
        dotnet tool install --global dotnet-ef
        dotnet tool restore
        dotnet ef database update -p DotNetCoreSqlDb --connection '${{ secrets.DBConnection }}'
    

    Esse código instala as ferramentas de linha de comando da estrutura de entidade e executa as migrações de aplicativo. Quando o fluxo de trabalho é executado, o código também usa o parâmetro connection do comando database update para substituir a cadeia de conexão localdb armazenada no arquivo appsettings.json com o valor que foi adicionado aos segredos do GitHub.

Execute o fluxo de trabalho do GitHub Actions e teste a implantação

  1. Confirme as alterações no aplicativo e envie por push para o repositório bifurcado usando o seguinte comando:

    git add --all
    git commit -m "Added GitHub Actions workflow"
    git push
    
  2. Navegue até o repositório GitHub e selecione a guia Ações. Uma execução de fluxo de trabalho deve ter sido disparada automaticamente se o push tiver sido bem-sucedido.

  3. Selecione o fluxo de trabalho ativo para exibir os detalhes do log para cada etapa à medida que elas forem concluídas. A migração é executada por último para atualizar o banco de dados no Azure.

    Uma captura de tela mostrando o fluxo de trabalho de ação do GitHub.

Após a conclusão do fluxo de trabalho, o aplicativo é implantado nos Aplicativos de Contêiner do Azure e conectado ao banco de dados com um esquema atualizado.

Você pode testar a implantação navegando até a home page do aplicativo de contêiner e criando um TODO, assim como fez localmente. Você sempre pode encontrar a URL para seu aplicativo de contêiner na página de visão geral do aplicativo no portal do Azure.