Skip to content

Commit 840458e

Browse files
authored
fix: docker builds / secrets (#111)
1 parent 1b2bb24 commit 840458e

File tree

6 files changed

+142
-3
lines changed

6 files changed

+142
-3
lines changed

.github/workflows/docker-build.yml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@ name: Docker Build (Reusable)
22

33
on:
44
workflow_call:
5+
secrets:
6+
DOCKERHUB_USERNAME:
7+
description: Docker Hub username for docker/login-action (required when inputs.push is true)
8+
required: false
9+
DOCKERHUB_TOKEN:
10+
description: Docker Hub token/password for docker/login-action (required when inputs.push is true)
11+
required: false
512
inputs:
613
image:
714
description: Fully qualified image name, e.g. ghcr.io/org/repo/service
@@ -80,8 +87,8 @@ jobs:
8087
- name: Build${{ inputs.push && ' & push' || '' }}
8188
uses: docker/build-push-action@v6
8289
with:
83-
context: ${{ inputs.context }}
84-
file: ${{ inputs.dockerfile }}
90+
context: ${{ github.workspace }}/${{ inputs.context }}
91+
file: ${{ github.workspace }}/${{ inputs.dockerfile }}
8592
platforms: linux/amd64
8693
push: ${{ inputs.push }}
8794
tags: ${{ steps.meta.outputs.tags }}

.github/workflows/docker-merrymaker-go.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ concurrency:
2020
jobs:
2121
docker:
2222
uses: ./.github/workflows/docker-build.yml
23+
secrets: inherit
2324
with:
2425
image: target/merrymaker
2526
tag_prefix: merrymaker-go-

.github/workflows/docker-puppeteer-worker.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ concurrency:
2020
jobs:
2121
docker:
2222
uses: ./.github/workflows/docker-build.yml
23+
secrets: inherit
2324
with:
2425
image: target/merrymaker
2526
tag_prefix: puppeteer-worker-

services/merrymaker-go/.dockerignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ bin
1212
/merrymaker
1313
/merrymaker-prod
1414

15+
# Ensure the Go main package directory is never excluded
16+
!cmd/merrymaker/
17+
!cmd/merrymaker/**
18+
1519
# Frontend dev-only deps
1620
frontend/node_modules
1721
frontend/vendor

services/merrymaker-go/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ frontend/static/*
33
!frontend/static/.gitkeep
44
bin
55
node_modules
6-
merrymaker
6+
/merrymaker
7+
/merrymaker-prod
78
docs/*.md
89

910
# Built CSS generated by bun from styles/index.css
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"errors"
7+
"fmt"
8+
"log/slog"
9+
"os"
10+
11+
"github.com/redis/go-redis/v9"
12+
"github.com/target/mmk-ui-api/config"
13+
"github.com/target/mmk-ui-api/internal/bootstrap"
14+
)
15+
16+
func main() {
17+
ctx := context.Background()
18+
logger := bootstrap.InitLogger()
19+
if err := run(ctx, logger); err != nil {
20+
logger.ErrorContext(ctx, "fatal error", "error", err)
21+
os.Exit(1) //nolint:forbidigo // Main entrypoint should exit with non-zero status on fatal errors.
22+
}
23+
}
24+
25+
func run(ctx context.Context, logger *slog.Logger) error {
26+
cfg, err := bootstrap.LoadConfig()
27+
if err != nil {
28+
return err
29+
}
30+
31+
// Log startup info
32+
logStartupInfo(ctx, logger, &cfg)
33+
34+
cfgPtr := &cfg
35+
36+
// Validate configuration
37+
if err = bootstrap.ValidateServiceConfig(cfgPtr); err != nil {
38+
return err
39+
}
40+
41+
// Initialize infrastructure
42+
db, redisClient, err := initInfrastructure(ctx, &cfg, logger)
43+
if err != nil {
44+
return err
45+
}
46+
defer func() {
47+
if cerr := db.Close(); cerr != nil {
48+
logger.ErrorContext(ctx, "close database failed", "error", cerr)
49+
}
50+
}()
51+
if redisClient != nil {
52+
defer func() {
53+
if cerr := redisClient.Close(); cerr != nil {
54+
logger.ErrorContext(ctx, "close redis failed", "error", cerr)
55+
}
56+
}()
57+
}
58+
59+
// Run migrations if enabled
60+
if cfg.Postgres.RunMigrationsOnStart {
61+
if err = bootstrap.RunMigrations(ctx, db, logger); err != nil {
62+
return err
63+
}
64+
} else {
65+
logger.InfoContext(ctx, "skipping database migrations on startup", "reason", "disabled via config")
66+
}
67+
68+
// Initialize and run services
69+
services := bootstrap.NewServices(&bootstrap.ServiceDeps{
70+
Config: cfgPtr,
71+
DB: db,
72+
RedisClient: redisClient,
73+
Logger: logger,
74+
})
75+
76+
return bootstrap.RunServicesWithShutdown(&bootstrap.ServiceOrchestrationConfig{
77+
Config: cfgPtr,
78+
Services: services,
79+
DB: db,
80+
RedisClient: redisClient,
81+
Logger: logger,
82+
})
83+
}
84+
85+
func logStartupInfo(ctx context.Context, logger *slog.Logger, cfg *config.AppConfig) {
86+
enabledServices := bootstrap.GetEnabledServices(cfg)
87+
logger.InfoContext(ctx, "starting merrymaker service",
88+
"db_host", cfg.Postgres.Host,
89+
"db_port", cfg.Postgres.Port,
90+
"db_name", cfg.Postgres.Name,
91+
"enabled_services", enabledServices)
92+
}
93+
94+
// initInfrastructure connects shared dependencies used by the service runtime.
95+
//
96+
//nolint:ireturn // returning redis.UniversalClient keeps sentinel/cluster support flexible.
97+
func initInfrastructure(
98+
ctx context.Context,
99+
cfg *config.AppConfig,
100+
logger *slog.Logger,
101+
) (*sql.DB, redis.UniversalClient, error) {
102+
db, err := bootstrap.ConnectDB(bootstrap.DatabaseConfig{
103+
DBConfig: cfg.Postgres,
104+
RedisConfig: cfg.Redis,
105+
Logger: logger,
106+
})
107+
if err != nil {
108+
return nil, nil, fmt.Errorf("connect db: %w", err)
109+
}
110+
111+
redisClient, err := bootstrap.ConnectRedis(bootstrap.DatabaseConfig{
112+
DBConfig: cfg.Postgres,
113+
RedisConfig: cfg.Redis,
114+
Logger: logger,
115+
})
116+
if err != nil {
117+
if cerr := db.Close(); cerr != nil {
118+
logger.ErrorContext(ctx, "close database after redis connect failure", "error", cerr)
119+
return nil, nil, fmt.Errorf("connect redis: %w", errors.Join(err, fmt.Errorf("close database: %w", cerr)))
120+
}
121+
return nil, nil, fmt.Errorf("connect redis: %w", err)
122+
}
123+
124+
return db, redisClient, nil
125+
}

0 commit comments

Comments
 (0)