Spinnaker — Modelos de pipeline gerenciado

Leandro Souza
hurb.labs
Published in
4 min readFeb 10, 2020
Image Credits: herreid / Getty Images

O pipeline é sem dúvida uma ferramenta essencial para controlar e implantar seus aplicativos, ele é composto por uma série de estágios que podem ser combinados em quase qualquer ordem, o que tornam os pipelines flexíveis, consistentes e repetíveis.

Você pode configurar seus pipelines para execução totalmente automática ou exigir intervenção manual para garantir que tudo esteja funcionando conforme o esperado.

Uma forma de automatizar e até mesmo padronizar todos os pipelines é fazer uso do pipeline template, esse será o nosso foco, utilizar o template a fim de padronizar todo o fluxo de deploy.

De início vamos precisar criar um pipeline que será o nosso modelo. Na página do spinnaker podem ser encontrados maiores detalhes sobre a criação do pipeline.

Pipeline modelo

Utilizando Pipeline template

Esses modelos podem ser compartilhados entre equipes, diferentes aplicativos, projetos ou até mesmo em diferentes implantações do próprio Spinnaker.

Os modelos podem ser gerenciados usando o Spin ou a interface do usuário.

Para poder gerenciar modelos por meio da interface do usuário é preciso ativar este recurso:

$ hal config features edit — managed-pipeline-templates-v2-ui true
$ hal config features edit --pipeline-templates true
$ hal deploy apply

O Spin é um bom aliado na criação de todo esse processo, principalmente para parametrizar o pipeline e ajudar na hora de debugar qualquer expressão utilizada.

Para instalar o Spin basta seguir a documentação na página oficial.

Durante todo o processo o Spin é utilizado para buscar e criar o pipeline modelo.

  1. Comando utilizado para criar um arquivo json com base no pipeline modelo:
$ spin pipeline get --name <pipelineName> --application <appName> | tee new_template.json

Adicionando alguns campos, você pode transformar esse JSON no pipeline modelo.

2. Referência ao schema utilizado que no caso é v2:

"shchema": "v2",

3. Declarando as variáveis:

"variables": [
{
"type": "<type>",
"defaultValue": <defaultValue>,
"description": "<some description>",
"name": "<name of this variable>"
},
{
"type": "<type>",
"defaultValue": <defaultValue>,
"description": "<some description>",
"name": "<name of this variable>"
}
]

No modelo parametrizado, seria:

"waitTime": "${ templateVariables.timeToWait }",

Abaixo está um exemplo completo do pipeline já recuperando a variável criada:

{
"schema": "v2", # Reference to the MPTv2 schema
"variables": [
{
"type": "int",
"defaultValue": 42,
"description": "The time a wait stage shall pauseth",
"name": "timeToWait" # This is the name that's referenced in the SpEL expression later
}
],
"id": "newSpelTemplate", # Main identifier to reference this template from instance
"protect": false,
"metadata": {
"name": "Variable Wait",
"description": "A demonstrative Wait Pipeline.",
"owner": "example@example.com",
"scopes": ["global"]
},
"pipeline": { # A "normal" pipeline definition.
"lastModifiedBy": "anonymous",
"updateTs": "0",
"parameterConfig": [],
"limitConcurrent": true,
"keepWaitingPipelines": false,
"description": "",
"triggers": [],
"notifications": [],
"stages": [
{
"waitTime": "${ templateVariables.timeToWait }", # Templated field.
"name": "My Wait Stage",
"type": "wait",
"refId": "wait1",
"requisiteStageRefIds": []
}
]
}
}

Agora é preciso salvar esse template que ficará disponível na UI para criar o pipeline em qualquer projeto:

spin pipeline-templates save --file my_template.txt

Criando o pipeline

Basicamente será preciso escolher em qual projeto o novo pipeline será inserido e em seguida definir um nome.

  1. Criação do pipeline:

2. Definir os parâmetros criados a partir do template:

3. Pipeline já criado:

O interessante de usar um pipeline gerenciado via template é poder padronizar todo e qualquer deploy através de diversos projetos, um outro ponto bastante interessante é que toda a modificação feita posteriormente no template é replicado em todos os projetos de acordo com o template base, isso faz com que a manutenção seja simples.

Referências

  1. https://www.spinnaker.io/concepts/pipelines/
  2. https://www.spinnaker.io/guides/user/pipeline/
  3. https://www.spinnaker.io/reference/pipeline/expressions/
  4. https://www.spinnaker.io/reference/pipeline/templates/

--

--

Leandro Souza
hurb.labs

More than ten years of expertise with large scale web applications, high availability, resilient systems and high performance architectures