Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: ci-cd
on:
push:
branches: ["main"]
workflow_dispatch:

jobs:
ci:
runs-on: ubuntu-latest
steps:
- name: Obter codigo
uses: actions/checkout@v4.2.2

- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Construir e enviar da imagem Docker
uses: docker/build-push-action@v6
with:
context: ./src
push: true
file: ./src/Dockerfile
# tags: user/app:latest
tags: |
eliemarbueno/fake-shop:v${{ github.run_number }}
eliemarbueno/fake-shop:latest

cd:
needs: [ci]
runs-on: ubuntu-latest
steps:
- name: Obter codigo
uses: actions/checkout@v4.2.2

- name: Configurar o kubeconfig
uses: azure/k8s-set-context@v4
with:
method: kubeconfig
kubeconfig: ${{ secrets.K8S_KUBECONFIG }}

- name: Executar o Deploy
uses: azure/k8s-deploy@v5
with:
manifests:
k8s/deployment.yaml
images:
eliemarbueno/fake-shop:v${{ github.run_number }}
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,30 @@ DB_PASSWORD => Senha do usuário do banco de dados PostgreSQL.
DB_NAME => Nome do banco de dados PostgreSQL.

DB_PORT => Porta de conexão com o banco de dados PostgreSQL.


Código utilizado no evento "Desafio DevOps & Cloud".

#### Este código fonte possui um processo de automação CI-CD simplificado.


### Passos para configuração do deploy automatizado / execução do CI-CD por GitHub Actions:

1. Obter dados que serão utilziados na secrets:
- Obter o arquivo de configurações do kubernetes do seu projeto no Digital Ocean;
- Obter seu usuário de acesso ao DockerHub;
- Obter sua senha de acesso ao DockerHub;
1. Definir / configurar suas secrets que serão utilziadas no GitHub Actions:
- Entrando na configuração deste repositorio, vamos em "Settings" -> "Secrets and Variables" -> "Repository secrets" e clicar no botão "New repository secret" e preencher os dados para cada secret conforme descrito abaixo;
- Preencha em "Name" o nome da secret e em "Secret" o conteúdo protegido.
- Teremos 3 secrets inicialmente:


| **Name** | Secret |
|------------------|---------------|
| DOCKERHUB_USERNAME | Usuáiro para login no DockerHub. |
| DOCKERHUB_TOKEN** | Senha para login no DockerHub. |
| K8S_KUBECONFIG** | Arquivo de configuração do kubernetes. |


3. Ao fazer um commit de um arquivo na branch main, teremos um processo de CI-CD sendo iniciado.
107 changes: 107 additions & 0 deletions k8s/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# postgresql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
labels:
app: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:latest
ports:
- containerPort: 5432
env:
- name: POSTGRES_USER
value: ecommerce
- name: POSTGRES_PASSWORD
value: Pg1234
- name: POSTGRES_DB
value: ecommerce
# Melhorando a configuração do postgres
readinessProbe:
exec:
command: ["pg_isready", "-U", "ecommerce"]
initialDelaySeconds: 5
periodSeconds: 10
---
# postgresql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: postgres
spec:
selector:
app: postgres
ports:
- port: 5432
targetPort: 5432
type: ClusterIP # Apenas visível dentro do cluster

---
# app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: fake-shop
labels:
app: fake-shop
spec:
replicas: 2
selector:
matchLabels:
app: fake-shop
template:
metadata:
labels:
app: fake-shop
spec:
containers:
- name: fake-shop
# image: eliemarbueno/fake-shop:v1
#image: fabricioveronez/fake-shop-desafio:v1
image: eliemarbueno/fake-shop:latest
ports:
- containerPort: 5000
env:
- name: DB_HOST
value: postgres
- name: DB_USER
value: ecommerce
- name: DB_PASSWORD
value: Pg1234
- name: DB_NAME
value: ecommerce
- name: FLASK_APP
value: index.py
# - name: DB_PORT
# value: "5432"
# Adicionando retry logic para esperar o postgres iniciar
# lifecycle:
# postStart:
# exec:
# command: ["/bin/sh", "-c", "sleep 15"] # Dando tempo para o postgres iniciar completamente

---
# app-service.yaml
apiVersion: v1
kind: Service
metadata:
name: fake-shop
spec:
selector:
app: fake-shop
ports:
- port: 80
targetPort: 5000
nodePort: 30000
type: LoadBalancer # Permite acesso externo via nodePort
4 changes: 2 additions & 2 deletions src/templates/shared/nav-bar.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<div class="col-lg-4">
<a href="/" class="text-decoration-none">
<span class="h1 text-uppercase text-primary bg-dark px-2">Fake</span>
<span class="h1 text-uppercase text-dark bg-primary px-2 ml-n1">Shop</span>
<span class="h1 text-uppercase text-dark bg-primary px-2 ml-n1">Shop (Vx1)</span>
</a>
</div>
</div>
Expand All @@ -19,7 +19,7 @@
<!-- Logo para dispositivos pequenos -->
<a href="/" class="text-decoration-none d-block d-lg-none">
<span class="h1 text-uppercase text-dark bg-light px-2">Fake</span>
<span class="h1 text-uppercase text-light bg-primary px-2 ml-n1">Shop</span>
<span class="h1 text-uppercase text-light bg-primary px-2 ml-n1">Shop (Vx1)</span>
</a>

<!-- Botão de colapso para dispositivos menores -->
Expand Down