CI рдлреЙрд░ рдлреНрд░рдВрдЯреЗрдВрдб: рдЧрд┐рдЯрд▓реИрдм, рдЯреНрд░реИрдлрд┐рдХ, рдбреЙрдХрд░

рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рд╛рднрд┐рдорд╛рдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдХреНрдпреВрдП рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ рднрд╛рдЧ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд░ рджрд┐рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреВрд░реНрддрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмрд╣реБрдд рдмрд╛рд░, рд╡рд╛рдВрдЫрд┐рдд рд╢рд╛рдЦрд╛ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛, рд╕рдВрдпреЛрдЬрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рд╕рдорд╛рди рд▓рдбрд╝рд╛рдХреВ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХрдИ рд╢рд╛рдЦрд╛рдУрдВ рдкрд░ рдПрдХ рд╕реНрдЯреИрдВрдб рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рддрдХрдиреАрдХ рджрд┐рдЦрд╛рдирд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреЗрд╢реЗрд╡рд░ DevOps рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реБрдЪрд┐ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ:

  • Gitlab (рдирдВрдЧреЗ рдзрд╛рддреБ / рдмрд╛рджрд▓)
  • рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрд╡рд░
  • рдореБрдлреНрдд рдбреЛрдореЗрди

рдПрдХ рдХрджрдо: Gitlab рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


  1. рдЕрдкрдиреЗ рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрд╡рд░ рдкрд░ Gitlab рдзрд╛рд╡рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
  2. рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдЬреЛ рдбреЙрдХ рдЫрд╡рд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ
  3. рдХрдВрдЯреЗрдирд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕рдХреНрд╖рдо рдХрд░реЗрдВ

рдЪрд░рдг рджреЛ: рд╕рд░реНрд╡рд░ рд╕реЗрдЯрдЕрдк


  1. рдбреЙрдХрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
  2. рдХрдореНрдкреЛрдЬрд╝ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
  3. рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдБ:

    #     ,      $ 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. рдЯреНрд░реИрдлрд╝рд┐рдХ рд╕реЗрдЯ рдХрд░реЗрдВ (рдЙрдирдХреЗ рд▓реЗрдмрд▓ (рд▓реЗрдмрд▓) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рд░реНрд╡рд░):

     $ 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

    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 

  5. рдЯреНрд░реИрдлрд╝рд┐рдХ рдЪрд▓рд╛рдПрдВ:

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

  6. рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрд╡рд░ рдХреЗ рдлрд╝реЙрд░реНрдо '*' рдХрд╛ DOMAIN.COM рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝реЗрдВред

рдЪрд░рдг рддреАрди: рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рддреИрдпрд╛рд░ рдХрд░рдирд╛


  1. 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;"] 

    рдкрд░рд┐рд╡рд░реНрддрди

     npm run build 

    рдЕрдкрдиреА рдмрд┐рд▓реНрдб рдЯреАрдо рдХреЗ рд▓рд┐рдПред рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкрде рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред

     /usr/src/app/dist 

    рдЕрдкрдиреЗ рдирд┐рд░реНрдорд╛рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рджреВрд░ рдмрджрд▓рддреЗред
    рдЖрдк рдпрд╣рд╛рдВ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдбреЙрдХрдлрд╛рдпрд░ рдХрдорд╛рдВрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
  2. рдЫрд╡рд┐ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЕрдиреБрднрд╛рдЧ рдХреЗ рд╕рд╛рде .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 
  3. SSH_PRIVATE_KEY рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> CI / CD -> рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕) рдореЗрдВ рдирд┐рдЬреА @@OMOM.COM рдирд┐рдЬреА рдХреБрдВрдЬреА рдЬреЛрдбрд╝реЗрдВ
  4. рддреИрдирд╛рддреА рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝реЗрдВ:

     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 рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдВрдбрд▓ рдмрдВрдбрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдВ
  • рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рд╕реЗ рдХреИрд╢ рдЙрдкрдпреЛрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

рд▓реЗрдЦ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред

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


All Articles