paint-brush
Como criar um pipeline de CI/CD usando GitHub e AWS EC2por@wesleybaxterhuber
1,385 leituras
1,385 leituras

Como criar um pipeline de CI/CD usando GitHub e AWS EC2

por Wes Huber6m2024/04/30
Read on Terminal Reader

Muito longo; Para ler

Essa técnica essencialmente permite que seu servidor EC2 responda às alterações enviadas ao seu repositório Github.
featured image - Como criar um pipeline de CI/CD usando GitHub e AWS EC2
Wes Huber HackerNoon profile picture

Olá a todos, hoje quero fazer um tutorial sobre uma das minhas maneiras favoritas de implantar uma API REST rápida, usando NodeJS/Express, em um servidor Amazon EC2. Essa técnica essencialmente permite que seu servidor EC2 responda às alterações enviadas ao seu repositório GitHub.

Primeiras coisas primeiro, “Olá, mundo”

Crie um novo diretório em sua máquina para que um aplicativo NodeJS/Express funcione. Estou chamando meu rekognition


Abra um terminal e execute este comando para inicializar um package.json npm init -y


Instale express.js npm i express


Crie um servidor expresso básico com um 'olá mundo' na rota padrão

 const express = require('express'); const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); });

Teste para ter certeza de que está vendo 'Hello World!' em http://localhost:3000/


Bom trabalho, primeiro passo concluído! 💪

A seguir, vamos enviar nosso código para o GitHub

Inicialize um repositório Git em seu diretório e faça seu primeiro commit —

 git init git add . git commit -m "First commit"


Crie um repositório remoto em sua conta GitHub

Adicione o novo repositório como origem e envie seu branch.

 git remote add origin <REMOTE_REPOSITORY_URL> git push -u origin master


Substitua <REMOTE_REPOSITORY_URL> pelo link para o repositório remoto que você acabou de criar.


Pode ser necessário alterar as configurações do repositório para usar 'master' como branch padrão em vez de 'main'.

Depois de fazer isso, você pode excluir o branch 'principal'.


Etapa 2: concluir! Estamos cozinhando com gás ⛽️

Vamos para a nuvem — Configure o servidor Ec2

Aqui estão as etapas para iniciar sua instância EC2:



  • Navegue até o painel do EC2 e execute uma nova instância.

  • Escolha uma AMI (Amazon Machine Image) apropriada; Estou usando o Amazon Linux 2.


  • Selecione um tipo de instância (por exemplo, t2.micro se você estiver no nível gratuito).


  • Configure detalhes da instância, adicione armazenamento e adicione tags conforme necessário.


  • Configure um grupo de segurança para permitir o tráfego de entrada nas portas necessárias (pelo menos a porta TCP 22 para SSH e a porta do seu aplicativo e, em seguida, 3000 para tráfego da Web).


  • Revise e execute a instância; certifique-se de salvar o par de chaves usado para acesso SSH.


Agora, vamos testar o login no seu servidor via SSH em um terminal:

ssh ec2-user@<YOUR_SERVER_IP> -i <YOUR_PRIVATE_KEY>.pem


Substitua as variáveis pelos valores que você definiu para sua instância EC2.

Se você vir isso, você se conectou ao seu servidor, parabéns! 👏

Ainda não terminamos - estamos apenas começando 😏

Vamos instalar o NodeJS em nosso servidor:
sudo yum install -y nodejs


Instale o pm2 globalmente em nosso servidor via npm

sudo npm i -g pm2


Instale o git no servidor e configure suas credenciais:

sudo yum install git -y

 git config --global user.name "Your Name" git config --global user.email "[email protected]"


Ok, agora vamos criar uma pasta var/www/ se ela ainda não existir:

sudo mkdir -p /var/www


Em seguida, adicione propriedade ao nosso usuário ec2:

sudo chown -R ec2-user:ec2-user /var/www


Navegue até o diretório da raiz do seu servidor - não a pasta /home people 👌 cd ~/var/www


Agora, a partir daqui, clonaremos nosso repositório git: git clone https://github.com/USERNAME/REPO_NAME.git YOUR_PROJECT_DIRECTORY

Substitua [USERNAME] [REPO_NAME] e [YOUR_PROJECT_DIRECTORY] pelos seus próprios valores.


Em seguida, alteramos o diretório para nosso repositório, para que cd YOUR_PROJECT_DIRECTORY possa criar o arquivo ecosystem.config.js para nossa configuração pm2:

nano ecosystem.config.js


Se parece com isso:

 module.exports = { apps : [{ name: "my-app", // A name for your application script: "app.js", // The script file to launch the app instances: "max", // This can be set to the number of CPU cores to use, or "max" to use all available autorestart: true, // Automatically restart app if it crashes watch: false, // Enable/disable watching file changes for automatic restart max_memory_restart: '1G', // Optional: Restart app if it reaches a memory limit env: { NODE_ENV: "development", }, env_production: { NODE_ENV: "production", } }] };

Feijão legal, ok - depois de criado e salvo, vamos iniciar o aplicativo com pm2:

pm2 start ecosystem.config.js


Agora podemos verificar se temos um 'Hello World!' do nosso servidor na porta 3000:

Para fazer o pm2 iniciar automaticamente na reinicialização do servidor, vamos executar:

 pm2 save pm2 startup

Para verificar se o seu servidor está funcionando, você pode fazer pm2 status ; você pode ler os documentos no pm2 aqui


Se você chegou até aqui, você é uma estrela ⭐️

Integração com ações do GitHub

Esta é a última etapa do nosso processo. Vamos criar um arquivo .yml para ações do Github para atualizar nosso servidor sempre que uma alteração for enviada para nosso branch master

No seu repositório, vá para a aba ‘Ações’ e crie um novo fluxo de trabalho personalizado. Estou chamando meu nodejs.yml


Aqui está o arquivo .yml para atualizar o repositório e reiniciar o pm2:

 name: Node.js CI/CD on Amazon Linux on: push: branches: [ master ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install dependencies run: npm install - name: Deploy to AWS EC2 uses: appleboy/scp-action@master with: host: ${{ secrets.REMOTE_HOST }} username: ${{ secrets.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} source: "./" # This now correctly points to the current directory target: "/var/www/your_project_directory" - name: Restart PM2 application uses: appleboy/ssh-action@master with: host: ${{ secrets.REMOTE_HOST }} username: ${{ secrets.REMOTE_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /var/www/your_project_directory pm2 reload all # This command restarts your application

Certifique-se de atualizar 'your_project_directory'


Por último, você precisará adicionar esses segredos de ambiente. REMOTE_HOST este é o endereço IP do seu servidor; REMOTE_USER este é ec2-user para Amazon Linux 2 AMI e, em seguida, cole o conteúdo do seu arquivo .pem como SSH_PRIVATE_KEY


Você pode fazer tudo isso nas configurações do repositório:

É isso! Terminamos, sim 😁


Você pode testar tudo isso alterando a mensagem 'Hello World' e enviando essa alteração para seu branch master; então você deverá ver a atualização em http://your.ip.address:3000


É um pouco complicado de configurar, mas quando você está desenvolvendo, é muito bom ter um pipeline de CI/CD fácil implantando automaticamente alterações em seu servidor REST API. Dessa forma, você pode implantar rapidamente as alterações ao vivo e vê-las no front-end do seu aplicativo web/móvel.


Deixe-me saber se isso foi útil nos comentários e obrigado pela leitura!!


Paz,

- Wes