Deploy a partir de git tag (`source: type: tag`)
A partir da v2.57.0, uma instância pode deployar o código de uma git tag em vez de uma branch ou da dist. A tag é resolvida relativa a uma branch — só contam tags alcançáveis por ela (o "branch.tag") — e a versão do deploy vira o nome da tag.
Quando usar
- Deployar exatamente uma versão marcada (
v1.2.2) em produção. - Sempre subir a maior release que casa um padrão (
v*). - Separar canais por sufixo de tag (
v*.rc,*.prod).
Sintaxe
instances:
production:
domain: app.projeto.com.br
source:
type: tag
branch: main # OBRIGATÓRIO — só tags alcançáveis por esta branch
tag: "v*" # 3 modos, ver abaixo
sort: semver # opcional: semver (default) | date
keep_versions: 3| Campo | Obrigatório | Descrição |
|---|---|---|
type: tag |
sim | Ativa o modo tag |
branch |
sim | Reachability: só entram tags no histórico desta branch (git tag --merged <branch>) |
tag |
não | Spec da tag (ver os 3 modos); omitido = última tag qualquer |
sort |
não | semver (default) ou date |
Os três modos
O valor de tag decide o comportamento pelo formato:
tag: |
Modo | Seleção | Ordenação |
|---|---|---|---|
glob — tem * ou ? (v*, v*.rc, v1.?.?.prod) |
padrão | última que casa o glob | sort |
nome exato — sem metacaractere (v1.2.2) |
pin | exatamente essa tag | — |
"" ou omitido |
última | última tag qualquer | sempre por data |
O matching é glob (* = qualquer sequência, ? = um caractere), não regex. O git proíbe */? em nome de tag, então um valor com esses caracteres só pode ser glob — a detecção é inequívoca.
Ordenação (`sort`)
semver(default):git tag --sort=-v:refname— a maior versão. Bom parav*,v1.2.*.date:git tag --sort=-creatordate— a mais recente por data de criação.
Use date para padrões com sufixo custom (v*.rc, *.prod). O version-sort do git não ordena bem esses sufixos — por exemplo, rankeia v1.10.0.rc acima de v1.10.0. O modo vazio ignora sort e usa sempre date.
Exemplos
Maior release estável na main:
source:
type: tag
branch: main
tag: "v*"
sort: semverPin numa versão exata:
source:
type: tag
branch: main
tag: "v1.4.2"Canal de RC (o RC mais recente por data):
source:
type: tag
branch: main
tag: "v*.rc"
sort: dateComo funciona
- O runner clona o repo completo (todas as branches + tags) no
pull/— a reachability (--merged) e o sort de tags precisam do histórico e das tags. - Resolve a tag conforme o modo/sort, relativa a
origin/<branch>. - Faz checkout do commit da tag.
- A versão do deploy = o nome da tag resolvida (ex:
v1.4.2), independente deversion.source.
Deployar
runner deploy meu-appA instância type: tag resolve e deploya a tag. No log:
[tag] 'v*' → v1.4.2 @ a1b2c3d
Versão: v1.4.2Auto-deploy no cron (canal de release)
A partir da v2.58.0, o fetch --deploy (o cron do runner) detecta tags novas e deploya sozinho:
- glob (
v*) e vazio ("") funcionam como canal de release automático: quando surge uma tag nova (maior semver / mais recente) num commit novo, o cron sobe sozinho. - pin (
v1.2.2) nunca auto-deploya — resolve sempre o mesmo commit, então fica fixo até você mudar a tag no manifesto.
runner fetch --deploy meu-app # detecta tag nova e deploya (glob/vazio)O REPO VER no runner fetch mostra o nome da tag que o próximo deploy vai publicar. Uma tag nova apontando para o mesmo commit de uma já deployada não dispara deploy (nada mudou no código).
Erros comuns
| Erro | Causa |
|---|---|
type: tag exige branch: na source |
Faltou branch — necessário para reachability |
tag '<v>' não encontrada ou não alcançável por '<branch>' |
Pin de tag inexistente, ou tag que não está no histórico da branch |
nenhuma tag casa '<glob>' alcançável por '<branch>' |
O glob não bateu com nenhuma tag da branch |
Veja também
- Anatomia do .deploy.yml — schema completo do manifesto.
- Dois deploys da mesma branch — quando cada deploy precisa de config diferente.