Skip to content

Commit

Permalink
Merge pull request #250 from unb-mds/Development
Browse files Browse the repository at this point in the history
Development
  • Loading branch information
BrunoBReis authored Aug 23, 2024
2 parents 3f52b20 + 6b1bb37 commit 040ba0e
Show file tree
Hide file tree
Showing 46 changed files with 1,768 additions and 761 deletions.
20 changes: 20 additions & 0 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,26 @@ jobs:
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
- name: Install PostgreSQL
run: |
sudo apt-get update
sudo apt-get install -y postgresql postgresql-contrib
- name: Start PostgreSQL
run: |
sudo service postgresql start
- name: Configure PostgreSQL
run: |
sudo -u postgres psql -c "CREATE DATABASE forunb_db;"
sudo -u postgres psql -c "CREATE USER forunb WITH PASSWORD 'balao123';"
sudo -u postgres psql -c "ALTER USER forunb CREATEDB;"
sudo -u postgres psql -c "ALTER ROLE forunb SET client_encoding TO 'utf8';"
sudo -u postgres psql -c "ALTER ROLE forunb SET default_transaction_isolation TO 'read committed';"
sudo -u postgres psql -c "ALTER ROLE forunb SET timezone TO 'UTC';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE forunb_db TO forunb;"
- name: Configure enviroment
run: make config

Expand Down
57 changes: 35 additions & 22 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,31 @@ Os workflows são arquivos de configuração que definem um conjunto de ações

## CI

Este fluxo de trabalho do GitHub Actions é acionado em eventos de push para o branch `main` e pull requests. Ele consiste em um único job chamado `u-tests` que é executado na versão mais recente do Ubuntu.
Este fluxo de trabalho do GitHub Actions é acionado em eventos de push para o branch `main` e em pull requests. Ele executa testes unitários em uma matriz de versões do Python.

### Job: u-tests

O job `u-tests` usa uma matriz de estratégia para especificar a versão do Python a ser usada. Neste caso, está definido como `3.10`.
O job `u-tests` é responsável por configurar o ambiente necessário e executar os testes unitários do projeto.

### Steps

1. **Checkout projeto**: Esta etapa faz o checkout do repositório usando a ação `actions/checkout`.
1. **Checkout do projeto**: Esta etapa faz o checkout do repositório usando a ação `actions/checkout`.

2. **Configurar Python ${{ matrix.python-version }}**: Esta etapa configura a versão do Python definida na matriz, utilizando a ação `actions/setup-python`.

2. **Configurar Python**: Esta etapa configura a versão especificada do Python usando a ação `actions/setup-python`.
3. **Cache do pip**: Esta etapa armazena em cache os pacotes instalados pelo pip, para acelerar as execuções subsequentes. A chave do cache é gerada a partir do sistema operacional do runner e do hash do arquivo `requirements.txt`.

3. **Cache pip**: Esta etapa armazena em cache as dependências do pip usando a ação `actions/cache`. A chave de cache é gerada com base no sistema operacional e no hash do arquivo `requirements.txt`.
4. **Instalar dependências**: Nesta etapa, o pip é atualizado e as dependências do projeto são instaladas a partir do arquivo `requirements.txt`.

4. **Instalar dependências**: Esta etapa instala as dependências do projeto executando o comando `pip install`.
5. **Instalar PostgreSQL**: Esta etapa instala o PostgreSQL no ambiente de execução.

5. **Configurar ambiente**: Esta etapa configura o ambiente executando o comando `make config`.
6. **Iniciar PostgreSQL**: Esta etapa inicia o serviço do PostgreSQL.

6. **Testes**: Esta etapa executa os testes usando o comando `python ./forunb/manage.py test forunb`.
7. **Configurar PostgreSQL**: Nesta etapa, o banco de dados e o usuário necessários para os testes são criados e configurados no PostgreSQL.

8. **Configurar ambiente**: Esta etapa executa o comando `make config` para configurar o ambiente necessário para os testes.

9. **Executar testes**: Finalmente, esta etapa executa os testes unitários do projeto usando o comando `python ./forunb/manage.py test forunb`.

## Docs Deploy

Expand Down Expand Up @@ -55,45 +60,53 @@ O job `deploy` é responsável por realizar o deploy da documentação utilizand

## Pylint

Este fluxo de trabalho do GitHub Actions é acionado em eventos de push para o branch `main` e pull requests. Ele consiste em um único job chamado `lint` que é executado na versão mais recente do Ubuntu.
Este fluxo de trabalho do GitHub Actions é acionado em eventos de push para o branch `main` e em pull requests. Ele executa a verificação de linting do código Python utilizando o Pylint.

### Job: lint

O job `lint` usa uma matriz de estratégia para especificar a versão do Python a ser usada. Neste caso, está definido como `3.10`.
O job `lint` é responsável por verificar a qualidade do código Python utilizando o Pylint.

### Steps

1. **Checkout do repositório**: Esta etapa faz o checkout do repositório usando a ação `actions/checkout`.

2. **Configurar Python**: Esta etapa configura a versão especificada do Python usando a ação `actions/setup-python`.
2. **Configurar Python ${{ matrix.python-version }}**: Esta etapa configura a versão do Python definida na matriz, utilizando a ação `actions/setup-python`.

3. **Cache pip**: Esta etapa armazena em cache as dependências do pip usando a ação `actions/cache`. A chave de cache é gerada com base no sistema operacional e no hash do arquivo `requirements.txt`.
3. **Cache do pip**: Esta etapa armazena em cache os pacotes instalados pelo pip para acelerar as execuções subsequentes. A chave do cache é gerada a partir do sistema operacional do runner e do hash do arquivo `requirements.txt`.

4. **Instalar dependências**: Esta etapa instala as dependências do projeto executando o comando `pip install`.
4. **Instalar dependências**: Nesta etapa, o pip é atualizado e as dependências do projeto são instaladas a partir do arquivo `requirements.txt`.

5. **Executar Pylint**: Esta etapa executa o Pylint em todos os arquivos `.py` dentro do diretório `forunb/main/`, excluindo os arquivos nas pastas `migrations/`, `management/` e `templatetags/`.
5. **Executar Pylint**: Nesta etapa, o Pylint é executado em todos os arquivos Python dentro do diretório `forunb`, exceto nos diretórios `migrations` e `management`, além dos diretórios `templatetags`. O resultado da execução é salvo em um arquivo `pylint_output.txt`.

- **Analisar resultado do Pylint**: O score final do Pylint é extraído do relatório e exibido. Se o score for maior que 8, o job é considerado bem-sucedido. Caso contrário, o job falha, e uma mensagem informando o score é exibida.

## SonarCloud

Este fluxo de trabalho do GitHub Actions é acionado em eventos de push para os branches `main` e `Development`, bem como em pull requests. Ele consiste em um único job chamado `sonarcloud` que é executado na versão mais recente do Ubuntu.
Este fluxo de trabalho do GitHub Actions é acionado em eventos de push para os branches `main` e `Development`, bem como em pull requests. Ele executa uma análise de código utilizando o SonarCloud, além de configurar o ambiente de teste e executar os testes com cobertura de código.

### Job: sonarcloud

O job `sonarcloud` realiza a análise de código e cobertura de testes utilizando o SonarCloud.
O job `sonarcloud` é responsável por configurar o ambiente, executar os testes com cobertura e realizar a análise de código com o SonarCloud.

### Steps

1. **Checkout do projeto**: Esta etapa faz o checkout do repositório usando a ação `actions/checkout`.

2. **Configurar Python**: Esta etapa configura a versão especificada do Python usando a ação `actions/setup-python`. A versão do Python é definida pelo uso de uma matriz.
2. **Configurar Python ${{ matrix.python-version }}**: Esta etapa configura a versão do Python utilizando a ação `actions/setup-python`.

3. **Cache do pip**: Esta etapa armazena em cache os pacotes instalados pelo pip para acelerar as execuções subsequentes. A chave do cache é gerada a partir do sistema operacional do runner e do hash do arquivo `requirements.txt`.

4. **Instalar dependências**: Nesta etapa, o pip é atualizado e as dependências do projeto são instaladas a partir do arquivo `requirements.txt`.

5. **Instalar PostgreSQL**: Esta etapa instala o PostgreSQL no ambiente de execução.

6. **Iniciar PostgreSQL**: Esta etapa inicia o serviço do PostgreSQL.

3. **Cache pip**: Esta etapa armazena em cache as dependências do pip usando a ação `actions/cache`. A chave de cache é gerada com base no sistema operacional e no hash do arquivo `requirements.txt`.
7. **Configurar PostgreSQL**: Nesta etapa, o banco de dados e o usuário necessários para os testes são criados e configurados no PostgreSQL.

4. **Instalar dependências**: Esta etapa instala as dependências do projeto executando o comando `pip install`.
8. **Configurar ambiente**: Esta etapa executa o comando `make config` para configurar o ambiente necessário para os testes.

5. **Configurar ambiente**: Esta etapa configura o ambiente de desenvolvimento executando o comando `make config`.
9. **Executar testes com cobertura**: Nesta etapa, os testes do projeto são executados utilizando o `coverage`, e um relatório XML da cobertura de código é gerado.

6. **Executar testes com cobertura**: Esta etapa executa os testes do Django utilizando a ferramenta `coverage` para medir a cobertura de código. Em seguida, gera um relatório em formato XML.
10. **SonarCloud Scan**: Finalmente, o SonarCloud é utilizado para realizar a análise de código. As variáveis de ambiente `GITHUB_TOKEN` e `SONAR_TOKEN` são usadas para autenticação e configuração. O relatório de cobertura de código gerado na etapa anterior é passado para o SonarCloud através do argumento `-Dsonar.python.coverage.reportPaths=coverage.xml`.

7. **Scan do SonarCloud**: Esta etapa executa o scan do SonarCloud, utilizando o token de autenticação armazenado nos segredos do GitHub (`SONAR_TOKEN`) e configurando o caminho para o relatório de cobertura gerado pela etapa anterior.
19 changes: 18 additions & 1 deletion .github/workflows/sonar.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,23 @@ jobs:
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
- name: Install PostgreSQL
run: |
sudo apt-get update
sudo apt-get install -y postgresql postgresql-contrib
- name: Start PostgreSQL
run: |
sudo service postgresql start
- name: Configure PostgreSQL
run: |
sudo -u postgres psql -c "CREATE DATABASE forunb_db;"
sudo -u postgres psql -c "CREATE USER forunb WITH PASSWORD 'balao123';"
sudo -u postgres psql -c "ALTER USER forunb CREATEDB;"
sudo -u postgres psql -c "ALTER ROLE forunb SET client_encoding TO 'utf8';"
sudo -u postgres psql -c "ALTER ROLE forunb SET default_transaction_isolation TO 'read committed';"
sudo -u postgres psql -c "ALTER ROLE forunb SET timezone TO 'UTC';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE forunb_db TO forunb;"
- name: Configure enviroment
run: make config

Expand All @@ -46,4 +63,4 @@ jobs:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
with:
args: >
-Dsonar.python.coverage.reportPaths=coverage.xml
-Dsonar.python.coverage.reportPaths=coverage.xml
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ __pycache__/
local_settings.py
db.sqlite3
db.sqlite3-journal
media

# If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/
# in your Git repository. Update and uncomment the following line accordingly.
Expand Down
2 changes: 2 additions & 0 deletions Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
release: python forunb/manage.py migrate
web: gunicorn --pythonpath=forunb forunb.wsgi
17 changes: 17 additions & 0 deletions forunb/forunb/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# ForUnB - Configuração do Projeto

Esta pasta `forunb` contém os arquivos principais de configuração e gerenciamento do projeto **ForUnB**. Diferente dos apps tradicionais do Django, esta pasta não contém models, views ou templates, mas é essencial para o funcionamento geral do projeto.

## Descrição dos Arquivos
- **__init__.py:** Arquivo vazio que indica ao Python que este diretório deve ser tratado como um módulo.
- **asgi.py:** Configuração para a interface ASGI (Asynchronous Server Gateway Interface), usada para servir o projeto em um ambiente assíncrono.
- **settings/:** Diretório que contém os arquivos de configuração do projeto.
- **base.py:** Contém as configurações básicas e comuns a todos os ambientes.
- **production.py:** Configurações específicas para o ambiente de produção.
- **urls.py:** Define os roteamentos principais do projeto, conectando URLs a views.
- **wsgi.py:** Configuração para a interface WSGI (Web Server Gateway Interface), usada para servir o projeto em ambientes síncronos.

## Licença
Este projeto está licenciado sob os termos da licença MIT.

Esse `README.md` oferece uma visão geral da função da pasta `forunb` no projeto Django 'ForUnB', explicando a finalidade dos principais arquivos de configuração.
6 changes: 2 additions & 4 deletions forunb/forunb/asgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,9 @@
"""

import os
from forunb.env import env, BASE_DIR
from decouple import config
from django.core.asgi import get_asgi_application

env.read_env(os.path.join(BASE_DIR, '.env'))

os.environ.setdefault('DJANGO_SETTINGS_MODULE', env('DJANGO_SETTINGS_MODULE'))
os.environ.setdefault('DJANGO_SETTINGS_MODULE', config('DJANGO_SETTINGS_MODULE'))

application = get_asgi_application()
3 changes: 0 additions & 3 deletions forunb/forunb/env.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
""" Module to manage environment variables and BASE_DIR. """
# my imports
from pathlib import Path
import environ

env = environ.Env()

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
29 changes: 14 additions & 15 deletions forunb/forunb/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,14 @@
"""

import os
from pathlib import Path
from forunb.env import BASE_DIR, env

env.read_env(os.path.join(BASE_DIR, '.env'))
from decouple import config
from forunb.env import BASE_DIR

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')

ALLOWED_HOSTS = ['*']
SECRET_KEY = config('SECRET_KEY')

# Application definition

Expand All @@ -36,10 +32,13 @@
'main',
'users',
'search',
'cloudinary',
'cloudinary_storage',
]

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
Expand Down Expand Up @@ -72,13 +71,6 @@
# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}


# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
Expand Down Expand Up @@ -118,12 +110,19 @@
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/

STATIC_URL = '/static/'
STATIC_URL = 'static/'

# Diretório para coletar arquivos estáticos em produção
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

# Diretórios onde procurar arquivos estáticos adicionais
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]

# Configuração do WhiteNoise
# STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Expand Down
14 changes: 10 additions & 4 deletions forunb/forunb/settings/local.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
""" Settings for local development. """
from forunb.env import env
from .base import *
from forunb.settings.base import * #pylint: disable=W0401, W0614

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env.bool('DJANGO_DEBUG', default=True)
DEBUG = True

ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", default=['localhost', '0.0.0.0', '127.0.0.1'])
ALLOWED_HOSTS = ['localhost', '0.0.0.0', '127.0.0.1']

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
25 changes: 22 additions & 3 deletions forunb/forunb/settings/production.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,27 @@
""" Settings for production development. """
from forunb.env import env
import os
import cloudinary
import cloudinary.uploader
import cloudinary.api
from .base import *
import dj_database_url


# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env.bool('DJANGO_DEBUG', default=False)
DEBUG = False

ALLOWED_HOSTS = ['.herokuapp.com', '.forunb.com']

DATABASES = {
'default': dj_database_url.config(
default=config('DATABASE_URL')
)
}

CLOUDINARY_STORAGE = {
'CLOUDINARY_URL': os.getenv('CLOUDINARY_URL'),
}

DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'

ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", default=[]) # ainda estmos sem site
MEDIA_URL = 'https://res.cloudinary.com/dmezdx5mc/image/upload/'
3 changes: 2 additions & 1 deletion forunb/forunb/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@
]

if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

6 changes: 2 additions & 4 deletions forunb/forunb/wsgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,9 @@
"""

import os
from forunb.env import env, BASE_DIR
from decouple import config
from django.core.wsgi import get_wsgi_application

env.read_env(os.path.join(BASE_DIR, '.env'))

os.environ.setdefault('DJANGO_SETTINGS_MODULE', env('DJANGO_SETTINGS_MODULE'))
os.environ.setdefault('DJANGO_SETTINGS_MODULE', config('DJANGO_SETTINGS_MODULE'))

application = get_wsgi_application()
Loading

0 comments on commit 040ba0e

Please sign in to comment.