Pular para o conteúdo principal

victorstein.dev

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:

  1. Pipeline: representa uma definição de tarefas a serem executadas.
  2. Step: cada comando a ser executado dentro do pipeline.
  3. 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!