рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рд╛рднрд┐рдорд╛рдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдХреНрдпреВрдП рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ рднрд╛рдЧ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд░ рджрд┐рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреВрд░реНрддрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмрд╣реБрдд рдмрд╛рд░, рд╡рд╛рдВрдЫрд┐рдд рд╢рд╛рдЦрд╛ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛, рд╕рдВрдпреЛрдЬрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рд╕рдорд╛рди рд▓рдбрд╝рд╛рдХреВ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХрдИ рд╢рд╛рдЦрд╛рдУрдВ рдкрд░ рдПрдХ рд╕реНрдЯреИрдВрдб рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рддрдХрдиреАрдХ рджрд┐рдЦрд╛рдирд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреЗрд╢реЗрд╡рд░ DevOps рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реБрдЪрд┐ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ:- Gitlab (рдирдВрдЧреЗ рдзрд╛рддреБ / рдмрд╛рджрд▓)
- рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрд╡рд░
- рдореБрдлреНрдд рдбреЛрдореЗрди
рдПрдХ рдХрджрдо: Gitlab рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
- рдЕрдкрдиреЗ рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрд╡рд░ рдкрд░ Gitlab рдзрд╛рд╡рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
- рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдЬреЛ рдбреЙрдХ рдЫрд╡рд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ
- рдХрдВрдЯреЗрдирд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕рдХреНрд╖рдо рдХрд░реЗрдВ
рдЪрд░рдг рджреЛ: рд╕рд░реНрд╡рд░ рд╕реЗрдЯрдЕрдк
- рдбреЙрдХрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
- рдХрдореНрдкреЛрдЬрд╝ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
- рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдБ:
- рдЯреНрд░реИрдлрд╝рд┐рдХ рд╕реЗрдЯ рдХрд░реЗрдВ (рдЙрдирдХреЗ рд▓реЗрдмрд▓ (рд▓реЗрдмрд▓) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рд░реНрд╡рд░):
$ 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
DOMAIN.COM рдХреЛ рдЕрдкрдиреЗ рдбреЛрдореЗрди рд╕реЗ рдмрджрд▓реЗрдВред
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
- рдЯреНрд░реИрдлрд╝рд┐рдХ рдЪрд▓рд╛рдПрдВ:
cd /opt/traefik && docker-compose up -d
- рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрд╡рд░ рдХреЗ рдлрд╝реЙрд░реНрдо '*' рдХрд╛ DOMAIN.COM рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝реЗрдВред
рдЪрд░рдг рддреАрди: рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рддреИрдпрд╛рд░ рдХрд░рдирд╛
- 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
рдкрд░рд┐рд╡рд░реНрддрди
npm run build
рдЕрдкрдиреА рдмрд┐рд▓реНрдб рдЯреАрдо рдХреЗ рд▓рд┐рдПред рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкрде рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
/usr/src/app/dist
рдЕрдкрдиреЗ рдирд┐рд░реНрдорд╛рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рджреВрд░ рдмрджрд▓рддреЗред
рдЖрдк рдпрд╣рд╛рдВ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдбреЙрдХрдлрд╛рдпрд░ рдХрдорд╛рдВрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
- рдЫрд╡рд┐ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЕрдиреБрднрд╛рдЧ рдХреЗ рд╕рд╛рде .itlab-ci.yml рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:
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
- SSH_PRIVATE_KEY рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> CI / CD -> рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕) рдореЗрдВ рдирд┐рдЬреА @@OMOM.COM рдирд┐рдЬреА рдХреБрдВрдЬреА рдЬреЛрдбрд╝реЗрдВ
- рддреИрдирд╛рддреА рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝реЗрдВ:
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
рдЙрдкрд░реЛрдХреНрдд рдЪрд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ:
- рдПрдХ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдирдИ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рд╕рднрд╛ рдФрд░% current_name% рдкрд░ рдирд╡реАрдирддрдо рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдХреА рддреИрдирд╛рддреА рд╢реБрд░реВ рдХрд░рддреА рд╣реИред
- Gitlab рдореЗрдВ рдПрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рддрдВрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ-рджреЛ рд╕реНрдкрд░реНрд╢реЛрдВ рдореЗрдВ рдмрдВрдж рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ / рд╣рдЯрд╛рдиреЗ / рдЦреЛрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
рдЕрдЧрд▓реЗ рдЪрд░рдг:
- рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ рд╕реЗрдЯ рдХрд░реЗрдВред рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, COMMIT_SHA рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрд╡рд┐ рдХреЛ рдЯреИрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ
- Docker рдореЗрдВ nginx рдореЗрдВ config рдЬреЛрдбрд╝реЗрдВ
- ARG рдФрд░ ENV dockerfile рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдВрдбрд▓ рдмрдВрдбрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдВ
- рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рд╕реЗ рдХреИрд╢ рдЙрдкрдпреЛрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рд▓реЗрдЦ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред