Instalando e Configurando Gitlab CI para Projetos Web

Instalação do Runner

Setup Gitlab Runner

A abordagem usada para o Runner foi de usar um container dentro do nosso servidor de teste com o seguinte comando:

docker run -d --privileged --name gitlab-runner /
--restart always -v /var/run/docker.sock:/var/run/docker.sock -v /
$PWD/config:/etc/gitlab-runner gitlab/gitlab-runner:latest

Registrando o Runner

Com o container criado, deve-se registrar o runner do seu projeto lá dentro dele com o comando:

docker exec -it gitlab-runner gitlab-runner register /
-n --url https://gitlab.dev.evologica.com.br/ --registration-token <TOKEN_DO_PROJETO> /
--executor docker --description "<NOME_DO_PROJETO> CI" --docker-image "docker:latest" --docker-privileged

onde TOKEN_DO_PROJETO é o token que se encontra na pagina de configuração do CI/CD do projeto, e NOME_DO_PROJETO é o nome do projeto para identificar o container lá dentro.

Setup do gitlab-ci.yml

Na raiz do projeto fica o arquivo de configuração, que determina como o CI/CD vai funcionar. Exemplo do arquivo yml do ucHealth:

stages:
  - build
  - test
  - publish
  - deploy
build:
  image: node:8-slim
  stage: build
  cache:
    key: node_modules
    paths:
      - cli/web/node_modules/
  before_script:
    - yarn config set registry http://nexus.dev.evologica.com.br/repository/npm/
  script:
    - cd cli/web
    - yarn
    - yarn run build --progress=false
  artifacts:
    paths:
      - cli/web/dist/
  tags:
    - node
test:
  image: node:8-slim
  stage: test
  cache:
    key: node_modules
    paths:
      - cli/web/node_modules/
  script:
    - cd cli/web
    - yarn run lint
  tags:
    - node
publish:
  image: docker:latest
  stage: publish  
  services:
    - docker:dind
  only:
    - "master" 
  before_script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.dev.evologica.com.br
  script:
    - cd cli/web
    - "PACKAGE_VERSION=$(cat package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[\",]//g' | tr -d '[[:space:]]')"
    - docker build -t registry.dev.evologica.com.br/curio/uc-health:$PACKAGE_VERSION .
    - docker push registry.dev.evologica.com.br/curio/uc-health:$PACKAGE_VERSION
    - printf "VERSION=${PACKAGE_VERSION}\n HOST_URL=test.evologica.com.br" > .env
  after_script:
    - docker logout registry.dev.evologica.com.br
  artifacts:
    paths:
      - cli/web/.env
  tags:
    - docker
deploy:
  image: gitlab/dind:latest
  stage: deploy
  only:
    - "master"  
  before_script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.dev.evologica.com.br
  before_script:
    - mkdir -p ~/.ssh
    - echo "$DEPLOY_SERVER_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    - eval "$(ssh-agent -s)"
    - ssh-add ~/.ssh/id_rsa
    - ssh-keyscan -H test.evologica.com.br >> ~/.ssh/known_hosts
  script:
    - cd cli/web
    - scp -r .env docker-compose.yml admin@test.evologica.com.br:~/services/uc-health
    - ssh admin@test.evologica.com.br "cd ~/services/uc-health; docker-compose up -d"
  #when: manual
  tags:
    - docker

com isso já deve ser capaz de realizar o CI/CD.

Autenticação

Para realizar Publicação e Deploy, requer um nivel de autenticação.

Personal Access Token

Em Settings -> Secret variables deve ser adicionada uma nova variável com nome CI_BUILD_TOKEN onde seu valor é o seu personal access token. Esse token será exigido em comandos como este: docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.dev.evologica.com.br.

Private Key

Outra variável secreta que deve ter para realizar o deploy é a DEPLOY_SERVER_PRIVATE_KEY, onde seu valor deve ser a cahve privada para o acesso na maquina onde será realizado do deploy.

Deploy Node Clients

Para realizar o deploy de clientes Nodes, usamos um container web service. Portanto devemos criar o docker-compose.yml e o Dockerfile para subir esse service na máquina de teste.

docker-compose.yml

exemplo do ucHealth:

version: '2'
services:

  ucHealth:
    image: registry.dev.evologica.com.br/curio/uc-health:${VERSION}
    container_name: ucHealth
    volumes:
      - ./dist:/var/www/html
    environment:
      - VIRTUAL_HOST=ucHealth.${HOST_URL}
      - VIRTUAL_PORT=80

      - LETSENCRYPT_HOST=ucHealth.${HOST_URL}
      - LETSENCRYPT_EMAIL=isaac@conexops.com.br

networks:
  default:
    external:
      name: webproxy

Dockerfile

exemplo do ucHealth:

FROM nginx:alpine
COPY dist/ /usr/share/nginx/html

.