Partilhar via


Implantar aplicativos Web Python no Serviço de Aplicativo usando Ações do GitHub (Linux)

Este artigo descreve como usar a plataforma de integração contínua e entrega contínua (CI/CD) no GitHub Actions para implantar um aplicativo Web Python no Serviço de Aplicativo do Azure no Linux. Seu fluxo de trabalho de Ações do GitHub cria automaticamente o código e o implanta na instância do Serviço de Aplicativo sempre que há uma confirmação no repositório. Você pode adicionar outras automatizações em seu fluxo de trabalho de Ações do GitHub, como scripts de teste, verificações de segurança e implantação em vários estágios.

Criar repositório para código de aplicativo

Para concluir os procedimentos neste artigo, você precisa de um aplicativo Web Python comprometido com um repositório GitHub.

Observação

Se seu aplicativo usa Django e um banco de dados SQLite , ele não funcionará para esses procedimentos. O SQLite não é suportado na maioria dos ambientes hospedados na nuvem devido às suas limitações de armazenamento local baseado em arquivos. Considere mudar para um banco de dados compatível com a nuvem, como PostgreSQL ou Azure Cosmos DB. Para obter mais informações, consulte Reveja as considerações sobre o Django mais adiante neste artigo.

Criar instância de destino do App Service

A maneira mais rápida de criar uma instância do Serviço de Aplicativo é usar a interface de linha de comando (CLI) do Azure por meio do Azure Cloud Shell interativo. O Cloud Shell inclui o Git e a CLI do Azure. No procedimento a seguir, você usa o comando az webapp up para criar a instância do Serviço de Aplicativo e fazer a implantação inicial do seu aplicativo.

  1. Inicie sessão no Portal do Azure em https://portal.azure.com.

  2. Abra a CLI do Azure selecionando a opção Cloud Shell na barra de ferramentas do portal:

    Captura de tela que mostra como abrir o Azure Cloud Shell usando a ação de ícone na barra de ferramentas do portal do Azure.

  3. No Cloud Shell, selecione a opção Bash no menu suspenso:

    Captura de tela que mostra como selecionar a opção Bash no Cloud Shell.

  4. No Cloud Shell, clone seu repositório usando o comando git clone .

    Sugestão

    Para colar comandos ou texto no Cloud Shell, use o atalho de teclado Ctrl+Shift+V ou clique com o botão direito do mouse e selecione Colar no menu de contexto.

    • Para o aplicativo de exemplo Flask, você pode usar o seguinte comando. Substitua a <github-user> parte pelo nome da conta do GitHub onde você bifurcou o repositório:

      git clone https://github.com/<github-user>/python-sample-vscode-flask-tutorial.git
      
    • Se seu aplicativo estiver em um repositório diferente, configure as Ações do GitHub para o repositório específico. Substitua a <github-user> parte pelo nome da conta do GitHub onde você bifurcou o repositório e forneça o nome real do <repo-name> repositório no espaço reservado:

      git clone https://github.com/<github-user>/<repo-name>.git
      

    Observação

    O Cloud Shell é apoiado por uma conta de Armazenamento do Azure em um grupo de recursos chamado cloud-shell-storage-your-region<>. Essa conta de armazenamento contém uma imagem do sistema de arquivos Cloud Shell, que armazena o repositório clonado. Há um pequeno custo para este armazenamento. Você pode excluir a conta de armazenamento depois de concluir este artigo, juntamente com outros recursos criados.

  5. No Cloud Shell, altere o diretório para a pasta do repositório do seu aplicativo Python, para que o comando az webapp up reconheça o aplicativo como Python. Para o aplicativo de exemplo Flask, use o seguinte comando:

    cd python-sample-vscode-flask-tutorial
    
  6. No Cloud Shell, use o comando az webapp up para criar uma instância do Serviço de Aplicativo e fazer a implantação inicial do seu aplicativo:

    az webapp up --name <app-service-name> --runtime "PYTHON:3.9"
    
    • Para o <app-service-name> marcador de posição, especifique um nome de Serviço de Aplicações exclusivo no Azure. O nome deve ter de 3 a 60 caracteres e pode conter apenas letras, números e hífenes. O nome deve começar com uma letra e terminar com uma letra ou número.

    • Para obter uma lista de tempos de execução disponíveis em seu sistema, use o az webapp list-runtimes comando.

    • Ao inserir o valor de tempo de execução no comando, use o PYTHON:X.Y formato, onde X.Y é a versão principal e secundária do Python.

    • Você também pode especificar o local da região da instância do Serviço de Aplicativo usando o --location parâmetro. Para obter uma lista de locais disponíveis, use o az account list-locations --output table comando.

  7. Se seu aplicativo tiver um script de inicialização personalizado, use o comando az webapp config para iniciar o script.

    • Se a sua aplicação não tiver um script de arranque personalizado, avance para o passo seguinte.

    • Para o aplicativo de exemplo Flask, você precisa acessar o script de inicialização no arquivo startup.txt executando o seguinte comando:

      az webapp config set \
         --resource-group <resource-group-name> \
         --name <app-service-name> \
         --startup-file startup.txt
      

      Forneça o nome do grupo de recursos no espaço reservado <resource-group-name> e o nome da instância do Serviço de Aplicações no espaço reservado <app-service-name>. Para localizar o nome do grupo de recursos, verifique a saída do comando anterior az webapp up . O nome do grupo de recursos inclui o nome da conta do Azure seguido pelo sufixo _rg , como em <azure-account-name>_rg_.

  8. Para exibir o aplicativo em execução, abra um navegador e vá para o ponto de extremidade de implantação da sua instância do Serviço de Aplicativo. No URL a seguir, substitua o espaço reservado <app-service-name> pelo nome da sua instância de App Service:

    http://<app-service-name>.azurewebsites.net
    

    Se você vir uma página genérica, aguarde alguns segundos até que a instância do Serviço de Aplicativo seja iniciada e atualize a página.

    • Se continuar a ver uma página genérica, confirme que implementou a partir da pasta correta.
    • Para o aplicativo de exemplo Flask, confirme se você implantou a partir da pasta python-sample-vscode-flask-tutorial . Verifique também se você definiu o comando de inicialização corretamente.

Configurar a implantação contínua no Serviço de Aplicações

No próximo procedimento, você configura a entrega contínua (CD), o que significa que uma nova implantação de código ocorre sempre que um fluxo de trabalho é acionado. O gatilho no exemplo do artigo é qualquer alteração na ramificação principal do repositório, como com uma solicitação pull (PR).

  1. No Cloud Shell, confirme se você está no diretório raiz do seu sistema (~) e não em uma subpasta do aplicativo, como python-sample-vscode-flask-tutorial.

  2. Adicione as GitHub Actions utilizando o comando az webapp deployment github-actions add. Substitua todos os espaços reservados pelos seus valores específicos:

    az webapp deployment github-actions add \
      --repo "<github-user>/<github-repo>" \
      --resource-group <resource-group-name> \
      --branch <branch-name> \
      --name <app-service-name> \
      --login-with-github
    
    • O --login-with-github parâmetro usa um método interativo para recuperar um token de acesso pessoal. Siga as instruções e conclua a autenticação.

    • Se o sistema encontrar um arquivo de fluxo de trabalho existente com o mesmo nome de instância do Serviço de Aplicativo, siga as instruções para escolher se deseja substituir o fluxo de trabalho. Você pode usar o --force parâmetro com o comando para substituir automaticamente quaisquer fluxos de trabalho conflitantes.

    O add comando conclui as seguintes tarefas:

    • Cria um novo arquivo de fluxo de trabalho no caminho .github/workflows/<workflow-name>.yml no seu repositório. O nome do arquivo contém o nome da sua instância do Serviço de Aplicativo.
    • Busca um perfil de publicação com segredos para sua instância do Serviço de Aplicativo e o adiciona como um segredo de ação do GitHub. O nome do segredo começa com AZUREAPPSERVICE_PUBLISHPROFILE_. Esse segredo é referenciado no arquivo de fluxo de trabalho.
  3. Obtenha os detalhes de uma configuração de implantação de controle de origem com o comando az webapp deployment source show . Substitua os parâmetros de espaço reservado por seus valores específicos:

    az webapp deployment source show \
      --name <app-service-name> \
      --resource-group <resource-group-name>
    
  4. Na saída do comando, confirme os valores das propriedades repoUrl e branch. Esses valores devem corresponder aos valores especificados com o add comando.

Examine o fluxo de trabalho e as ações do GitHub

Uma definição de fluxo de trabalho é especificada em um arquivo YAML (.yml) no caminho /.github/workflows/ em seu repositório. Este arquivo YAML contém as várias etapas e parâmetros que compõem o fluxo de trabalho, um processo automatizado associado a um repositório GitHub. Você pode criar, testar, empacotar, liberar e implantar qualquer projeto no GitHub com um fluxo de trabalho.

Cada fluxo de trabalho é composto por um ou mais trabalhos, e cada trabalho é um conjunto de etapas. Cada etapa é um shell script ou uma ação. Cada trabalho tem uma seção Ação no arquivo de fluxo de trabalho.

Em termos do fluxo de trabalho configurado com seu código Python para implantação no Serviço de Aplicativo do Azure, o fluxo de trabalho tem as seguintes ações:

Ação Descrição
Checkout Confira o repositório em um runner, um agente do GitHub Actions.
setup-python Instale o Python no corredor.
appservice-build Crie o aplicativo Web.
webapps-deploy Implante o aplicativo Web usando uma credencial de perfil de publicação para autenticar no Azure. A credencial é armazenada em um segredo do GitHub.

O modelo de fluxo de trabalho usado para criar o fluxo de trabalho é Azure/actions-workflow-samples.

O fluxo de trabalho é acionado quando ocorrem eventos de push para a ramificação especificada. O evento e a ramificação são definidos no início do arquivo de fluxo de trabalho. Por exemplo, o trecho de código a seguir mostra que o fluxo de trabalho é acionado em eventos de push para a ramificação principal :

on:
  push:
    branches:
    - main

Aplicações autorizadas pelo OAuth

Ao configurar a implantação contínua, você autoriza o Serviço de Aplicativo do Azure como um Aplicativo OAuth autorizado para sua conta do GitHub. O Serviço de Aplicativo usa o acesso autorizado para criar um arquivo YAML de ação do GitHub no caminho .github/workflows/<workflow-name>.yml em seu repositório.

Para ver seus aplicativos autorizados e revogar permissões em suas contas do GitHub, vá para Configurações>Integrações/Aplicativos:

Captura de tela que mostra como exibir aplicativos OAuth autorizados para uma conta do GitHub.

Segredo do perfil de publicação do fluxo de trabalho

No arquivo de fluxo de trabalho .github/workflows/<workflow-name>.yml adicionado ao seu repositório, há um espaço reservado para credenciais de perfil de publicação necessárias para o trabalho de implantação do fluxo de trabalho. As informações do perfil de publicação são armazenadas criptografadas no repositório.

Para visualizar o segredo, vá para Configurações>Segurança>Segredo e variáveis>Ações:

Captura de tela que mostra como exibir segredos de ação para um repositório no GitHub.

Neste artigo, a ação do GitHub é autenticada com uma credencial de perfil de publicação. Há outras maneiras de autenticar, como com um principal de serviço ou OpenID Connect. Para obter mais informações, consulte Implantar no Serviço de Aplicativo usando ações do GitHub.

Executar e testar o fluxo de trabalho

A última etapa é testar o fluxo de trabalho fazendo uma alteração no repositório.

  1. Em um navegador, vá para a bifurcação do repositório de exemplo (ou do repositório usado) e selecione a ramificação definida como parte do gatilho:

    Captura de tela que mostra como ir para o repositório e a ramificação onde o fluxo de trabalho Ações do GitHub está definido.

  2. Faça uma pequena alteração no seu aplicativo Web Python.

    Para o tutorial do Flask, aqui está uma alteração simples:

    1. Vá para o arquivo /hello-app/templates/home.html da ramificação do gatilho.
    2. Selecione Editar (lápis).
    3. No Editor, localize a instrução print <p> e adicione o texto "Reimplantado!"
  3. Confirme a alteração diretamente na filial em que você está trabalhando.

    1. No Editor, selecione Confirmar alterações no canto superior direito. A janela Confirmar alterações é aberta.
    2. Na janela Confirmar alterações , modifique a mensagem de confirmação conforme desejado e selecione Confirmar alterações.

    O processo de confirmação aciona o fluxo de trabalho de Ações do GitHub.

Você também pode acionar o fluxo de trabalho manualmente:

  1. Vá para o separador Ações do repositório configurado para implantação contínua.

  2. Selecione o fluxo de trabalho na lista de fluxos de trabalho e, em seguida, selecione Executar fluxo de trabalho.

Resolver problemas em fluxos de trabalho falhados

Você pode verificar o status de um fluxo de trabalho na guia Ações para o repositório do aplicativo. Ao examinar o arquivo de fluxo de trabalho criado neste artigo, você verá dois trabalhos: compilar e implantar. Como lembrete, o fluxo de trabalho é baseado no modelo Azure/actions-workflow-samples .

Num caso de tarefa falhada, verifique a saída das tarefas para obter uma indicação da falha.

Aqui estão alguns problemas comuns a serem investigados:

  • Se o aplicativo falhar devido a uma dependência ausente, seu arquivo derequirements.txt não foi processado durante a implantação. Esse comportamento acontece se você criou o aplicativo Web diretamente no portal em vez de usar o comando, az webapp up como mostrado neste artigo.

  • Se você provisionou o serviço de aplicativo por meio do portal, a configuração de ação de compilação SCM_DO_BUILD_DURING_DEPLOYMENT pode não estar definida. Essa configuração deve ser definida como true. O az webapp up comando define a ação de compilação automaticamente.

  • Se você vir uma mensagem de erro sobre "Tempo limite de handshake TLS", execute o fluxo de trabalho manualmente selecionando Acionar implantação automática na guia Ações do repositório do aplicativo. Você pode determinar se o tempo limite é um problema temporário.

  • Se você configurar a implantação contínua para o aplicativo de contêiner, conforme mostrado neste artigo, o arquivo de fluxo de trabalho inicial .github/workflows/<workflow-name>.yml será criado automaticamente para você. Se você modificou o arquivo, remova as modificações para ver se elas estão causando a falha.

Executar script pós-implantação

Um script pós-implantação pode concluir várias tarefas, como definir variáveis de ambiente esperadas pelo código do aplicativo. Você adiciona o script como parte do código do aplicativo e executa o script usando o comando de inicialização.

Para evitar a codificação de valores de variáveis no arquivo YAML do fluxo de trabalho, considere configurar as variáveis no GitHub e fazer referência aos nomes das variáveis no script. Você pode criar segredos criptografados para um repositório ou para um ambiente (repositório de conta). Para obter mais informações, consulte Usando segredos em ações do GitHub.

Rever considerações sobre Django

Conforme observado anteriormente neste artigo, você pode usar as Ações do GitHub para implantar aplicativos Django no Serviço de Aplicativo do Azure no Linux, se usar um banco de dados separado. Não é possível usar um banco de dados SQLite porque o Serviço de Aplicativo bloqueia o arquivo db.sqlite3 , o que impede leituras e gravações. Esse comportamento não afeta um banco de dados externo.

O artigo Configurar aplicativo Python no Serviço de Aplicativo - Processo de inicialização de contêiner descreve como o Serviço de Aplicativo procura automaticamente um arquivo de wsgi.py no código do aplicativo, que normalmente contém o objeto do aplicativo. Quando você usou o webapp config set comando para definir o comando de inicialização, usou o --startup-file parâmetro para especificar o arquivo que contém o objeto do aplicativo. O webapp config set comando não está disponível na ação webapps-deploy. Em vez disso, você pode usar o startup-command parâmetro para especificar o comando de inicialização. Por exemplo, o código a seguir mostra como especificar o comando de inicialização no arquivo de fluxo de trabalho:

startup-command: startup.txt

Quando você usa o Django, normalmente deseja migrar os modelos de dados usando o python manage.py migrate comando depois de implantar o código do aplicativo. Você pode executar o comando migrate em um script pós-implantação.

Desconectar ações do GitHub

Desconectar as Ações do GitHub da instância do Serviço de Aplicativo permite reconfigurar a implantação do aplicativo. Você pode escolher o que acontece com seu arquivo de fluxo de trabalho depois de desconectar e se deseja salvar ou excluir o arquivo.

Desconecte as Ações do GitHub com o seguinte comando Azure CLI az webapp deployment github-actions remove . Substitua todos os espaços reservados pelos seus valores específicos:

az webapp deployment github-actions remove \
  --repo "<github-username>/<github-repo>" \
  --resource-group <resource-group-name> \
  --branch <branch-name> \
  --name <app-service-name> \
  --login-with-github

Limpeza de recursos

Para evitar incorrer em encargos sobre os recursos do Azure criados neste artigo, exclua o grupo de recursos que contém a instância do Serviço de Aplicativo e o Plano do Serviço de Aplicativo.

Em qualquer lugar onde a CLI do Azure esteja instalada, incluindo o Azure Cloud Shell, você pode usar o comando az group delete para excluir um grupo de recursos:

az group delete --name <resource-group-name>

Excluir conta de armazenamento

Para excluir a conta de armazenamento que mantém o sistema de arquivos do Cloud Shell, que incorre em uma pequena cobrança mensal, exclua o grupo de recursos que começa com cloud-shell-storage-. Se você for o único usuário do grupo, é seguro excluir o grupo de recursos. Se houver outros usuários, você poderá excluir uma conta de armazenamento no grupo de recursos.

Atualizar conta e repositório do GitHub

Se você excluir o grupo de recursos do Azure, considere fazer as seguintes modificações na conta do GitHub e no repositório que foi conectado para implantação contínua:

  • No repositório do aplicativo, remova o arquivo .github/workflows/<workflow-name>.yml arquivo.
  • Nas configurações do repositório do aplicativo, remova a chave secreta AZUREAPPSERVICE_PUBLISHPROFILE_ criada para o fluxo de trabalho.
  • Nas configurações da conta do GitHub, remova o Serviço de Aplicativo do Azure como um Aplicativo Oauth autorizado para sua conta do GitHub.