Skip to content

Commit e1a5747

Browse files
Merge pull request #1 from luislrl/develop
Develop
2 parents f96feb9 + a851629 commit e1a5747

17 files changed

Lines changed: 830 additions & 1 deletion

.github/workflows/ci-cd.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
name: Deploy na AWS (ECS)
2+
3+
on:
4+
push:
5+
branches: [ main ]
6+
7+
env:
8+
AWS_REGION: ${{ secrets.AWS_REGION }}
9+
ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPOSITORY_URI }}
10+
ECS_SERVICE: ${{ secrets.ECS_SERVICE_NAME }}
11+
ECS_CLUSTER: ${{ secrets.ECS_CLUSTER_NAME }}
12+
ECS_TASK_DEFINITION: ${{ secrets.ECS_TASK_DEFINITION_FAMILY }}
13+
CONTAINER_NAME: ${{ secrets.CONTAINER_NAME }}
14+
15+
jobs:
16+
deploy:
17+
runs-on: ubuntu-latest
18+
19+
steps:
20+
- name: Checkout do código
21+
uses: actions/checkout@v4
22+
23+
- name: Configurar credenciais AWS
24+
uses: aws-actions/configure-aws-credentials@v4
25+
with:
26+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
27+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
28+
aws-region: ${{ env.AWS_REGION }}
29+
30+
- name: Login no Amazon ECR
31+
id: login-ecr
32+
uses: aws-actions/amazon-ecr-login@v2
33+
34+
- name: Build, tag, e push da imagem para o ECR
35+
id: build-image
36+
run: |
37+
IMAGE_TAG=${{ github.sha }}
38+
docker build -f Dockerfile.emulator -t $ECR_REPOSITORY:$IMAGE_TAG .
39+
docker push $ECR_REPOSITORY:$IMAGE_TAG
40+
echo "image=$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
41+
42+
- name: Renderizar a nova Task Definition do ECS
43+
id: render-task-def
44+
uses: aws-actions/amazon-ecs-render-task-definition@v1
45+
with:
46+
task-definition: task-definition.json
47+
container-name: ${{ env.CONTAINER_NAME }}
48+
image: ${{ steps.build-image.outputs.image }}
49+
50+
- name: Fazer deploy da Task Definition no ECS
51+
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
52+
with:
53+
task-definition: ${{ steps.render-task-def.outputs.task-definition }}
54+
service: ${{ env.ECS_SERVICE }}
55+
cluster: ${{ env.ECS_CLUSTER }}
56+
wait-for-service-stability: true

.gitignore

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Prerequisites
2+
*.d
3+
4+
# Compiled Object files
5+
*.slo
6+
*.lo
7+
*.o
8+
*.obj
9+
10+
# Precompiled Headers
11+
*.gch
12+
*.pch
13+
14+
# Linker files
15+
*.ilk
16+
17+
# Debugger Files
18+
*.pdb
19+
20+
# Compiled Dynamic libraries
21+
*.so
22+
*.dylib
23+
*.dll
24+
25+
# Fortran module files
26+
*.mod
27+
*.smod
28+
29+
# Compiled Static libraries
30+
*.lai
31+
*.la
32+
*.a
33+
*.lib
34+
35+
# Executables
36+
*.exe
37+
*.out
38+
*.app
39+
40+
# debug information files
41+
*.dwo

.vscode/settings.json

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{
2+
"files.associations": {
3+
"algorithm": "cpp",
4+
"atomic": "cpp",
5+
"bit": "cpp",
6+
"cctype": "cpp",
7+
"charconv": "cpp",
8+
"chrono": "cpp",
9+
"clocale": "cpp",
10+
"cmath": "cpp",
11+
"compare": "cpp",
12+
"concepts": "cpp",
13+
"csignal": "cpp",
14+
"cstddef": "cpp",
15+
"cstdint": "cpp",
16+
"cstdio": "cpp",
17+
"cstdlib": "cpp",
18+
"cstring": "cpp",
19+
"ctime": "cpp",
20+
"cwchar": "cpp",
21+
"exception": "cpp",
22+
"format": "cpp",
23+
"forward_list": "cpp",
24+
"initializer_list": "cpp",
25+
"iomanip": "cpp",
26+
"ios": "cpp",
27+
"iosfwd": "cpp",
28+
"iostream": "cpp",
29+
"istream": "cpp",
30+
"iterator": "cpp",
31+
"limits": "cpp",
32+
"locale": "cpp",
33+
"map": "cpp",
34+
"memory": "cpp",
35+
"mutex": "cpp",
36+
"new": "cpp",
37+
"optional": "cpp",
38+
"ostream": "cpp",
39+
"ratio": "cpp",
40+
"sstream": "cpp",
41+
"stdexcept": "cpp",
42+
"stop_token": "cpp",
43+
"streambuf": "cpp",
44+
"string": "cpp",
45+
"system_error": "cpp",
46+
"thread": "cpp",
47+
"tuple": "cpp",
48+
"type_traits": "cpp",
49+
"typeinfo": "cpp",
50+
"utility": "cpp",
51+
"vector": "cpp",
52+
"xfacet": "cpp",
53+
"xiosbase": "cpp",
54+
"xlocale": "cpp",
55+
"xlocbuf": "cpp",
56+
"xlocinfo": "cpp",
57+
"xlocmes": "cpp",
58+
"xlocmon": "cpp",
59+
"xlocnum": "cpp",
60+
"xloctime": "cpp",
61+
"xmemory": "cpp",
62+
"xstddef": "cpp",
63+
"xstring": "cpp",
64+
"xtr1common": "cpp",
65+
"xtree": "cpp",
66+
"xutility": "cpp"
67+
}
68+
}

Dockerfile.emulator

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Build (Compilação)
2+
FROM gcc:latest AS builder
3+
4+
WORKDIR /app
5+
RUN mkdir bin
6+
COPY src/ .
7+
8+
# Compila
9+
RUN for f in *.cpp; do g++ "$f" -static -o "bin/${f%.cpp}"; done
10+
11+
# Execução
12+
FROM debian:stable-slim
13+
14+
# Instala dos2unix para corrigir formatação de linha do Windows
15+
RUN apt-get update && apt-get install -y dos2unix && rm -rf /var/lib/apt/lists/*
16+
17+
WORKDIR /app
18+
COPY --from=builder /app/bin/ .
19+
# COPIA O SCRIPT para dentro da imagem
20+
COPY emulator.sh .
21+
22+
# CORRIGE O FORMATO DO SCRIPT e dá permissão de execução
23+
RUN dos2unix emulator.sh
24+
RUN chmod +x emulator.sh
25+
26+
CMD ["./emulator.sh"]

Dockerfile.script

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Build (Compilação)
2+
FROM gcc:latest AS builder
3+
4+
WORKDIR /app
5+
RUN mkdir bin
6+
COPY src/ .
7+
8+
# Compila
9+
RUN for f in *.cpp; do g++ "$f" -static -o "bin/${f%.cpp}"; done
10+
11+
# Execução
12+
FROM debian:stable-slim
13+
14+
WORKDIR /app
15+
COPY --from=builder /app/bin/ .
16+
17+
CMD ["./deadlock"]

README.md

Lines changed: 152 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,152 @@
1-
# runtime-errors-emulator
1+
# Runtime Error Emulator
2+
3+
Este projeto é um ambiente controlado para simular e estudar diferentes tipos de erros de programação em C++, como `Segmentation Fault`, `Stack Overflow`, `Deadlock`, entre outros. Ele utiliza Docker para criar um ambiente de execução isolado e consistente.
4+
5+
O emulador pode ser usado de duas formas principais:
6+
7+
1. **Modo Script (Host):** Um script no seu computador que lança um contêiner descartável para cada erro.
8+
2. **Modo Interativo (Contêiner):** Um contêiner que, ao ser iniciado, apresenta um menu para você escolher qual erro simular internamente.
9+
3. **Modo Automatizado (All-in-One):** O método mais simples e recomendado. Um único script (run.sh) constrói a imagem e executa o contêiner com todas as configurações necessárias.
10+
11+
-----
12+
13+
## Pré-requisitos
14+
15+
* [Docker](https://www.docker.com/products/docker-desktop/) instalado e em execução.
16+
* Um ambiente de terminal compatível com `bash`.
17+
* `git` para clonar o repositório.
18+
19+
-----
20+
21+
## Construção das Imagens
22+
23+
Antes de executar, você precisa construir a imagem Docker. Escolha o modo de operação que deseja usar.
24+
25+
### Modo 1: Script no Host
26+
27+
Esta imagem contém apenas os programas compilados. O script `error_emulator.sh` no seu computador irá gerenciá-la.
28+
29+
```bash
30+
docker build -t meus-programas-cpp .
31+
```
32+
33+
*(Este comando usa o `Dockerfile` padrão)*
34+
35+
### Modo 2: Menu Interativo no Contêiner
36+
37+
Esta imagem contém os programas compilados e também o script de menu, que é definido como o ponto de entrada principal.
38+
39+
```bash
40+
# este comando usa o Dockerfile.emulator para criar a imagem completa
41+
docker build -f Dockerfile.emulator -t error_emulator .
42+
```
43+
44+
*(Note que usamos `-f Dockerfile.emulator` para especificar o arquivo de build)*
45+
46+
-----
47+
48+
## Execução e Uso
49+
50+
### Modo 1: Usando o Script no Host
51+
52+
Este modo é ideal para executar erros específicos de forma rápida e isolada, sem o menu.
53+
54+
1. **Execute o erro desejado:**
55+
```bash
56+
docker run --rm -it error_emulator ./deadlock
57+
```
58+
*(Substitua `./deadlock` pelo executável do erro que deseja testar)*
59+
60+
### Modo 2: Usando o Menu Interativo no Contêiner
61+
Este modo é para quem deseja iniciar o contêiner manualmente. É útil para entender os passos que o script `run.sh` automatiza.
62+
63+
1. **Inicie o contêiner com as configurações necessárias:**
64+
```bash
65+
docker run -it --rm --privileged error_emulator bash -c "echo 'core' > /proc/sys/kernel/core_pattern && ulimit -c unlimited && ./emulator.sh"
66+
```
67+
Este comando longo é necessário para:
68+
* `--privileged`: Dar permissão para alterar configurações do sistema.
69+
* `echo ...`: Configurar onde o `core dump` será salvo.
70+
* `ulimit ...`: Permitir a criação de `core dumps`.
71+
* `./emulator.sh`: Iniciar o menu.
72+
73+
O menu aparecerá imediatamente, sendo executado de dentro do próprio contêiner. Para parar a simulação e o contêiner, escolha a opção `q` no menu.
74+
75+
-----
76+
77+
### Modo 3: Fluxo de Trabalho Automatizado (All-in-One)
78+
79+
Este modo é a forma mais simples e profissional de executar a demonstração completa de erros que exigem permissões especiais, como o `core_dumped`. Ele automatiza a construção e a execução do contêiner, além da configuração interna necessária, em um único comando.
80+
81+
#### O Script "run.sh"
82+
83+
O script `run.sh` automatiza todo o processo:
84+
85+
```bash
86+
# este é o script que automatiza todo o processo.
87+
88+
# --- etapa 1: Construir a Imagem Docker ---
89+
# o script primeiro garante que a imagem 'emulator' está construída e atualizada.
90+
echo "--> Etapa 1/2: Construindo/Verificando a imagem Docker 'emulator'..."
91+
docker build -f Dockerfile.emulator -t error_emulator . > /dev/null
92+
93+
# verifica se a construção da imagem falhou
94+
if [ $? -ne 0 ]; then
95+
echo "ERRO: A construção da imagem Docker falhou. Abortando."
96+
exit 1
97+
fi
98+
99+
# --- etapa 2: executar o contêiner com todos os comandos necessários ---
100+
# agora, ele inicia o contêiner e passa uma única "super-string" de comandos
101+
# para serem executados lá dentro, em ordem.
102+
echo "--> Etapa 2/2: Iniciando o contêiner e o emulador..."
103+
docker run -it --rm --privileged error_emulator bash -c " \
104+
echo 'core' > /proc/sys/kernel/core_pattern && \
105+
ulimit -c unlimited && \
106+
./emulator.sh \
107+
"
108+
109+
echo "--> Emulador finalizado."
110+
```
111+
112+
#### Como Usar este Modo
113+
114+
1. Dê permissão de execução ao script `run.sh` e `emulator.sh`: `chmod +x run.sh && chmod +x emulator.sh`
115+
2. Execute o script para rodar o contêiner: `./run.sh`
116+
117+
#### Verificação do Core Dump
118+
119+
Para verificar a criação do arquivo `core` após a falha, siga estes passos em um segundo terminal:
120+
121+
* Liste os contêineres em execução: `docker ps`
122+
* Pegue o ID do seu contêiner.
123+
* Entre no contêiner usando o ID obtido: `docker exec -it <ID_DO_CONTAINER> bash`
124+
* Dentro do contêiner, verifique a existência do arquivo `core`: `ls core`
125+
126+
-----
127+
128+
## Contribuições da Equipe
129+
130+
Este projeto foi desenvolvido em equipe, com as seguintes responsabilidades:
131+
132+
* **Rauana Carvalho:**
133+
* Implementação do `buffer_overflow`
134+
* Implementação do `core_dumped`
135+
* Implementação do `deadlock`
136+
* Criação do script de automação (`run.sh`)
137+
* Elaboração da documentação (`README.md`)
138+
139+
* **Luís Eduardo Rocha:**
140+
* Implementação do `memory_leak`
141+
* Implementação do `race_condition`
142+
* Implementação do `stack_overflow`
143+
* Criação do repositório no GitHub
144+
145+
* **Rômulo Duarte:**
146+
* Implementação do `segmentation_fault`
147+
* Estruturação de pastas do projeto
148+
* Configuração do ambiente Docker (`Dockerfile`)
149+
* Criação do menu
150+
151+
* **Luís & Rômulo:**
152+
* Configuração do pipeline de CI/CD (GitHub Actions e AWS)

0 commit comments

Comments
 (0)