рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореЗрд░рд╛ рдирд╛рдо рдПрд░реНрдЯреЛрдо рдЬрд╝реЗрд▓реНрддрдХ рд╣реИ , рдореИрдВ рдПрдХ рдЯреАрдо рд╣реИ, рдФрд░ рдУрдЯрд╕ рдХреЗ "рдЧреЛрд▓рдВрдЧ рдбреЗрд╡рд▓рдкрд░" рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдПрдХ рд╢рд┐рдХреНрд╖рдХ рднреА рд╣реВрдВред рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рдПрдХ рдирдИ рдзрд╛рд░рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд▓реЗрдЦ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЧреЛрд▓рдВрдЧ рдорд╣рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рджреБрдирд┐рдпрд╛ рдореЗрдВ VPS, VDS рдкрд░ рдХрдИ php рдФрд░ рдЕрдиреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрдк рд╡рд╣рд╛рдВ рдПрдХ рдбреЙрдХрдЯрд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ (рд▓реЗрдЦрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдХрд╛рд░реНрдп рдХреА рдкреБрдирдГ рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред рдЖрдк рдПрдлрд╝рдЯреАрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдлреЗрдВрдЧ рд╢реБрдИ рдирд╣реАрдВ рд╣реИ, рдПрд╕рдПрдлрдЯреАрдкреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдЧ рд╢реБрдИ рди рдХрд░реЗрдВред рдлрд┐рд░
рд╕рд░реНрдХрд┐рд▓рд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╕реАрдЖрдИ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрджрдо рд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЕрдВрдд рдореЗрдВ рд╣рдо рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рддреИрдирд╛рдд рдХрд░реЗрдВрдЧреЗред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ
- рдорд┐рдирд┐рдорд▓ рд╕рд░реНрд╡рд░ рдЗрдиреЛрд╡реЗрд╢рди
- рддреИрдирд╛рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд
- рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рджреЗрд╡ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдФрд░ рдареЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдореИрдиреБрдЕрд▓ рдкреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЯреИрдЧрд┐рдВрдЧ рд╣реИ
- рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
- рдореИрдиреБрдЕрд▓ рд░реЛрд▓рдмреИрдХ рддрдВрддреНрд░ рд╕рдВрд╕реНрдХрд░рдг
рд╕рд░реНрдХрд┐рд▓ рдХреНрдпреЛрдВ?
рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА, рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдмрд┐рдЯрдмрдХреЗрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред (рдЕрдм рдирд┐рдЬреА рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреАрдердм рдореЗрдВ рд╣реИрдВред) рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рдЫреЛрдбрд╝реЗ рдмрд┐рдирд╛, рдПрдЯрд▓рд╕рд┐рдпрди рдиреЗ рд╕рд░реНрдХрд┐рд▓рд╕реА (рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реАрдЖрдИ) рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛:
- рдиреНрдпреВрдирддрдо рд╕реЗрдЯрд┐рдВрдЧ
- ssh рдбреАрдмрдЧ рд╕реБрд╡рд┐рдзрд╛
- рдореБрдХреНрдд рд╕рдВрд╕реНрдХрд░рдг рд▓реЗрдХрд┐рди рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде
- 2500 рдХреНрд░реЗрдбрд┐рдЯ / рдкреНрд░рддрд┐ рд╕рдкреНрддрд╛рд╣ (рд▓рдЧрднрдЧ 250 рдорд┐рдирдЯ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░) # рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
- рдПрдХрд▓ рдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрди # рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдкрд╛рд▓рддреВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реИрдВ
- рдХреЗрд╡рд▓ linux рдФрд░ windows # рд╣рдореЗрдВ linux рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рднрд╛рдЧ рдПрдХ, рд╡рд░реНрдХрдлрд╝реНрд▓реЛ
рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБред Circle рдФрд░ рдЙрд╕рдореЗрдВ рдПрдХ config.yml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ рдФрд░ рд╡рд╣рд╛рдБ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ (рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдХреНрд░рдо)
workflows: version: 2 tagged-build: jobs: - test - dev_deploy: requires: - test - approve_master_deploy: type: approval requires: - test - dev_deploy - prod_deploy: requires: - dev_deploy - approve_master_deploy
рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

рд╣рдордиреЗ рдПрдХ рдкреИрдЯрд░реНрди рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рдмрджреНрдз рдХреЛ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рдПрдЧрд╛, рдлрд┐рд░ рджреЗрд╡ рдХреЛ рд░реЛрд▓ рдЖрдЙрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдлрд┐рд░, рдореИрдиреНрдпреБрдЕрд▓ рдкреБрд╖реНрдЯрд┐ рдХреЗ рд╕рд╛рде, рдпреБрджреНрдз рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдЧреНрд▓реЙрд╕ рдХреЛ рдЧрд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдЯрд╛рд╕реНрдХ рдХреЗрд╡рд▓ рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рдХрд╛рдо рдХрд░реЗред
- dev_deploy: requires: - test filters: branches: ignore: /.*/ tags: only: /.*/
рджреВрд╕рд░рд╛ рдЪрд░рдг, рд╕рдмрд╕реЗ рдЖрд╕рд╛рди
рдЪрд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдиреНрдпреВрдирддрдо рдХреЛрдб рд╣реЛрдЧрд╛ред
jobs: test: docker: - image: circleci/golang:1.12 working_directory: ~/go-example/ steps: - checkout # linter' - run: go test -cover -v ./...
рд╣рдорд╛рд░реЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдФрд░ рдХреЛрдб рд╢реИрд▓реА рдХреА рдЬрд╛рдВрдЪ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрд╡ рдкрд░ рддреИрдирд╛рддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЧреЛ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ (рд▓реЗрдЦрди рдХреЗ рд╕рдордп 3.1.4) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдПрдХрддреНрд░ рдХрд░реЗрдВрдЧреЗред
CI PH_NAME рдХреЗ тАЛтАЛрднреАрддрд░ .circleci рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ_ph.conf рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ, рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд╛рдо рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдо рд▓реЙрдЧ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред
[program:PH_NAME] stopasgroup=true user=deploy-user autostart=true autorestart=true stdout_logfile=/var/log/supervisor/PH_NAME.log stderr_logfile=/var/log/supervisor/PH_NAME.log redirect_stderr=true
рд╡рд╣ рд╕рдм рдЬреЛ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рджреВрд╕рд░реЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ:

рдирд┐рдпрдд рд╕рдордп
рджреЗрд╡ рдФрд░ рдареЗрд╕ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдмрджрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд╛рдо рдореЗрдВ рдПрдХ рдкреНрд░рддреНрдпрдп рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (
12 рдХрд╛рд░рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ ) рд╣рдо рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗ, рд╣рдо рдмрд╛рдХреА рдХреА рдирдХрд▓ рдХрд░реЗрдВрдЧреЗред
prod_deploy: environment: TARGET_IP: 0.0.0.0 TARGET_DIR: /var/www/deploy-user/go-example REMOTE_USER: deploy-user SERVICE_NAME: go_example_prod docker: - image: circleci/golang:1.12 working_directory: ~/go-example/ steps: - checkout - add_ssh_keys # ci , - run: go build -ldflags "-X main.version=$CIRCLE_TAG" -o ./main ./src/main - run: ssh -o "StrictHostKeyChecking=no" $REMOTE_USER@$TARGET_IP "mkdir $TARGET_DIR/v$CIRCLE_TAG" # , - run: scp main $REMOTE_USER@$TARGET_IP:$TARGET_DIR/v$CIRCLE_TAG/ # - run: sed "s/PH_NAME/$SERVICE_NAME/g" .circleci/supervisor_ph.conf > .circleci/$SERVICE_NAME.conf - run: echo command=$TARGET_DIR/v$CIRCLE_TAG/main >> .circleci/$SERVICE_NAME.conf - run: scp .circleci/$SERVICE_NAME.conf $REMOTE_USER@$TARGET_IP:$TARGET_DIR/v$CIRCLE_TAG/ - run: ssh $REMOTE_USER@$TARGET_IP "ln -sf $TARGET_DIR/v$CIRCLE_TAG/$SERVICE_NAME.conf /etc/supervisord.d" - run: ssh $REMOTE_USER@$TARGET_IP "supervisorctl -c /etc/supervisord.conf reread && supervisorctl -c /etc/supervisord.conf update" - run: curl "$TELEGRAM_SERVICE?msg=$SERVICE_NAME%20v$CIRCLE_TAG%20deployed&channel=go_deploy"
рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдмреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдХрд░реНрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред `рдЬрдм: on_fail` рдХрдорд╛рдВрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдорд╛рдирдХ рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╕реНрд▓реИрдХ, рдЖрдИрдЖрд░рд╕реАред рдкреНрд▓рд╕ рддреНрд░реБрдЯрд┐ рд╕реВрдЪрдирд╛рдПрдВ рдИрдореЗрд▓ рдкрд░ рдЬрд╛рддреА рд╣реИрдВред
`$ TELEGRAM_SERVICE` рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ BUILD SETTINGS тЖТ рдПрдиреНрд╡рд╛рдпрд░рдореЗрдВрдЯ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
- run: command: curl "$TELEGRAM_SERVICE?msg=$SERVICE_NAME%20v$CIRCLE_TAG%20failed&channel=go_deploy" when: on_fail
рдлрд┐рдирд┐рд╢ рд▓рд╛рдЗрди
рд╣рдо рдЧрд┐рддреБрдм рдпрд╛ рдмрд┐рдЯрдмрдХреЗрдЯ рдореЗрдВ рдзрдХреНрдХрд╛ рджреЗрддреЗ рд╣реИрдВред рд╣рдо рдЖрдЗрдЯрдо рдЬреЛрдбрд╝реЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рд░реНрдХрд┐рд▓рд╕реАрдЖрдИ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж

рдлрд┐рд░ рд╕реНрдЯрд╛рд░реНрдЯ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЕрдВрддрд┐рдо рдЪрд░рдг рдЪрдпрдирд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рддрд╣рдд рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ ssh рдХреБрдВрдЬреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рд╕рдм рдХреБрдЫ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдЯреИрдЧ рд▓рдЧрд╛рдУ рдФрд░ рдЬреАрд╡рди рдХрд╛ рдЖрдирдВрдж рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд░реЛред рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг ./.circleci/config.yml -
рдпрд╣рд╛рдБ