/ Gitlab

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}
Éverton Paiva

Éverton Paiva

Analista de Tecnologia da Informação da UFVJM. Lotado na Diretoria de Tecnologia da Informação - DTI. Desenvolvedor de sistemas, iniciante e entusiasta de tecnologias devops.

Read More