Nesta segunda postagem, vou descrever o processo de integração contínua com o Bitbucket que permite, por exemplo, que eu esteja escrevendo este texto diretamente na interface do navegador de internet. O Bitbucket, repositório de controle de versionamento da gigante corporativa Atlassian, tem uma solução própria de integração contínua, o bitbucket-pipelines. Sua configuração é basicamente a usual, usando um arquivo em formato yaml.
A estrutura básica do arquivo bitbucket-pipelines.yaml é simples:
image: andthensome/alpine-hugo-git-bash
pipelines:
branches:
master:
- step:
script:
- hugo
Escolhi esta imagem de docker em especial por ser baseada no Alpine Linux (e ter, assim, um tamanho mínimo, 5 MB básicos) e ter Hugo e Git instalados. O autor da imagem a criou justamente para integração contínua com o Wercker. No meu caso, eu tive que acrescentar algumas coisinhas a mais:
pipelines:
branches:
master:
- step:
script:
- apk update
- apk add openssh
- git submodule update
- hugo
- git config user.name <username>
- git config user.email <user@mail.com>
- git add . && git commit -m "new update"
- git filter-branch --prune-empty --subdirectory-filter public
- git checkout -b deploy
- git push -f origin deploy
Apk é o gerenciador de pacotes do Alpine, e eu preciso do openssh porque o bitbucket.pipelines não salva artefatos da integração em contas gratuitas (exceto na área de download). É necessário sincronizar os arquivos atualizados com o remoto via ssh (daí também a necessidade de Git). Além disso, preciso dar um git submodule update
pois o tema Cocoa EH é um submódulo dentro do meu repositório.
Como o Hugo escreve os arquivos gerados da página no diretório public, filtrei os arquivos usando git filter-branch --subdirectory-filter
e criei um novo branch chamado deploy
, fazendo checkout nele em seguida. O remoto já tem um ramo deploy
, porém o bitbucket.pipelines somente clona o master
. Por isso, também, torna-se necessário dar push com a opção git push -f
(force).
No mais, foi preciso gerar um par de chaves criptográficas no menu pipelines e, em seguida, configurações. A chave pública pode ser copiada com um toque. Basta adicionar a chave nas configuracões de segurança do perfil do Bitbucket e tudo funcionará como se fosse um commit a partir de um repositório origem para o remoto.
Très, très simple! Fiz tudo de um tablet! E a integração ficou rápida como o raio, dura menos de 15 segundos!
P.S.: a única limitação para mim foi que o Alpine Linux não tem opção de configurar locales, e isso me impediu de acentuar o título da página. Mas foi somente isso. Os símbolos e acentuação dentro do texto das postagens são preservados.