Esta é uma aplicação baseada em Node.js utilizada para exercitar conceitos de Continuous Delivery (CD)
* Based on the work of Dan Arias: https://auth0.com/blog/create-a-simple-and-stylish-node-express-app
Você já deve ter uma subscrição criada na sua conta Azure, uma vez que ela foi gerada a partir da sua conta de estudante. Caso não haja nenhuma, utilize este tutorial.
Precisamos criar um Azure App Service para o alvo dos nossos deployments.
- Na tela inicial selecione
App Service
e em seguidaCreate
- Na tela de criação do Web App, preencha as seguintes informações:
- Resource Group:
Create new
: continuous-deployment-<seu_usuario> - Name: aula-cd-<seu_usuario>
- Runtime stack: Nodes 14 LTS
- Resource Group:
- Clique
Review + create
- Clique
Create
🎉 Pronto, já temos recursos em nuvem para receber nossa aplicação!
Agora precisamos criar um workflow para entregar o nosso app na nuvem.
Vamos usar o wizard da Azure para nos ajudar na criação do workflow.
- No App Service que você acabou de criar, vá na opção
Deployment Center
- Em Source, selecione
GitHub
- Autorize o acesso a sua conta pessoal
- Organization: seu usuário
- Repository: sample-deployment
- Branch: main
- Runtime stack: Node
- Version: Node 14 LTS
- Clique
Save
🚨 Nosso app está chegando na nuvem, como queríamos, mas direto no ambiente de produção. Como fazemos para que ele escale pelos ambientes de Testes/QA e Homologação antes de chegar em produção?
Você pode utilizar Deployment Slots
para isolar ambientes de deployment, realizar testes A/B ou organizar a sua entrega de aplicações com estratégias Blue/Green (veremos em mais detalhes na próxima aula)
- Selecione a opção
Deployment slots
- Você verá que já existe um slot com o label
Production
. Vamos criar novos slots. Selecione a opçãoAdd Slot
- Nome: qa
- Clone settings from: aula-cd-<seu_usuario>
- Clique
Add
- Siga o mesmo procedimento e crie um novo slot chamado
hom
- No seu repositório no GitHub selecione
Settings
>Environments
- Clique em
New environment
para criar um novo ambiente de deployment - Dê o nome de
QA
e clique emConfigure environment
- Na seção Environment secrets, clique em
Add Secret
- Name: AZURE_WEBAPP_PUBLISH_PROFILE
- Agora volte para a sua conta da Azure, vá em Deployment slots e selecione o slot de QA (terminado em
QA
) - Clique em
Get publish profile
e baixe o arquivo. - Abra o arquivo no VSCode e cole o seu conteúdo no campo
Value
do secret que criamos no GitHub
Repita o processo processo para criar um novo ambiente chamado HOM
. Não há problema em os secrets terem o mesmo nome. ❓ Por que?
O nosso workflow agora precisa refletir a capacidade de fazer a promoção do nosso build entre ambientes. Para isso precisamos adicionar dois passos após o build e antes do deploy em produção.
- Renomeie o seu job de
deploy
paradeploy-to-production
- Copie todo o conteúdo do job
deploy-to-production
e cole acima dele mesmo renomeando o job paradeploy-to-hom
- Substitua o valor da variável
environment.name
porHOM
- Substitua o valor de
slot-name
porhom
- Substitua o valor de
publish-profile
por${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
Repita o processo para criar um job deploy-to-qa
antes de deploy-to-hom
O seu workflow final deve ficar parecido com o abaixo (❗ lembre-se de atualizar o valor do nome do app para o que você criou e o nome dos secrets):
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
name: Build and deploy Node.js app to Azure Web App - aula-cd-pedrolacerda
on:
push:
branches:
- main
workflow_dispatch:
env:
app-name: aula-cd-pedrolacerda
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Node.js version
uses: actions/setup-node@v1
with:
node-version: '14.x'
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
npm run test --if-present
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v2
with:
name: node-app
path: .
deploy-to-qa:
runs-on: ubuntu-latest
needs: build
environment:
name: 'QA'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v2
with:
name: node-app
- name: 'Deploy to Azure Web App'
id: deploy-to-webapp
uses: azure/webapps-deploy@v2
with:
app-name: ${{ env.app-name }}
slot-name: 'qa'
publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
package: .
deploy-to-hom:
runs-on: ubuntu-latest
needs: deploy-to-qa
environment:
name: 'HOM'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v2
with:
name: node-app
- name: 'Deploy to Azure Web App'
id: deploy-to-webapp
uses: azure/webapps-deploy@v2
with:
app-name: ${{ env.app-name }}
slot-name: 'hom'
publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
package: .
deploy-to-production:
runs-on: ubuntu-latest
needs: deploy-to-hom
environment:
name: 'production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v2
with:
name: node-app
- name: 'Deploy to Azure Web App'
id: deploy-to-webapp
uses: azure/webapps-deploy@v2
with:
app-name: ${{ env.app-name }}
slot-name: 'production'
publish-profile: ${{ secrets.AzureAppService_PublishProfile_abc7038203244546b20cf50d0ab5bd7e }}
package: .
🎉 Perfeito! Nosso app agora passa pelos ambientes de QA e de Homologação antes de chegar em Produção
❓ Mas e se durante a fase de QA a equipe encontrar algum problema na aplicação e não quiser promovê-la para Homologação?
Agora vamos configurar os nossos ambientes para que sejam necessárias revisões e aprovações antes de ser realizado o deploy.
- No seu repositório vá em
Settings
>Environments
- Selecione o ambiente
HOM
- Marque o checkbox
Required reviewers
- Adicione o seu próprio usuário no campo de texto e clique em
Save protectioin rules
Repita o procedimento para o ambiente production
mas não para o ambiente QA
.
O nosso workflow está pronto para ser implementado em um ambiente de trabalho real! 😉