Files
deployment-manager/internal/executor/docker.go
2026-02-01 20:22:29 +05:30

102 lines
1.9 KiB
Go

package executor
import (
"context"
"fmt"
"os"
"path/filepath"
"strings"
"deployment-manager/internal/events"
"deployment-manager/internal/model"
)
func BuildAndPushImage(ctx context.Context, eventChan chan<- *events.Event, repo *model.Repo, workDir string) (string, error) {
imageName := generateImageName(repo)
// Build command
buildCmd := "docker"
buildArgs := []string{
"build",
"-t", imageName,
workDir,
}
if err := RunCmd(ctx, eventChan, repo.ID, buildCmd, buildArgs...); err != nil {
return "", fmt.Errorf("docker build failed: %w", err)
}
// Push command
pushCmd := "docker"
pushArgs := []string{
"push",
imageName,
}
if err := RunCmd(ctx, eventChan, repo.ID, pushCmd, pushArgs...); err != nil {
return "", fmt.Errorf("docker push failed: %w", err)
}
return imageName, nil
}
func generateImageName(repo *model.Repo) string {
// Extract repo name from URL for cleaner image names
parts := strings.Split(strings.TrimSuffix(repo.RepoURL, ".git"), "/")
repoName := parts[len(parts)-1]
return fmt.Sprintf("deployment-manager/%s-%d:latest", repoName, repo.ID)
}
func GetDockerfileContent(repoType model.RepoType) string {
switch repoType {
case model.TypeNodeJS:
return `FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]`
case model.TypePython:
return `FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]`
default:
return `FROM alpine:latest
WORKDIR /app
COPY . .
CMD ["./app"]`
}
}
func CreateDockerfile(workDir string, repoType model.RepoType) error {
dockerfilePath := filepath.Join(workDir, "Dockerfile")
content := GetDockerfileContent(repoType)
return writeFile(dockerfilePath, content)
}
func writeFile(path, content string) error {
return os.WriteFile(path, []byte(content), 0644)
}