Entender as implantações de ponta a ponta
Pipelines são ferramentas flexíveis que podem ser configuradas de várias maneiras para atender às suas necessidades. Nesta unidade, você vai aprender a usar pipelines para implantar uma solução inteira, incluindo a configuração da infraestrutura do Azure, e como executar outras operações de implantação.
Quantos pipelines?
Em algumas organizações, a equipe que gerencia o ambiente do Azure é diferente da equipe que desenvolve o código que é executado no ambiente. Nessas situações, muitas vezes é tentador criar vários pipelines, cada um pertencente à equipe responsável por sua área específica. Por exemplo, você pode criar um pipeline para implantar o código bicep que implanta os recursos do Azure de seu site e outro pipeline que implanta o aplicativo do site.
Embora essa abordagem possa lhe dar alguma flexibilidade na forma como você gerencia os pipelines, pode ser desafiador manter tudo em sincronia. Por exemplo, suponha que sua equipe de site precise de uma nova configuração no aplicativo de Serviço de Aplicativo do Azure para habilitar um recurso que está sendo criado. O pipeline de implantação de aplicativos não pode ser executado antes de o pipeline de implantação de infraestrutura ter sido concluído com sucesso. Além disso, pode se tornar complicado enviar dados, como os nomes dos recursos do Azure criados por seu pipeline de infraestrutura, entre os pipelines.
Em vez disso, costuma ser melhor criar um único pipeline que implante tudo o que é necessário para a sua solução, mesmo que os componentes sejam gerenciados por pessoas ou equipes diferentes. Você pode usar ferramentas como Git e Azure DevOps para coordenar seu trabalho. Quando um recurso é adicionado, você pode usar uma ramificação para fazer as alterações necessárias ao arquivo Bicep. Quando a alteração estiver pronta para ser integrada e liberada, um só pipeline executará todas as etapas necessárias para criar e implantar a solução. Um único pipeline reduz a chance de as coisas ficarem fora de sincronia.
Dica
Quando estiver compilando código para a sua solução, você provavelmente vai precisar implantá-la com frequência para poder testar como ela funciona. Você pode descobrir que implantar sua infraestrutura com o código do aplicativo torna a execução de pipeline lenta e inibe seu progresso.
Se você estiver nesta posição, poderá considerar desabilitar a implantação de infraestrutura para seu ambiente de desenvolvimento. Você pode usar filtros de caminho, modelos de pipeline e condições para conseguir isso. No entanto, deve deixar a sequência de implantação completa intacta para seus outros ambientes.
O plano de controle e o plano de dados
Muitos recursos do Azure fornecem dois planos diferentes para o acesso. O plano de controle implanta e configura o recurso. O plano de dados permite que você acesse a funcionalidade do recurso.
Ao criar e implantar arquivos Bicep, você interage com o plano de controle. No Azure, o plano de controle é o Azure Resource Manager. Você usa o Resource Manager para definir a configuração de cada um dos seus recursos.
Mas seu pipeline geralmente precisa fazer mais do que apenas interagir com o plano de controle. Por exemplo, talvez seja necessário realizar outras tarefas:
- Carregar um blob a uma conta de armazenamento.
- Modificar um esquema de banco de dados.
- Fazer uma chamada à API para um serviço de terceiros.
- Disparar a atualização de um modelo de machine learning.
- Implantar um site em um aplicativo de Serviço de Aplicativo do Azure.
- Implantar o software em uma máquina virtual.
- Registre uma entrada do Servidor de Nomes de Domínio (DNS) junto a um provedor de terceiros.
Quando você considera um pipeline de ponta a ponta, normalmente precisa implantar os recursos do Azure e depois executar uma série de operações em relação aos planos de dados desses recursos. Às vezes, essas operações são chamadas de último quilômetro da implantação, porque você está executando a maior parte da implantação usando o plano de controle e apenas uma pequena quantidade de configuração permanece.
Observação
Alguns recursos não têm uma divisão clara entre o plano de controle e o plano de dados. Isso inclui o Azure Data Factory e o Gerenciamento de API do Azure. Os dois serviços dão suporte a implantações totalmente automatizadas usando Bicep, mas exigem considerações especiais. Você encontrará links para obter mais informações na página Resumo no final do módulo.
Como executar operações de plano de dados
Ao criar um pipeline de implantação que interage com o plano de dados dos seus recursos, você poderá usar qualquer uma destas três abordagens comuns:
- Scripts de implantação do Resource Manager.
- Scripts de pipeline.
- Tarefas de pipeline.
Scripts de implantação do Resource Manager são definidos no arquivo Bicep. Eles executam scripts do Bash ou PowerShell e podem interagir com os cmdlets da CLI do Azure ou do Azure PowerShell. Você cria uma identidade gerenciada para que o script de implantação possa ser autenticado no Azure, e o Azure provisiona e gerencia automaticamente os outros recursos necessários para executar o script de implantação.
Os scripts de implantação são bons quando você precisa executar um script básico dentro do processo de implantação. No entanto, eles não fornecem facilmente acesso a outros elementos do pipeline.
Você também pode executar sua própria lógica de dentro de um pipeline de implantação. O Azure Pipelines fornece um rico ecossistema de tarefas para coisas comuns que você precisa fazer. Se você não encontrar uma tarefa que atenda às suas necessidades, poderá usar um script para executar seu código Bash ou PowerShell. Tarefas e scripts de pipeline são executados do agente do pipeline. Geralmente, você precisa autenticar a tarefa ou o script no plano de dados do serviço que está usando, e a maneira como você faz a autenticação depende do serviço.
As tarefas e scripts do pipeline oferecem flexibilidade e controle. Os links também permitem que você acesse artefatos de pipeline, o que você vai aprender em breve. Neste módulo, vamos nos concentrar em scripts e tarefas de pipeline. Há link para mais informações sobre scripts de implantação do Resource Manager na página Resumo no final do módulo.
Saídas
Um pipeline normalmente cria e configura seus recursos do Azure implantando um arquivo Bicep. As partes subsequentes do pipeline interagem com o plano de dados desses recursos. Para conseguir interagir com os recursos, as tarefas e etapas do pipeline precisam de informações sobre o recurso do Azure que você criou.
Por exemplo, suponha que você tenha um arquivo Bicep que implanta uma conta de armazenamento. Você quer que seu pipeline implante a conta de armazenamento e depois carregue alguns blobs em um contêiner de blobs na conta de armazenamento. A tarefa de pipeline que carrega os blobs precisa saber o nome da conta de armazenamento à qual se conectar e o nome do contêiner de blobs para o qual carregar o arquivo.
É uma boa prática fazer com que o arquivo Bicep decida sobre os nomes dos seus recursos do Azure. Ele pode usar parâmetros, variáveis ou expressões para criar os nomes para a conta de armazenamento e o contêiner de blob. O arquivo Bicep pode expor uma saída que fornece o nome de cada recurso. Etapas posteriores no pipeline podem ler o valor da saída. Dessa forma, a definição do seu pipeline não precisa incluir no código nenhum nome ou outras informações que possam mudar conforme o ambiente. Além disso, a definição não precisa ser baseada em regras que estejam definidas no seu arquivo Bicep.
Com o Azure Pipelines, você pode propagar os valores de saídas usando variáveis de pipeline. Você pode definir o valor de uma variável de pipeline dentro de um script de pipeline. Você usa uma saída de log especialmente formatada que o Azure Pipelines entende como interpretar, conforme mostrado aqui:
stages:
- stage: Stage1
jobs:
- job: Job1
steps:
# Set the variable's value.
- script: |
echo "##vso[task.setvariable variable=myVariableName;isOutput=true]VariableValue"
name: Step1
# Read the variable's value.
- script:
echo $(myVariableName)
Quando você cria uma variável em um trabalho, mas quer acessá-la em outro trabalho na mesma fase, você precisa mapeá-la.
stages:
- stage: Stage2
jobs:
- job: Job2
steps:
# Set the variable's value.
- script: |
echo "##vso[task.setvariable variable=myVariableName;isOutput=true]VariableValue"
name: Step1
- job: Job3
dependsOn: Job2
variables: # Map the variable to this job.
myVariableName: $[ dependencies.Job2.outputs['Step1.myVariableName'] ]
steps:
# Read the variable's value.
- script: |
echo $(myVariableName)
Para acessar uma variável nas diferentes fases de um pipeline, você também precisa mapear a variável, mas deve usar uma sintaxe diferente:
stages:
- stage: Stage2
jobs:
- job: Job2
steps:
# Set the variable's value.
- script: |
echo "##vso[task.setvariable variable=myVariableName;isOutput=true]VariableValue"
name: Step1
- job: Job3
dependsOn: Job2
variables: # Map the variable to this job.
myVariableName: $[ dependencies.Job2.outputs['Step1.myVariableName'] ]
steps:
# Read the variable's value.
- script: |
echo $(myVariableName)
- stage: Stage3
dependsOn: Stage2
jobs:
- job: Job4
variables: # Map the variable to this stage.
myVariableName: $[ stageDependencies.Stage2.Job2.outputs['Step1.myVariableName'] ]
steps:
# Read the variable's value.
- script: |
echo $(myVariableName)
Usando as saídas do Bicep e as variáveis de pipeline, você pode criar um pipeline de várias etapas que implanta o código do Bicep e, em seguida, executa várias ações nos recursos como parte da sua implantação.