CI pour frontend: Gitlab, Traefik, Docker

Dans chaque projet qui se respecte, les ingénieurs QA doivent participer. Chaque jour, ils seront confrontés à la tâche de vérifier l'accomplissement des tâches dans des branches distinctes. Très souvent, le processus de basculement vers la branche souhaitée, d'assemblage et de test prend beaucoup de temps, de plus, localement, il n'est pas toujours possible de recréer complètement l'environnement de combat le plus identique.

Le but de cet article est de montrer une technique simple pour installer un stand sur plusieurs branches. Cet article a été écrit par des développeurs du développeur, il est donc peu susceptible d'intéresser les ingénieurs DevOps professionnels.

Prérequis:

  • Gitlab (métal nu / cloud)
  • Serveur dédié
  • Domaine gratuit

Première étape: configurer Gitlab


  1. Installez Gitlab Runner sur votre serveur dédié
  2. Créer un travailleur prenant en charge les générations d'images Docker
  3. Activer le registre de conteneurs

Deuxième étape: configuration du serveur


  1. Installer Docker
  2. Installer Compose
  3. Créez un utilisateur:

    #     ,      $ sudo adduser deployer $ sudo groupadd docker $ sudo usermod -aG docker deployer #  ssh  $ su deployer $ ssh-keygen -t rsa (when asked for a passphrase, enter no passphrase) #          $ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys 

  4. Configurer traefik (un serveur mandatant les requêtes vers les conteneurs Docker en fonction de leurs étiquettes (étiquettes)):

     $ sudo mkdir -p /opt/traefik $ docker network create web #   docker-compose & traefik         

    /opt/traefik/docker-compose.yml

     version: '2' services: traefik: image: traefik:1.4.6 restart: always ports: - 80:80 networks: - web volumes: - /var/run/docker.sock:/var/run/docker.sock - ./traefik.toml:/traefik.toml container_name: traefik networks: web: external: true 

    /opt/traefik/traefik.toml

    Remplacez DOMAIN.COM par votre domaine.

     debug = true checkNewVersion = true logLevel = "ERROR" defaultEntryPoints = ["http"] [entryPoints] [entryPoints.http] address = ":80" [retry] [docker] endpoint = "unix:///var/run/docker.sock" domain = "DOMAIN.COM" watch = true exposedbydefault = false 

  5. Exécutez traefik:

     cd /opt/traefik && docker-compose up -d 

  6. Ajoutez un enregistrement pour DOMAIN.COM de la forme '*' - IP du serveur dédié.

Troisième étape: préparation du référentiel


  1. Ajoutez à la racine du référentiel Dockerfile:

     FROM node:8.9 as build-deps WORKDIR /usr/src/app COPY package.json ./ RUN npm i COPY . ./ RUN npm run build FROM nginx:1.12-alpine COPY --from=build-deps /usr/src/app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] 

    Changer

     npm run build 

    à votre équipe de construction. Modifiez le chemin de la même manière.

     /usr/src/app/dist 

    changer dist dans votre répertoire de construction.
    Vous pouvez en savoir plus sur la structure et les commandes dockerfire ici .
  2. Ajoutez le fichier .gitlab-ci.yml avec la section d'assemblage d'image:

     image: docker:stable variables: DOCKER_HOST: tcp://docker:2375/ DOCKER_DRIVER: overlay2 GITLAB_DOMAIN: gitlab.com services: - docker:dind stages: - build build_staging: stage: build script: - export GITLAB_DOMAIN=gitlab.com - export CONTAINER_IMAGE=$GITLAB_DOMAIN/frontend/main/image - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $GITLAB_DOMAIN - docker pull $CONTAINER_IMAGE:$CI_COMMIT_REF_SLUG || true - export URL="Host:${CI_COMMIT_REF_NAME}.tests.DOMAIN.COM" - docker build -t $CONTAINER_IMAGE:$CI_COMMIT_REF_SLUG . --label "traefik.backend=${CI_COMMIT_REF_NAME}" --label "traefik.frontend.rule=${URL}" - docker push $CONTAINER_IMAGE:$CI_COMMIT_REF_SLUG 
  3. Ajoutez la clé privée deployer@DOMAIN.COM aux paramètres du référentiel (Paramètres -> CI / CD -> Variables) en tant que SSH_PRIVATE_KEY
  4. Ajouter des sections de déploiement:

     stages: - build - deploy /// .... deploy_staging: stage: deploy image: kroniak/ssh-client:3.6 script: - mkdir ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' - eval $(ssh-agent -s) - ssh-add <(echo "$SSH_PRIVATE_KEY") - ssh deployer@DOMAIN.COM "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $GITLAB_DOMAIN" - ssh deployer@DOMAIN.COM "docker stop frontend_${CI_COMMIT_REF_SLUG}" || true - ssh deployer@DOMAIN.COM "docker rm frontend_${CI_COMMIT_REF_SLUG}" || true - ssh deployer@DOMAIN.COM "docker rmi GITLAB-DOMAIN.COM/frontend/main/image:${CI_COMMIT_REF_SLUG}" || true - ssh deployer@DOMAIN.COM "docker run --name frontend_${CI_COMMIT_REF_SLUG} --network=web -d $GITLAB_DOMAIN/frontend/main/image:${CI_COMMIT_REF_SLUG}" environment: name: review/$CI_COMMIT_REF_NAME url: http://${CI_COMMIT_REF_NAME}.tests.DOMAIN.COM on_stop: stop_staging stop_staging: stage: deploy image: kroniak/ssh-client:3.6 variables: GIT_STRATEGY: none script: - mkdir ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' - eval $(ssh-agent -s) - ssh-add <(echo "$SSH_PRIVATE_KEY") - ssh deployer@DOMAIN.COM "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN GITLAB-DOMAIN.COM" - ssh deployer@DOMAIN.COM "docker stop frontend_${CI_COMMIT_REF_SLUG}" || true - ssh deployer@DOMAIN.COM "docker rm frontend_${CI_COMMIT_REF_SLUG}" || true - ssh deployer@DOMAIN.COM "docker rmi $GITLAB_DOMAIN/frontend/main/image:${CI_COMMIT_REF_SLUG}" || true when: manual environment: name: review/$CI_COMMIT_REF_NAME action: stop 

Les étapes ci-dessus suffisent pour obtenir le résultat suivant:

  • Chaque nouvelle validation dans une branche lance l'assemblage et le déploiement du dernier code actuel dans% branch_name% .tests.DOMAIN.COM
  • Gitlab comprend un mécanisme d'environnement qui vous permet de créer / supprimer / ouvrir des images verrouillées en quelques touches

Prochaines étapes:

  • Configurez une section distincte pour les assemblys de l'assistant. Dans le cas de l'assistant, il est raisonnable de baliser l'image via COMMIT_SHA
  • Ajouter des configurations à Nginx dans Docker
  • Transférer les paramètres d'assemblage de bundle via les mécanismes de dockerfile ARG et ENV
  • Configurer l'utilisation du cache à partir de l'image pour les assemblys

Basé sur l'article.

Source: https://habr.com/ru/post/fr429824/


All Articles