Automatizando a criação de imagens via Gitlab-CI
Integração Contínua (em inglês, Continuous Integration - C.I.) é uma prática em desenvolvimento de software em que você constrói e testa (build and test) o software toda vez que um desenvolvedor enviar um código (push) para a aplicação, e esse processo pode ocorrer várias vezes por dia.
O software Gitlab disponibiliza uma ferramenta para realizar essa automação chamada Gitlab-CI.
As imagens de containers docker são armazenadas em repositórios denominados docker hub. Neste post, mostraremos como automatizar a criação de uma imagem de container e envio para o Hub cada vez que o repositório receber um novo push.
.gitlab-ci.yml
O arquivo .gitlab-ci.yml deverá ser criado na raíz do repositório. Dessa maneira, o Gitlab identificará que esse é o script responsável pelos comandos de automatização do projeto. Caso alguns dos passos do script retorne erro, o processo é cancelado e a tarefa retorna erro.
Arquivo .gitlab-ci.yml:
stages:
- build-and-push
before_script:
- export DOCKER_TAG=`echo ${CI_BUILD_REF_NAME} | sed s/master/latest/`
build-and-push-job:
stage: build-and-push
script:
- docker build -t ${CI_PROJECT_NAME}:${DOCKER_TAG} .
- docker tag ${CI_PROJECT_NAME}:${DOCKER_TAG} ${CI_REGISTRY}/${CI_REGISTRY_PROJECT_NAME}/${CI_PROJECT_NAME}:${DOCKER_TAG}
- docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
- docker push ${CI_REGISTRY}/${CI_REGISTRY_PROJECT_NAME}/${CI_PROJECT_NAME}:${DOCKER_TAG}
Variáveis
Varíáveis utilizadas:
- CI_BUILD_REF_NAME: nome da branch ou nome da tag em que o projeto foi construído
- DOCKER_TAG: nome da tag em que a imagem será criada (Ex: latest, 1.0, 2.0.4, etc)
- CI_PROJECT_NAME: nome do projeto
- CI_REGISTRY: URL de acesso ao hub
- CI_REGISTRY_USER: usuário para acesso ao hub
- CI_REGISTRY_PASSWORD: senha para acesso ao hub
- CI_REGISTRY_PROJECT_NAME: nome do projeto dentro do hub
Para mais informações, variáveis disponíveis no Gitlab CI.
Funcionamento
Descrição do funcionamento:
Define o número de estágios e dá o nome para o primeiro estágio:
stages:
- build-and-push
Script que é executado antes de cada estágio. Caso o commit tenha sido realizado na branch master, o nome da tag será alterado para latest, caso contrário, o nome da tag da imagem será o nome da tag do repositório:
Ex: 1.0.19, latest, etc.
before_script:
- export DOCKER_TAG=`echo ${CI_BUILD_REF_NAME} | sed s/master/latest/`
Comando docker build, para construir a imagem:
Ex: docker build -t nomedoprojeto:latest .
build-and-push-job:
stage: build-and-push
script:
- docker build -t ${CI_PROJECT_NAME}:${DOCKER_TAG} .
Comando docker tag, para marcar a imagem recém criada com a tag informada:
Ex: docker tag nomedoprojeto:latest hub.exemplo.com/projeto/nomedoprojeto:latest
- docker tag ${CI_PROJECT_NAME}:${DOCKER_TAG} ${CI_REGISTRY}/${CI_REGISTRY_PROJECT_NAME}/${CI_PROJECT_NAME}:${DOCKER_TAG}
Efetuar login no hub:
- docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
Enviar (push) a imagem recém criada para o repositório:
- docker push ${CI_REGISTRY}/${CI_REGISTRY_PROJECT_NAME}/${CI_PROJECT_NAME}:${DOCKER_TAG}