Layout para projeto de estimação no VPS

Olá Habr! Meu nome é Artyom Zheltak , sou chefe de equipe e também professor do curso "Golang Developer" na OTUS. Antecipando o início de um novo fluxo do curso , quero compartilhar meu artigo com você.


Acredito que Golang é ótimo, mas ainda existem muitos projetos php e outros trabalhando em VPS, VDS no mundo. Você pode colocar o docker lá, mas isso (de acordo com o autor) é uma re-complicação da tarefa. Você pode compilar um arquivo e fazer o upload via FTP - é inseguro e não é feng shui, o SFTP é mais seguro, mas não o feng shui novamente. Então vamos automatizar esse processo através do CircleCI . Escreveremos o arquivo de configuração para o CI passo a passo; no final, coletaremos o resultado e executaremos o deploy.




Requisitos de implementação


  1. Inovações mínimas de servidor
  2. A implantação deve ser automatizada
  3. O ponto de entrada para a implantação é a marcação para o assembly de desenvolvimento e a confirmação manual adicional para prod
  4. O conjunto deve passar no teste automático
  5. Versão manual do mecanismo de reversão

Porquê CircleCI?


Desde o início, o projeto usou um repositório de bitbucket privado. (Agora os repositórios privados já estão no github.) Sem sair do ecossistema, a Atlasian decidiu usar o CircleCI (a seguir designado por CI). Eu gostei disso:

  • configuração mínima
  • recurso de depuração ssh
  • versão gratuita, mas com limitações
    • 2500 créditos / por semana (aproximadamente 250 minutos de conclusão) #go são coletados e implantados rapidamente, temos o suficiente
    • execução de thread único # não temos muitos projetos de estimação
    • somente linux e windows # precisamos do linux

Parte um, fluxo de trabalho


Crie uma pasta .circle e crie um arquivo config.yml nela e descreva o fluxo de trabalho esperado (a ordem de execução da tarefa)

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 

Aqui está o resultado:

imagem

Descrevemos um padrão de acordo com o qual cada confirmação será verificada primeiro por testes, depois implementada no dev e, em seguida, com confirmação manual, enviada ao servidor de batalha. Para orientar o brilho, adicione um filtro para que a tarefa funcione apenas por marca.

 - dev_deploy: requires: - test filters: branches: ignore: /.*/ tags: only: /.*/ 

O segundo passo, o mais fácil


Vamos começar executando os testes, haverá um mínimo de código.

 jobs: test: docker: - image: circleci/golang:1.12 working_directory: ~/go-example/ steps: - checkout #   linter'   - run: go test -cover -v ./... 

Depois que nosso código for testado e aprovado nas verificações de estilo de código, você poderá implantar no dev. Sugiro usar o supervisor (versão 3.1.4 no momento da redação) para iniciar o serviço go, coletaremos logs para eles.

Adicione o arquivo supervisor_ph.conf à pasta .circleci. Na estrutura do CI PH_NAME, ele mudará para o nome do projeto. E no mesmo arquivo, escreveremos a saída dos logs.

 [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 

Tudo isso distingue nosso projeto dos outros:



Tempo de implantação


Para dev e prod, apenas os servidores são alterados e um sufixo é adicionado ao nome do aplicativo. A configuração é armazenada em variáveis ​​de ambiente. ( Aplicações de 12 fatores ) Tiraremos essa parte do ambiente, duplicaremos o restante.

 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" 

Para notificações, usamos nosso próprio bot, chamado através de curl. O comando `when: on_fail` funciona se algo der errado, também pode ser usado para reverter as alterações. Embora tenhamos esse bot de telegrama, mas em geral você pode ficar sem ele e usar as notificações padrão: Slack, IRC. Além disso, as notificações de erro vão para o e-mail.

A variável `$ TELEGRAM_SERVICE` é adicionada na seção BUILD SETTINGS → Environment Variables.

 - run: command: curl "$TELEGRAM_SERVICE?msg=$SERVICE_NAME%20v$CIRCLE_TAG%20failed&channel=go_deploy" when: on_fail 

Linha de chegada


Nós pressionamos o github ou o bitbucket. Depois vamos ao CircleCI no item Adicionar projeto



Em seguida, selecione Iniciar construção. A etapa final será adicionar uma chave ssh para autorização no servidor sob o usuário selecionado.



Tudo pode ser feito para implantar, colocar uma etiqueta e começar a aproveitar a vida. A versão final ./.circleci/config.yml - aqui

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


All Articles