En cada proyecto que se respete, los ingenieros de control de calidad deben participar. Todos los días se enfrentarán con la tarea de verificar el cumplimiento de las tareas en ramas separadas. Muy a menudo, el proceso de cambiar a la rama deseada, ensamblar y probar lleva mucho tiempo, además, localmente no siempre es posible recrear por completo el entorno de combate más idéntico.
El propósito de este artículo es mostrar una técnica simple para instalar un stand en varias ramas. Este artículo fue escrito por desarrolladores del desarrollador, por lo que es poco probable que sea de gran interés para los ingenieros profesionales de DevOps.
Requisitos:- Gitlab (metal desnudo / nube)
- Servidor dedicado
- Dominio libre
Paso uno: configurar Gitlab
- Instale Gitlab Runner en su servidor dedicado
- Crear un trabajador que admita compilaciones de imágenes de Docker
- Habilitar el registro de contenedores
Paso dos: configuración del servidor
- Instalar Docker
- Instalar componer
- Crea un usuario:
- Configure traefik (un servidor que envía solicitudes a contenedores Docker en función de sus etiquetas (etiquetas)):
$ sudo mkdir -p /opt/traefik $ docker network create web
/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
Reemplace DOMAIN.COM con su dominio.
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
- Ejecuta traefik:
cd /opt/traefik && docker-compose up -d
- Agregue un registro para DOMAIN.COM del formulario '*' - IP del servidor dedicado.
Paso tres: preparar el repositorio
- Agregue a la raíz del repositorio de 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
Cambio
npm run build
a tu equipo de construcción. Edite la ruta de la misma manera.
/usr/src/app/dist
cambiando dist a su directorio de compilación.
Puede leer más sobre la estructura y los comandos de dockerfire aquí .
- Agregue el archivo .gitlab-ci.yml con la sección de ensamblaje de imagen:
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
- Agregue la clave privada deployer@DOMAIN.COM a la configuración del repositorio (Configuración -> CI / CD -> Variables) como SSH_PRIVATE_KEY
- Agregar secciones de implementación:
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
Los pasos anteriores son suficientes para obtener el siguiente resultado:
- Cada nueva confirmación en una rama inicia el ensamblaje y la implementación del último código actual en% branch_name% .tests.DOMAIN.COM
- Gitlab incluye un mecanismo de entorno que le permite crear / eliminar / abrir imágenes bloqueadas en un par de toques
Próximos pasos:
- Configure una sección separada para los ensamblajes del asistente. En el caso del asistente, es razonable etiquetar la imagen a través de COMMIT_SHA
- Agregar configuraciones a nginx en docker
- Reenviar parámetros de ensamblaje de paquetes a través de mecanismos ARG y ENV dockerfile
- Configurar el uso de caché de la imagen para ensamblajes
De acuerdo con el artículo.