78/100 Dias de Golang - Mini Servidor de CI/CD – Parte 2 - Modelagem e Banco de Dados com GORM
Table of Contents
#
Mini Servidor de CI/CD – Parte 2: Modelagem e Banco de Dados com GORM
Na Parte 1, iniciamos nosso projeto de servidor CI/CD com Go e o framework Gin, configurando a estrutura de pastas e subindo o servidor com uma rota de teste. Agora vamos persistir os dados dos pipelines e suas execuções com GORM e SQLite. Nosso servidor CI/CD precisa lidar com três entidades principais:
- Pipeline: representa uma definição de tarefas a serem executadas.
- Step: cada comando a ser executado dentro do pipeline.
- Execution: representa uma execução (histórico) de um pipeline.
Primeiro vamos instalar o GORM e o driver do sqlite:
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
Com elas instaladas, vamos criar dois arquivos: internal/db/database.go
e internal/models/models.go
Veja como ficou a modelagem do banco:
package models
type Pipeline struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"uniqueIndex;not null"`
Repo string `gorm:"not null"`
Steps []Step
}
type Step struct {
ID uint `gorm:"primaryKey"`
PipelineID uint `gorm:"index"`
Order int `gorm:"not null"`
Command string `gorm:"not null"`
}
type Execution struct {
ID uint `gorm:"primaryKey"`
PipelineID uint `gorm:"index"`
Status string // success | failed | running
Log string
}
E no arquivo database.go
fazemos o migrate e abrimos a conexão com o banco.
package db
import (
"log"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"cicd-server/internal/models"
)
var DB *gorm.DB
func InitDatabase() {
var err error
DB, err = gorm.Open(sqlite.Open("cicd.db"), &gorm.Config{})
if err != nil {
log.Fatalf("Erro ao conectar ao banco de dados: %v", err)
}
err = DB.AutoMigrate(&models.Pipeline{}, &models.Step{}, &models.Execution{})
if err != nil {
log.Fatalf("Erro ao fazer migração: %v", err)
}
log.Println("Banco de dados inicializado com sucesso.")
}
Agora temos que chamar o InitDatabase
no nosso arquivo main.go
, se rodarmos e der tudo der certo um arquivo cicd.db
deve ser criado.
package main
import (
"log"
"github.com/gin-gonic/gin"
"cicd-server/internal/db"
)
func main() {
db.InitDatabase()
router := gin.Default()
router.GET("/status", func(c *gin.Context) {
c.JSON(200, gin.H{"status": "ok"})
})
log.Println("Servidor CI/CD rodando na porta 8080...")
err := router.Run(":8080")
if err != nil {
log.Fatalf("Erro ao iniciar servidor: %v", err)
}
}
Amanhã fazemos as rotas e as lógicas de execução!