Conteudo apresentado na Etec Embu Na semana técnica de Desenvolvimento de sistemas.
Este repositório foi criado para ajudar na criação de GitHub Actions com foco em APIs. Ele fornece um exemplo prático de como configurar e utilizar diversas tecnologias para construir, testar e implantar uma API de forma eficiente.
Aqui você verá como automatizar processos como a criação de testes automatizados, configuração de um ambiente de integração contínua (CI) e a implantação em um ambiente de produção.
Um breve resumo do conteúdo apresentado neste repositório.
- Tecnologias Utilizadas
- Fluxo de Trabalho
- Automatização de Testes
- Automatização de Releases
- Implantação em Ambiente de Produção
- Bonus: Geração de APK React Native
- Node.js: Ambiente de execução JavaScript no lado do servidor.
- Express: Framework web para Node.js, utilizado para construir a API.
- Jest: Framework de testes em JavaScript.
- Logger: Logger para monitoramento de requisições. (Desenvolvido por mim)
- PostgreSQL: Sistema de gerenciamento de banco de dados relacional de código aberto.
- Supabase: Serviço de banco de dados utilizado neste projeto.
- Prisma: ORM (Object-Relational Mapping) para interagir com o banco de dados PostgreSQL.
- GitHub Actions: Plataforma de CI/CD para automação de fluxos de trabalho.
- Azure Web Apps: Serviço de hospedagem de aplicativos da Web da Microsoft.
- React Native: Biblioteca que permite o desenvolvimento de aplicativos móveis multiplataforma usando JavaScript e React.
Este projeto utiliza o Supabase como serviço de banco de dados e o Prisma como ORM (Object-Relational Mapping) para interagir com o banco de dados PostgreSQL.
Nome | Descrição | Tipo | Regras |
---|---|---|---|
id | Identificador único | Int |
@id @default autoincrement() |
createdAt | Data de criação | DateTime |
@default(now()) |
updatedAt | Data de atualização | DateTime |
@updatedAt |
name | Nome do usuário | String |
|
Email do usuário | String |
@unique |
Método | Endpoint | Descrição |
---|---|---|
GET |
/api/user | Retorna todos os usuários cadastrados (filtrados pela query string). |
POST |
/api/user | Cria um novo usuário. |
PUT |
/api/user/:id | Atualiza um usuário existente. |
DELETE |
/api/user/:id | Deleta um usuário existente. |
graph TD;
A[GitHub] -->|Enviar Código| B[GitHub Actions]
B -->|Executar Testes| C[Pipeline CI/CD]
C -->|Implantar| D[Servidor]
D -->|Conectar| E[Supabase]
E -->|Serviço de Banco de Dados| F[PostgreSQL]
D -->|Usar ORM| G[Prisma ORM]
G -->|Interagir| F[PostgreSQL]
Este projeto utiliza o GitHub Actions para automação de fluxos de trabalho de CI/CD. Abaixo está a configuração da action que roda a suíte de testes em cada Pull Request.
Arquivo de configuração da action:
name: Test on Pull Request
on:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- executa em uma máquina virtual do GitHub com o sistema operacional Ubuntu.
- verifica o código do repositório.
- configura o ambiente Node.js.
- instala as dependências do projeto.
- executa a suíte de testes com o comando
npm test
.
Obs: É possivel configurar o GitHub Actions poder recusar Pull Requests que não passarem nos testes. Utilizando da configuração de branchs protegidas. Saiba mais
O release basicamente é a versão do software que será disponibilizada para os usuários. Você pode utilizar para criar um apk de uma aplicação mobile, um executável de uma aplicação desktop ou um pacote de uma aplicação web, por exemplo.
Arquivo de configuração da action:
name: Create Release
on:
push:
branches:
- main
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Get version from package.json
id: get_version
run: |
VERSION=$(node -p -e "require('./package.json').version")
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Create GitHub Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: v${{ steps.get_version.outputs.VERSION }}
release_name: Release v${{ steps.get_version.outputs.VERSION }}
draft: false
prerelease: false
- executa em uma máquina virtual do GitHub com o sistema operacional Ubuntu.
- verifica o código do repositório.
- configura o ambiente Node.js.
- instala as dependências do projeto.
- obtém a versão do projeto a partir do arquivo
package.json
. - cria um release no GitHub com a versão obtida.
O Azure Web Apps é um serviço de hospedagem de aplicativos da Web totalmente gerenciado que permite que você crie e hospede aplicativos da Web, aplicativos móveis, APIs RESTful e back-ends de API em várias linguagens de programação, como .NET, .NET Core, Node.js, Java, PHP e Python.
Arquivo de configuração da action:
name: Build and deploy Node.js app to Azure Web App - nodejs-action
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node.js version
uses: actions/setup-node@v3
with:
node-version: '18.x'
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
npm run test --if-present
- name: Zip artifact for deployment
run: zip release.zip ./* -r
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: node-app
path: release.zip
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'Production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: node-app
- name: Unzip artifact for deployment
run: unzip release.zip
- name: 'Deploy to Azure Web App'
id: deploy-to-webapp
uses: azure/webapps-deploy@v3
with:
app-name: 'nodejs-action'
slot-name: 'Production'
package: .
publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_F645E14404DD4F59B162C90420888ADC }}
- executa em uma máquina virtual do GitHub com o sistema operacional Ubuntu.
- verifica o código do repositório.
- configura o ambiente Node.js.
- instala as dependências do projeto.
- cria um arquivo zip com o código do projeto.
- faz o upload do arquivo zip para o GitHub Actions.
- baixa o arquivo zip do GitHub Actions.
- descompacta o arquivo zip.
- implanta o código no Azure Web App.
O React Native é uma biblioteca que permite o desenvolvimento de aplicativos móveis multiplataforma usando JavaScript e React. Com ele, é possível criar aplicativos para Android e iOS com uma única base de código.
name: Create Release on Push to Main
on:
push:
branches:
- main
jobs:
create-release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install --legacy-peer-deps
- name: Install React Native CLI
run: npm install -g react-native-cli
- name: Create assets directory
run: mkdir -p android/app/src/main/assets
- name: Bundle React Native code and assets
run: react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
- name: Grant execute permission for gradlew
run: chmod +x android/gradlew
- name: Build APK
run: |
cd android
./gradlew assembleRelease
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: v${{ github.run_number }}
release_name: Release ${{ github.run_number }}
draft: false
prerelease: false
- name: Upload Release Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: android/app/build/outputs/apk/release/app-release.apk
asset_name: app-release.apk
asset_content_type: application/vnd.android.package-archive
- executa em uma máquina virtual do GitHub com o sistema operacional Ubuntu.
- verifica o código do repositório.
- configura o ambiente Node.js.
- instala as dependências do projeto.
- instala o React Native CLI.
- cria um diretório para os assets do aplicativo.
- gera o bundle do código e dos assets do React Native.
- configura o JDK 17.
- concede permissão de execução para o gradlew.
- constrói o APK do aplicativo.
- cria um release no GitHub.
- faz o upload do APK gerado para o release criado.