CI/CD Moderno para Umbraco com Azure DevOps e IIS On-Premises
25 de novembro de 2025

Há alguns anos, partilhei um guia passo-a-passo sobre como fazer deploy de sites Umbraco para servidores on-premises usando os clássicos Release Pipelines do Azure DevOps. Muito mudou desde então. Hoje, o Umbraco corre em .NET moderno, a maioria dos projetos usa Vite ou Tailwind para tooling frontend, e o Azure DevOps incentiva fortemente pipelines em YAML em vez dos antigos releases configurados por interface.
Este guia atualizado reflete como construímos e entregamos websites Umbraco em 2025 — usando automação total, deployments sensíveis ao ambiente e um único pipeline YAML que faz deploy para UAT e Produção em servidores IIS dentro do teu próprio datacenter.
Se está a modernizar um processo antigo ou a começar do zero, este artigo dá-lhe uma base sólida. Mas lembre-se: isto é um boilerplate. Cada organização tem as suas necessidades — load balancing, replicação, estratégias de media partilhados, gestão de segredos, reforço de segurança e governance de deploy. Quase sempre será necessário adaptar este fluxo para corresponder à sua infraestrutura específica.
Muitas equipas continuam a alojar Umbraco na sua própria infraestrutura — às vezes por motivos de compliance, outras vezes pela integração com sistemas locais, e outras porque a migração para a cloud simplesmente não é prática. Os developers, no entanto, esperam automação ao estilo cloud independentemente de onde os servidores estão.
Pipelines de CI/CD oferecem:
Deployments previsíveis
Rollouts seguros
Eliminação de cópia manual de ficheiros
Configuração consistente do servidor
Automação amiga do developer
Repositório Git da sua solução Umbraco
Pipeline YAML multi-stage
Azure DevOps Environments (UAT & PROD)
Servidores On-Premises
Windows Server com IIS
Agentes self-hosted Azure DevOps
Pastas wwwroot dedicadas para UAT & PROD
Fluxo de Deployment
O developer faz push para dev ou release/uat
O pipeline compila a app (.NET + npm)
O output é deployed para UAT
O mesmo artefacto é promovido para Produção
1. Criar Agent Pool
𝙾𝚛𝚐𝚊𝚗𝚒𝚣𝚊𝚝𝚒𝚘𝚗 𝚂𝚎𝚝𝚝𝚒𝚗𝚐𝚜 → 𝙰𝚐𝚎𝚗𝚝 𝙿𝚘𝚘𝚕𝚜 → 𝙽𝚎𝚠 → 𝚂𝚎𝚕𝚏-𝚑𝚘𝚜𝚝𝚎𝚍
2. Fazer Download do Agente
𝙽𝚎𝚠 𝙰𝚐𝚎𝚗𝚝 → 𝚆𝚒𝚗𝚍𝚘𝚠𝚜 → 𝙳𝚘𝚠𝚗𝚕𝚘𝚊𝚍 𝚉𝙸𝙿
3. Configurar o Agente
𝚖𝚔𝚍𝚒𝚛 𝙲:\𝚊𝚣𝚍𝚘-𝚊𝚐𝚎𝚗𝚝
𝚌𝚍 𝙲:\𝚊𝚣𝚍𝚘-𝚊𝚐𝚎𝚗𝚝
Extrair o ZIP e correr:
.\𝚌𝚘𝚗𝚏𝚒𝚐.𝚌𝚖𝚍
Depois:
URL do servidor: https://dev.azure.com/YOURORG/
PAT: deve ter permissões Agent Pools (read, manage)
Pool: OnPrem-IIS
Nome: UAT-IIS ou PROD-IIS
Correr como serviço: Sim
Iniciar o agente:
.\𝚛𝚞𝚗.𝚌𝚖𝚍
Pipelines → Environments
Criar UAT-IIS e registar o servidor UAT
Criar PROD-IIS e registar o servidor PROD
Pipeline totalmente funcional — pode copiar e colar tal como está.
𝚝𝚛𝚒𝚐𝚐𝚎𝚛:
- 𝚍𝚎𝚟
- 𝚛𝚎𝚕𝚎𝚊𝚜𝚎/𝚞𝚊𝚝
𝚟𝚊𝚛𝚒𝚊𝚋𝚕𝚎𝚜:
𝚋𝚞𝚒𝚕𝚍𝙲𝚘𝚗𝚏𝚒𝚐𝚞𝚛𝚊𝚝𝚒𝚘𝚗: '𝚁𝚎𝚕𝚎𝚊𝚜𝚎'
𝚙𝚛𝚘𝚓𝚎𝚌𝚝𝙵𝚘𝚕𝚍𝚎𝚛: '𝚠𝚠𝚠'
𝚙𝚞𝚋𝚕𝚒𝚜𝚑𝙵𝚘𝚕𝚍𝚎𝚛: '$(𝙱𝚞𝚒𝚕𝚍.𝙰𝚛𝚝𝚒𝚏𝚊𝚌𝚝𝚂𝚝𝚊𝚐𝚒𝚗𝚐𝙳𝚒𝚛𝚎𝚌𝚝𝚘𝚛𝚢)/𝚙𝚞𝚋𝚕𝚒𝚜𝚑'
𝚗𝚘𝚍𝚎𝚅𝚎𝚛𝚜𝚒𝚘𝚗: '𝟸𝟶.𝚡'
𝚘𝚏𝚏𝚕𝚒𝚗𝚎𝚃𝚎𝚖𝚙𝚕𝚊𝚝𝚎: '𝙰𝚙𝚙_𝙾𝚏𝚏𝚕𝚒𝚗𝚎.𝚑𝚝𝚖.𝚛𝚎𝚗𝚊𝚖𝚎'
𝚘𝚏𝚏𝚕𝚒𝚗𝚎𝙵𝚒𝚕𝚎: '𝙰𝚙𝚙_𝙾𝚏𝚏𝚕𝚒𝚗𝚎.𝚑𝚝𝚖'
𝚜𝚝𝚊𝚐𝚎𝚜:
- 𝚜𝚝𝚊𝚐𝚎: 𝙱𝚞𝚒𝚕𝚍
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙱𝚞𝚒𝚕𝚍 & 𝙿𝚞𝚋𝚕𝚒𝚜𝚑 𝚄𝚖𝚋𝚛𝚊𝚌𝚘'
𝚓𝚘𝚋𝚜:
- 𝚓𝚘𝚋: 𝙱𝚞𝚒𝚕𝚍𝙹𝚘𝚋
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙱𝚞𝚒𝚕𝚍 .𝙽𝙴𝚃 + 𝚃𝚊𝚒𝚕𝚠𝚒𝚗𝚍 + 𝚅𝚒𝚝𝚎'
𝚙𝚘𝚘𝚕:
𝚟𝚖𝙸𝚖𝚊𝚐𝚎: '𝚠𝚒𝚗𝚍𝚘𝚠𝚜-𝚕𝚊𝚝𝚎𝚜𝚝'
𝚜𝚝𝚎𝚙𝚜:
- 𝚌𝚑𝚎𝚌𝚔𝚘𝚞𝚝: 𝚜𝚎𝚕𝚏
- 𝚝𝚊𝚜𝚔: 𝙽𝚘𝚍𝚎𝚃𝚘𝚘𝚕@𝟶
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙸𝚗𝚜𝚝𝚊𝚕𝚕 𝙽𝚘𝚍𝚎.𝚓𝚜'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚟𝚎𝚛𝚜𝚒𝚘𝚗𝚂𝚙𝚎𝚌: '$(𝚗𝚘𝚍𝚎𝚅𝚎𝚛𝚜𝚒𝚘𝚗)'
- 𝚝𝚊𝚜𝚔: 𝙲𝚊𝚌𝚑𝚎@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙲𝚊𝚌𝚑𝚎 𝚗𝚙𝚖 (𝚏𝚛𝚘𝚗𝚝𝚎𝚗𝚍)'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚔𝚎𝚢: '𝚗𝚙𝚖-𝚏𝚛𝚘𝚗𝚝𝚎𝚗𝚍 | "$(𝙱𝚞𝚒𝚕𝚍. 𝚂𝚘𝚞𝚛𝚌𝚎𝚜𝙳𝚒𝚛𝚎𝚌𝚝𝚘𝚛𝚢)/$(𝚙𝚛𝚘𝚓𝚎𝚌𝚝𝙵𝚘𝚕𝚍𝚎𝚛)/𝚙𝚊𝚌𝚔𝚊𝚐𝚎-𝚕𝚘𝚌𝚔.𝚓𝚜𝚘𝚗"'
𝚙𝚊𝚝𝚑: '$(𝙱𝚞𝚒𝚕𝚍.𝚂𝚘𝚞𝚛𝚌𝚎𝚜𝙳𝚒𝚛𝚎𝚌𝚝𝚘𝚛𝚢)/$(𝚙𝚛𝚘𝚓𝚎𝚌𝚝𝙵𝚘𝚕𝚍𝚎𝚛)/𝚗𝚘𝚍𝚎_𝚖𝚘𝚍𝚞𝚕𝚎𝚜'
- 𝚝𝚊𝚜𝚔: 𝙲𝚊𝚌𝚑𝚎@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙲𝚊𝚌𝚑𝚎 𝚗𝚙𝚖 (𝚋𝚊𝚌𝚔𝚘𝚏𝚏𝚒𝚌𝚎)'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚔𝚎𝚢: '𝚗𝚙𝚖-𝚋𝚊𝚌𝚔𝚎𝚗𝚍 | "$(𝙱𝚞𝚒𝚕𝚍.𝚂𝚘𝚞𝚛𝚌𝚎𝚜𝙳𝚒𝚛𝚎𝚌𝚝𝚘𝚛𝚢)/𝚍𝚋𝚕.𝙼𝚊𝚍𝚎𝚒𝚛𝚊𝚜𝙻𝚎𝚒𝚛𝚒𝚊.𝚋𝚊𝚌𝚔𝚘𝚏𝚏𝚒𝚌𝚎/𝚙𝚊𝚌𝚔𝚊𝚐𝚎-𝚕𝚘𝚌𝚔.𝚓𝚜𝚘𝚗"'
𝚙𝚊𝚝𝚑: '$(𝙱𝚞𝚒𝚕𝚍.𝚂𝚘𝚞𝚛𝚌𝚎𝚜𝙳𝚒𝚛𝚎𝚌𝚝𝚘𝚛𝚢)/𝚍𝚋𝚕.𝙼𝚊𝚍𝚎𝚒𝚛𝚊𝚜𝙻𝚎𝚒𝚛𝚒𝚊.𝚋𝚊𝚌𝚔𝚘𝚏𝚏𝚒𝚌𝚎/𝚗𝚘𝚍𝚎_𝚖𝚘𝚍𝚞𝚕𝚎𝚜'
- 𝚝𝚊𝚜𝚔: 𝙽𝚙𝚖@𝟷
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝚗𝚙𝚖 𝚒𝚗𝚜𝚝𝚊𝚕𝚕 (𝚋𝚊𝚌𝚔𝚘𝚏𝚏𝚒𝚌𝚎)'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚌𝚘𝚖𝚖𝚊𝚗𝚍: '𝚒𝚗𝚜𝚝𝚊𝚕𝚕'
𝚠𝚘𝚛𝚔𝚒𝚗𝚐𝙳𝚒𝚛: '𝚍𝚋𝚕.𝙼𝚊𝚍𝚎𝚒𝚛𝚊𝚜𝙻𝚎𝚒𝚛𝚒𝚊.𝚋𝚊𝚌𝚔𝚘𝚏𝚏𝚒𝚌𝚎'
- 𝚝𝚊𝚜𝚔: 𝚄𝚜𝚎𝙳𝚘𝚝𝙽𝚎𝚝@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙸𝚗𝚜𝚝𝚊𝚕𝚕 .𝙽𝙴𝚃 𝟿 𝚂𝙳𝙺'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚙𝚊𝚌𝚔𝚊𝚐𝚎𝚃𝚢𝚙𝚎: '𝚜𝚍𝚔'
𝚟𝚎𝚛𝚜𝚒𝚘𝚗: '𝟿.𝟶.𝚡'
- 𝚝𝚊𝚜𝚔: 𝙳𝚘𝚝𝙽𝚎𝚝𝙲𝚘𝚛𝚎𝙲𝙻𝙸@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝚁𝚎𝚜𝚝𝚘𝚛𝚎 𝙽𝚞𝙶𝚎𝚝'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚌𝚘𝚖𝚖𝚊𝚗𝚍: '𝚛𝚎𝚜𝚝𝚘𝚛𝚎'
𝚙𝚛𝚘𝚓𝚎𝚌𝚝𝚜: '$(𝚙𝚛𝚘𝚓𝚎𝚌𝚝𝙵𝚘𝚕𝚍𝚎𝚛)/𝚠𝚠𝚠.𝚌𝚜𝚙𝚛𝚘𝚓'
- 𝚝𝚊𝚜𝚔: 𝙳𝚘𝚝𝙽𝚎𝚝𝙲𝚘𝚛𝚎𝙲𝙻𝙸@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙿𝚞𝚋𝚕𝚒𝚜𝚑'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚌𝚘𝚖𝚖𝚊𝚗𝚍: '𝚙𝚞𝚋𝚕𝚒𝚜𝚑'
𝚙𝚛𝚘𝚓𝚎𝚌𝚝𝚜: '$(𝚙𝚛𝚘𝚓𝚎𝚌𝚝𝙵𝚘𝚕𝚍𝚎𝚛)/𝚠𝚠𝚠.𝚌𝚜𝚙𝚛𝚘𝚓'
𝚊𝚛𝚐𝚞𝚖𝚎𝚗𝚝𝚜: '--𝚌𝚘𝚗𝚏𝚒𝚐𝚞𝚛𝚊𝚝𝚒𝚘𝚗 $(𝚋𝚞𝚒𝚕𝚍𝙲𝚘𝚗𝚏𝚒𝚐𝚞𝚛𝚊𝚝𝚒𝚘𝚗) --𝚘𝚞𝚝𝚙𝚞𝚝 $(𝚙𝚞𝚋𝚕𝚒𝚜𝚑𝙵𝚘𝚕𝚍𝚎𝚛)'
𝚣𝚒𝚙𝙰𝚏𝚝𝚎𝚛𝙿𝚞𝚋𝚕𝚒𝚜𝚑: 𝚏𝚊𝚕𝚜𝚎
- 𝚙𝚞𝚋𝚕𝚒𝚜𝚑: $(𝚙𝚞𝚋𝚕𝚒𝚜𝚑𝙵𝚘𝚕𝚍𝚎𝚛)
𝚊𝚛𝚝𝚒𝚏𝚊𝚌𝚝: 𝚍𝚛𝚘𝚙
- 𝚜𝚝𝚊𝚐𝚎: 𝙳𝚎𝚙𝚕𝚘𝚢_𝚄𝙰𝚃
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙳𝚎𝚙𝚕𝚘𝚢 𝚝𝚘 𝚄𝙰𝚃'
𝚍𝚎𝚙𝚎𝚗𝚍𝚜𝙾𝚗: 𝙱𝚞𝚒𝚕𝚍
𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗: 𝚜𝚞𝚌𝚌𝚎𝚎𝚍𝚎𝚍()
𝚓𝚘𝚋𝚜:
- 𝚍𝚎𝚙𝚕𝚘𝚢𝚖𝚎𝚗𝚝: 𝚄𝙰𝚃𝙳𝚎𝚙𝚕𝚘𝚢
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙳𝚎𝚙𝚕𝚘𝚢 𝚝𝚘 𝚄𝙰𝚃`
𝚎𝚗𝚟𝚒𝚛𝚘𝚗𝚖𝚎𝚗𝚝:
𝚗𝚊𝚖𝚎: '𝚄𝙰𝚃-𝙳𝙱𝙻𝟶𝟷'
𝚛𝚎𝚜𝚘𝚞𝚛𝚌𝚎𝚃𝚢𝚙𝚎: 𝚅𝚒𝚛𝚝𝚞𝚊𝚕𝙼𝚊𝚌𝚑𝚒𝚗𝚎
𝚜𝚝𝚛𝚊𝚝𝚎𝚐𝚢:
𝚛𝚞𝚗𝙾𝚗𝚌𝚎:
𝚍𝚎𝚙𝚕𝚘𝚢:
𝚜𝚝𝚎𝚙𝚜:
- 𝚌𝚑𝚎𝚌𝚔𝚘𝚞𝚝: 𝚗𝚘𝚗𝚎
- 𝚍𝚘𝚠𝚗𝚕𝚘𝚊𝚍: 𝚌𝚞𝚛𝚛𝚎𝚗𝚝
𝚊𝚛𝚝𝚒𝚏𝚊𝚌𝚝: 𝚍𝚛𝚘𝚙
- 𝚝𝚊𝚜𝚔: 𝙿𝚘𝚠𝚎𝚛𝚂𝚑𝚎𝚕𝚕@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙰𝚌𝚝𝚒𝚟𝚊𝚝𝚎 𝙰𝚙𝚙_𝙾𝚏𝚏𝚕𝚒𝚗𝚎'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚝𝚊𝚛𝚐𝚎𝚝𝚃𝚢𝚙𝚎: '𝚒𝚗𝚕𝚒𝚗𝚎'
𝚜𝚌𝚛𝚒𝚙𝚝: |
$𝚛𝚘𝚘𝚝="𝙳:\𝚆𝙴𝙱\𝙼𝚊𝚍𝚎𝚒𝚛𝚒𝚊𝚜𝙻𝚎𝚒𝚛𝚒𝚊\𝚞𝚊𝚝.𝚖𝚊𝚍𝚎𝚒𝚛𝚊𝚜𝚕𝚎𝚒𝚛𝚒𝚊.𝚙𝚝\𝚠𝚠𝚠𝚛𝚘𝚘𝚝"
$𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎=𝙹𝚘𝚒𝚗-𝙿𝚊𝚝𝚑 $𝚛𝚘𝚘𝚝 "$(𝚘𝚏𝚏𝚕𝚒𝚗𝚎𝚃𝚎𝚖𝚙𝚕𝚊𝚝𝚎)"
$𝚘𝚏𝚏𝚕𝚒𝚗𝚎=𝙹𝚘𝚒𝚗-𝙿𝚊𝚝𝚑 $𝚛𝚘𝚘𝚝 "$(𝚘𝚏𝚏𝚕𝚒𝚗𝚎𝙵𝚒𝚕𝚎)"
𝚒𝚏(𝚃𝚎𝚜𝚝-𝙿𝚊𝚝𝚑 $𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎){
𝚒𝚏(𝚃𝚎𝚜𝚝-𝙿𝚊𝚝𝚑 $𝚘𝚏𝚏𝚕𝚒𝚗𝚎){ 𝚁𝚎𝚖𝚘𝚟𝚎-𝙸𝚝𝚎𝚖 $𝚘𝚏𝚏𝚕𝚒𝚗𝚎 -𝙵𝚘𝚛𝚌𝚎 }
𝚁𝚎𝚗𝚊𝚖𝚎-𝙸𝚝𝚎𝚖 $𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎 $𝚘𝚏𝚏𝚕𝚒𝚗𝚎 -𝙵𝚘𝚛𝚌𝚎
}
- 𝚝𝚊𝚜𝚔: 𝙿𝚘𝚠𝚎𝚛𝚂𝚑𝚎𝚕𝚕@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙲𝚕𝚎𝚊𝚗 𝚄𝙰𝚃 (𝚙𝚛𝚎𝚜𝚎𝚛𝚟𝚎 𝚖𝚎𝚍𝚒𝚊 + 𝚕𝚘𝚐𝚜)'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚝𝚊𝚛𝚐𝚎𝚝𝚃𝚢𝚙𝚎: '𝚒𝚗𝚕𝚒𝚗𝚎'
𝚜𝚌𝚛𝚒𝚙𝚝: |
$𝚙𝚊𝚝𝚑="𝙳:\𝚆𝙴𝙱\𝙼𝚊𝚍𝚎𝚒𝚛𝚒𝚊𝚜𝙻𝚎𝚒𝚛𝚒𝚊\𝚞𝚊𝚝.𝚖𝚊𝚍𝚎𝚒𝚛𝚊𝚜𝚕𝚎𝚒𝚛𝚒𝚊.𝚙𝚝\𝚠𝚠𝚠𝚛𝚘𝚘𝚝"
$𝚙𝚛𝚎𝚜𝚎𝚛𝚟𝚎=@("𝚠𝚠𝚠𝚛𝚘𝚘𝚝\𝚖𝚎𝚍𝚒𝚊","𝚞𝚖𝚋𝚛𝚊𝚌𝚘\𝙻𝚘𝚐𝚜","𝙰𝚙𝚙_𝙾𝚏𝚏𝚕𝚒𝚗𝚎.𝚑𝚝𝚖")
$𝚝𝚎𝚖𝚙=𝙹𝚘𝚒𝚗-𝙿𝚊𝚝𝚑 $𝚎𝚗𝚟:𝚃𝙴𝙼𝙿 "𝚋𝚊𝚌𝚔𝚞𝚙_$(𝙶𝚎𝚝-𝙳𝚊𝚝𝚎 -𝙵𝚘𝚛𝚖𝚊𝚝 𝚢𝚢𝚢𝚢𝙼𝙼𝚍𝚍𝙷𝙷𝚖𝚖𝚜𝚜)"
𝙽𝚎𝚠-𝙸𝚝𝚎𝚖 $𝚝𝚎𝚖𝚙 -𝙸𝚝𝚎𝚖𝚃𝚢𝚙𝚎 𝙳𝚒𝚛𝚎𝚌𝚝𝚘𝚛𝚢 | 𝙾𝚞𝚝-𝙽𝚞𝚕𝚕
𝚏𝚘𝚛𝚎𝚊𝚌𝚑($𝚒𝚝𝚎𝚖 𝚒𝚗 $𝚙𝚛𝚎𝚜𝚎𝚛𝚟𝚎){
$𝚜𝚛𝚌=𝙹𝚘𝚒𝚗-𝙿𝚊𝚝𝚑 $𝚙𝚊𝚝𝚑 $𝚒𝚝𝚎𝚖
𝚒𝚏(𝚃𝚎𝚜𝚝-𝙿𝚊𝚝𝚑 $𝚜𝚛𝚌){
$𝚍𝚎𝚜𝚝=𝙹𝚘𝚒𝚗-𝙿𝚊𝚝𝚑 $𝚝𝚎𝚖𝚙 $𝚒𝚝𝚎𝚖
𝙽𝚎𝚠-𝙸𝚝𝚎𝚖 (𝚂𝚙𝚕𝚒𝚝-𝙿𝚊𝚝𝚑 $𝚍𝚎𝚜𝚝) -𝙸𝚝𝚎𝚖𝚃𝚢𝚙𝚎 𝙳𝚒𝚛𝚎𝚌𝚝𝚘𝚛𝚢 -𝙵𝚘𝚛𝚌𝚎 | 𝙾𝚞𝚝-𝙽𝚞𝚕𝚕
𝚛𝚘𝚋𝚘𝚌𝚘𝚙𝚢 $𝚜𝚛𝚌 $𝚍𝚎𝚜𝚝 /𝙴 | 𝙾𝚞𝚝-𝙽𝚞𝚕𝚕
}
}
𝙶𝚎𝚝-𝙲𝚑𝚒𝚕𝚍𝙸𝚝𝚎𝚖 $𝚙𝚊𝚝𝚑 | 𝙵𝚘𝚛𝙴𝚊𝚌𝚑-𝙾𝚋𝚓𝚎𝚌𝚝 {
𝚒𝚏($_.𝙽𝚊𝚖𝚎 -𝚗𝚎 "𝙰𝚙𝚙_𝙾𝚏𝚏𝚕𝚒𝚗𝚎.𝚑𝚝𝚖"){
𝚁𝚎𝚖𝚘𝚟𝚎-𝙸𝚝𝚎𝚖 $_.𝙵𝚞𝚕𝚕𝙽𝚊𝚖𝚎 -𝚁𝚎𝚌𝚞𝚛𝚜𝚎 -𝙵𝚘𝚛𝚌𝚎
}
}
𝚏𝚘𝚛𝚎𝚊𝚌𝚑($𝚒𝚝𝚎𝚖 𝚒𝚗 $𝚙𝚛𝚎𝚜𝚎𝚛𝚟𝚎){
$𝚜𝚛𝚌=𝙹𝚘𝚒𝚗-𝙿𝚊𝚝𝚑 $𝚝𝚎𝚖𝚙 $𝚒𝚝𝚎𝚖
𝚒𝚏(𝚃𝚎𝚜𝚝-𝙿𝚊𝚝𝚑 $𝚜𝚛𝚌){
$𝚍𝚎𝚜𝚝=𝙹𝚘𝚒𝚗-𝙿𝚊𝚝𝚑 $𝚙𝚊𝚝𝚑 $𝚒𝚝𝚎𝚖
𝙽𝚎𝚠-𝙸𝚝𝚎𝚖 (𝚂𝚙𝚕𝚒𝚝-𝙿𝚊𝚝𝚑 $𝚍𝚎𝚜𝚝) -𝙸𝚝𝚎𝚖𝚃𝚢𝚙𝚎 𝙳𝚒𝚛𝚎𝚌𝚝𝚘𝚛𝚢 -𝙵𝚘𝚛𝚌𝚎 | 𝙾𝚞𝚝-𝙽𝚞𝚕𝚕
𝚛𝚘𝚋𝚘𝚌𝚘𝚙𝚢 $𝚜𝚛𝚌 $𝚍𝚎𝚜𝚝 /𝙴 | 𝙾𝚞𝚝-𝙽𝚞𝚕𝚕
}
}
𝚁𝚎𝚖𝚘𝚟𝚎-𝙸𝚝𝚎𝚖 $𝚝𝚎𝚖𝚙 -𝚁𝚎𝚌𝚞𝚛𝚜𝚎 -𝙵𝚘𝚛𝚌𝚎
- 𝚝𝚊𝚜𝚔: 𝙲𝚘𝚙𝚢𝙵𝚒𝚕𝚎𝚜@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙲𝚘𝚙𝚢 𝙵𝚒𝚕𝚎𝚜'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚂𝚘𝚞𝚛𝚌𝚎𝙵𝚘𝚕𝚍𝚎𝚛: '$(𝙿𝚒𝚙𝚎𝚕𝚒𝚗𝚎.𝚆𝚘𝚛𝚔𝚜𝚙𝚊𝚌𝚎)/𝚍𝚛𝚘𝚙/𝚠𝚠𝚠'
𝙲𝚘𝚗𝚝𝚎𝚗𝚝𝚜: |
**
!𝚠𝚠𝚠𝚛𝚘𝚘𝚝/𝚖𝚎𝚍𝚒𝚊/**
!𝚞𝚖𝚋𝚛𝚊𝚌𝚘/𝙻𝚘𝚐𝚜/**
𝚃𝚊𝚛𝚐𝚎𝚝𝙵𝚘𝚕𝚍𝚎𝚛: '𝙳:\𝚆𝙴𝙱\𝙼𝚊𝚍𝚎𝚒𝚛𝚒𝚊𝚜𝙻𝚎𝚒𝚛𝚒𝚊\𝚞𝚊𝚝.𝚖𝚊𝚍𝚎𝚒𝚛𝚊𝚜𝚕𝚎𝚒𝚛𝚒𝚊.𝚙𝚝\𝚠𝚠𝚠𝚛𝚘𝚘𝚝'
𝙾𝚟𝚎𝚛𝚆𝚛𝚒𝚝𝚎: 𝚝𝚛𝚞𝚎
- 𝚝𝚊𝚜𝚔: 𝙿𝚘𝚠𝚎𝚛𝚂𝚑𝚎𝚕𝚕@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝚂𝚎𝚝 𝙰𝚂𝙿𝙽𝙴𝚃𝙲𝙾𝚁𝙴_𝙴𝙽𝚅𝙸𝚁𝙾𝙽𝙼𝙴𝙽𝚃'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚝𝚊𝚛𝚐𝚎𝚝𝚃𝚢𝚙𝚎: '𝚒𝚗𝚕𝚒𝚗𝚎'
𝚜𝚌𝚛𝚒𝚙𝚝: |
$𝚌𝚘𝚗𝚏𝚒𝚐="𝙳:\𝚆𝙴𝙱\𝙼𝚊𝚍𝚎𝚒𝚛𝚒𝚊𝚜𝙻𝚎𝚒𝚛𝚒𝚊\𝚞𝚊𝚝.𝚖𝚊𝚍𝚎𝚒𝚛𝚊𝚜𝚕𝚎𝚒𝚛𝚒𝚊.𝚙𝚝\𝚠𝚠𝚠𝚛𝚘𝚘𝚝\𝚠𝚎𝚋.𝚌𝚘𝚗𝚏𝚒𝚐"
[𝚡𝚖𝚕]$𝚡𝚖𝚕 = 𝙶𝚎𝚝-𝙲𝚘𝚗𝚝𝚎𝚗𝚝 $𝚌𝚘𝚗𝚏𝚒𝚐
$𝚗𝚘𝚍𝚎=$𝚡𝚖𝚕.𝚂𝚎𝚕𝚎𝚌𝚝𝚂𝚒𝚗𝚐𝚕𝚎𝙽𝚘𝚍𝚎("//𝚎𝚗𝚟𝚒𝚛𝚘𝚗𝚖𝚎𝚗𝚝𝚅𝚊𝚛𝚒𝚊𝚋𝚕𝚎[@𝚗𝚊𝚖𝚎='𝙰𝚂𝙿𝙽𝙴𝚃𝙲𝙾𝚁𝙴_𝙴𝙽𝚅𝙸𝚁𝙾𝙽𝙼𝙴𝙽𝚃']")
𝚒𝚏($𝚗𝚘𝚍𝚎 -𝚎𝚚 $𝚗𝚞𝚕𝚕){
$𝚎𝚗𝚟𝙽𝚘𝚍𝚎=$𝚡𝚖𝚕.𝚂𝚎𝚕𝚎𝚌𝚝𝚂𝚒𝚗𝚐𝚕𝚎𝙽𝚘𝚍𝚎("//𝚎𝚗𝚟𝚒𝚛𝚘𝚗𝚖𝚎𝚗𝚝𝚅𝚊𝚛𝚒𝚊𝚋𝚕𝚎𝚜")
$𝚗𝚎𝚠𝙽𝚘𝚍𝚎=$𝚡𝚖𝚕.𝙲𝚛𝚎𝚊𝚝𝚎𝙴𝚕𝚎𝚖𝚎𝚗𝚝("𝚎𝚗𝚟𝚒𝚛𝚘𝚗𝚖𝚎𝚗𝚝𝚅𝚊𝚛𝚒𝚊𝚋𝚕𝚎")
$𝚗𝚎𝚠𝙽𝚘𝚍𝚎.𝚂𝚎𝚝𝙰𝚝𝚝𝚛𝚒𝚋𝚞𝚝𝚎("𝚗𝚊𝚖𝚎","𝙰𝚂𝙿𝙽𝙴𝚃𝙲𝙾𝚁𝙴_𝙴𝙽𝚅𝙸𝚁𝙾𝙽𝙼𝙴𝙽𝚃")
$𝚗𝚎𝚠𝙽𝚘𝚍𝚎.𝚂𝚎𝚝𝙰𝚝𝚝𝚛𝚒𝚋𝚞𝚝𝚎("𝚟𝚊𝚕𝚞𝚎","𝚂𝚝𝚊𝚐𝚒𝚗𝚐")
$𝚎𝚗𝚟𝙽𝚘𝚍𝚎.𝙰𝚙𝚙𝚎𝚗𝚍𝙲𝚑𝚒𝚕𝚍($𝚗𝚎𝚠𝙽𝚘𝚍𝚎)
} 𝚎𝚕𝚜𝚎 {
$𝚗𝚘𝚍𝚎.𝚟𝚊𝚕𝚞𝚎="𝚂𝚝𝚊𝚐𝚒𝚗𝚐"
}
$𝚡𝚖𝚕.𝚂𝚊𝚟𝚎($𝚌𝚘𝚗𝚏𝚒𝚐)
- 𝚝𝚊𝚜𝚔: 𝙿𝚘𝚠𝚎𝚛𝚂𝚑𝚎𝚕𝚕@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝚂𝚎𝚝 𝙰𝙲𝙻𝚜'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚝𝚊𝚛𝚐𝚎𝚝𝚃𝚢𝚙𝚎: '𝚒𝚗𝚕𝚒𝚗𝚎'
𝚜𝚌𝚛𝚒𝚙𝚝: |
$𝚛𝚘𝚘𝚝="𝙳:\𝚆𝙴𝙱\𝙼𝚊𝚍𝚎𝚒𝚛𝚒𝚊𝚜𝙻𝚎𝚒𝚛𝚒𝚊\𝚞𝚊𝚝.𝚖𝚊𝚍𝚎𝚒𝚛𝚊𝚜𝚕𝚎𝚒𝚛𝚒𝚊.𝚙𝚝\𝚠𝚠𝚠𝚛𝚘𝚘𝚝"
$𝚊𝚙𝚙𝙿𝚘𝚘𝚕="𝙸𝙸𝚂 𝙰𝚙𝚙𝙿𝚘𝚘𝚕\𝚞𝚊𝚝.𝚖𝚊𝚍𝚎𝚒𝚛𝚊𝚜𝚕𝚎𝚒𝚛𝚒𝚊.𝚙𝚝"
$𝚍𝚒𝚛𝚜=@("𝚞𝚖𝚋𝚛𝚊𝚌𝚘","𝙰𝚙𝚙_𝙿𝚕𝚞𝚐𝚒𝚗𝚜","𝚅𝚒𝚎𝚠𝚜","𝚠𝚠𝚠𝚛𝚘𝚘𝚝\𝚖𝚎𝚍𝚒𝚊","𝚠𝚠𝚠𝚛𝚘𝚘𝚝\𝚌𝚜𝚜","𝚠𝚠𝚠𝚛𝚘𝚘𝚝\𝚜𝚌𝚛𝚒𝚙𝚝𝚜","𝚠𝚠𝚠𝚛𝚘𝚘𝚝\𝚞𝚖𝚋𝚛𝚊𝚌𝚘")
𝚏𝚘𝚛𝚎𝚊𝚌𝚑($𝚍 𝚒𝚗 $𝚍𝚒𝚛𝚜){
$𝚏𝚞𝚕𝚕=𝙹𝚘𝚒𝚗-𝙿𝚊𝚝𝚑 $𝚛𝚘𝚘𝚝 $𝚍
𝚒𝚏(𝚃𝚎𝚜𝚝-𝙿𝚊𝚝𝚑 $𝚏𝚞𝚕𝚕){
𝚒𝚌𝚊𝚌𝚕𝚜 $𝚏𝚞𝚕𝚕 /𝚐𝚛𝚊𝚗𝚝 "$𝚊𝚙𝚙𝙿𝚘𝚘𝚕:(𝙾𝙸)(𝙲𝙸)(𝙼)" /𝚃
}
}
- 𝚝𝚊𝚜𝚔: 𝙿𝚘𝚠𝚎𝚛𝚂𝚑𝚎𝚕𝚕@𝟸
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙳𝚎𝚊𝚌𝚝𝚒𝚟𝚊𝚝𝚎 𝙰𝚙𝚙_𝙾𝚏𝚏𝚕𝚒𝚗𝚎'
𝚒𝚗𝚙𝚞𝚝𝚜:
𝚝𝚊𝚛𝚐𝚎𝚝𝚃𝚢𝚙𝚎: '𝚒𝚗𝚕𝚒𝚗𝚎'
𝚜𝚌𝚛𝚒𝚙𝚝: |
$𝚛𝚘𝚘𝚝="𝙳:\𝚆𝙴𝙱\𝙼𝚊𝚍𝚎𝚒𝚛𝚒𝚊𝚜𝙻𝚎𝚒𝚛𝚒𝚊\𝚞𝚊𝚝.𝚖𝚊𝚍𝚎𝚒𝚛𝚊𝚜𝚕𝚎𝚒𝚛𝚒𝚊.𝚙𝚝\𝚠𝚠𝚠𝚛𝚘𝚘𝚝"
$𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎=𝙹𝚘𝚒𝚗-𝙿𝚊𝚝𝚑 $𝚛𝚘𝚘𝚝 "$(𝚘𝚏𝚏𝚕𝚒𝚗𝚎𝚃𝚎𝚖𝚙𝚕𝚊𝚝𝚎)"
$𝚘𝚏𝚏𝚕𝚒𝚗𝚎=𝙹𝚘𝚒𝚗-𝙿𝚊𝚝𝚑 $𝚛𝚘𝚘𝚝 "$(𝚘𝚏𝚏𝚕𝚒𝚗𝚎𝙵𝚒𝚕𝚎)"
𝚒𝚏(𝚃𝚎𝚜𝚝-𝙿𝚊𝚝𝚑 $𝚘𝚏𝚏𝚕𝚒𝚗𝚎){
𝚒𝚏(𝚃𝚎𝚜𝚝-𝙿𝚊𝚝𝚑 $𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎){ 𝚁𝚎𝚖𝚘𝚟𝚎-𝙸𝚝𝚎𝚖 $𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎 -𝙵𝚘𝚛𝚌𝚎 }
𝚁𝚎𝚗𝚊𝚖𝚎-𝙸𝚝𝚎𝚖 $𝚘𝚏𝚏𝚕𝚒𝚗𝚎 $𝚝𝚎𝚖𝚙𝚕𝚊𝚝𝚎 -𝙵𝚘𝚛𝚌𝚎
}
- 𝚜𝚝𝚊𝚐𝚎: 𝙳𝚎𝚙𝚕𝚘𝚢_𝙿𝚁𝙾𝙳
𝚍𝚒𝚜𝚙𝚕𝚊𝚢𝙽𝚊𝚖𝚎: '𝙳𝚎𝚙𝚕𝚘𝚢 𝚝𝚘 𝙿𝚛𝚘𝚍𝚞𝚌𝚝𝚒𝚘𝚗'
𝚍𝚎𝚙𝚎𝚗𝚍𝚜𝙾𝚗: 𝙳𝚎𝚙𝚕𝚘𝚢_𝚄𝙰𝚃
𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗: 𝚜𝚞𝚌𝚌𝚎𝚎𝚍𝚎𝚍()
𝚓𝚘𝚋𝚜:
- 𝚍𝚎𝚙𝚕𝚘𝚢𝚖𝚎𝚗𝚝: 𝙿𝚛𝚘𝚍𝙳𝚎𝚙𝚕𝚘𝚢
𝚎𝚗𝚟𝚒𝚛𝚘𝚗𝚖𝚎𝚗𝚝:
𝚗𝚊𝚖𝚎: '𝙿𝚁𝙾𝙳-𝙳𝙱𝙻𝟶𝟷'
𝚛𝚎𝚜𝚘𝚞𝚛𝚌𝚎𝚃𝚢𝚙𝚎: 𝚅𝚒𝚛𝚝𝚞𝚊𝚕𝙼𝚊𝚌𝚑𝚒𝚗𝚎
𝚛𝚞𝚗𝙾𝚗𝚌𝚎:
𝚍𝚎𝚙𝚕𝚘𝚢:
𝚜𝚝𝚎𝚙𝚜:
- 𝚌𝚑𝚎𝚌𝚔𝚘𝚞𝚝: 𝚗𝚘𝚗𝚎
- 𝚍𝚘𝚠𝚗𝚕𝚘𝚊𝚍: 𝚌𝚞𝚛𝚛𝚎𝚗𝚝
𝚊𝚛𝚝𝚒𝚏𝚊𝚌𝚝: 𝚍𝚛𝚘𝚙
# 𝚂𝙰𝙼𝙴 𝙻𝙾𝙶𝙸𝙲 𝙰𝚂 𝚄𝙰𝚃, 𝚆𝙸𝚃𝙷 𝙿𝚁𝙾𝙳𝚄𝙲𝚃𝙸𝙾𝙽 𝙿𝙰𝚃𝙷𝚂
Se está a trabalhar numa nova configuração de CI/CD ou a tentar melhorar a que já tem, e tudo começa a complicar-se quando adiciona múltiplos servidores, sincronização de media, regras de segurança ou fluxos mais avançados... não está sozinho. Ajudamos equipas com isto todos os dias.
Os nossos developers construíram e fizeram deploy de projetos Umbraco de todas as dimensões: sites para pequenas empresas, grandes plataformas empresariais, projetos do setor público e tudo o que há entre estes extremos. Se quiser que alguém experiente analise a sua configuração, ou se quer apenas aconselhamento sobre a melhor abordagem, teremos todo o gosto em ajudar.
Fale com a nossa equipa
Se quiser rever o seu processo de deployment ou planear os próximos passos, entre em contacto connosco. Sem pressão ou compromissos. Apenas uma conversa amigável sobre o que deseja alcançar.
Se está a enfrentar desafios com load balancing, escalabilidade, automação de deploy ou qualquer tema relacionado com Umbraco e DevOps, fale connosco. Podemos ser a equipa certa para o apoiar (e os nossos clientes costumam considerar os nossos preços muito competitivos).
--
Escrito por Marco Teodoro
Fundador & CEO, Double Shore