Skip to content

Commit 0cf3e19

Browse files
authored
chore: prepare ee release for backend service (#1487)
* temp commit * completion of docker release
1 parent 19ae400 commit 0cf3e19

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+3451
-610
lines changed

.github/workflows/ee_backend_docker_release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ jobs:
3939
uses: docker/build-push-action@v5.3.0
4040
with:
4141
context: .
42-
file: "Dockerfile_backend"
42+
file: "Dockerfile_backend_ee"
4343
push: true
4444
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest, ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.event.release.tag_name }}
4545
labels: ${{ steps.meta.outputs.labels }}

Dockerfile_backend_ee

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
FROM golang:1.22 as builder
2+
ARG COMMIT_SHA
3+
RUN echo "commit sha: ${COMMIT_SHA}"
4+
5+
# Set the working directory
6+
WORKDIR $GOPATH/src/github.com/diggerhq/digger
7+
8+
# Copy all required source, blacklist files that are not required through `.dockerignore`
9+
COPY . .
10+
11+
# Get the vendor library
12+
RUN go version
13+
14+
# RUN vgo install
15+
16+
# https://github.com/ethereum/go-ethereum/issues/2738
17+
# Build static binary "-getmode=vendor" does not work with go-ethereum
18+
19+
RUN go build -ldflags="-X 'main.Version=${COMMIT_SHA}'" -o backend_exe ./ee/backend/
20+
21+
# Multi-stage build will just copy the binary to an alpine image.
22+
FROM ubuntu:24.04 as runner
23+
ENV ATLAS_VERSION v0.16.0
24+
ARG COMMIT_SHA
25+
WORKDIR /app
26+
27+
RUN apt-get update && apt-get install -y ca-certificates curl && apt-get install -y git && apt-get clean all
28+
RUN update-ca-certificates
29+
30+
RUN echo "commit sha: ${COMMIT_SHA}"
31+
32+
# install atlas
33+
RUN curl -sSf https://atlasgo.sh | sh
34+
35+
36+
37+
# Set gin to production
38+
#ENV GIN_MODE=release
39+
40+
# Expose the running port
41+
EXPOSE 3000
42+
43+
# Copy the binary to the corresponding folder
44+
COPY --from=builder /go/src/github.com/diggerhq/digger/backend_exe /app/backend
45+
COPY --from=builder /go/src/github.com/diggerhq/digger/backend/scripts/entrypoint.sh /app/entrypoint.sh
46+
COPY --from=builder /go/src/github.com/diggerhq/digger/backend/migrations /app/migrations
47+
ADD backend/templates ./templates
48+
49+
# Run the binary
50+
ENTRYPOINT ["/bin/bash", "/app/entrypoint.sh"]

backend/bootstrap/main.go

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package bootstrap
2+
3+
import (
4+
"embed"
5+
"github.com/diggerhq/digger/backend/config"
6+
"github.com/diggerhq/digger/backend/segment"
7+
"html/template"
8+
"io/fs"
9+
"log"
10+
"net/http"
11+
"os"
12+
"time"
13+
14+
"github.com/diggerhq/digger/backend/controllers"
15+
"github.com/diggerhq/digger/backend/middleware"
16+
"github.com/diggerhq/digger/backend/models"
17+
"github.com/getsentry/sentry-go"
18+
sentrygin "github.com/getsentry/sentry-go/gin"
19+
"github.com/gin-contrib/sessions"
20+
gormsessions "github.com/gin-contrib/sessions/gorm"
21+
"github.com/gin-gonic/gin"
22+
)
23+
24+
// based on https://www.digitalocean.com/community/tutorials/using-ldflags-to-set-version-information-for-go-applications
25+
var Version = "dev"
26+
27+
func Bootstrap(templates embed.FS) *gin.Engine {
28+
defer segment.CloseClient()
29+
initLogging()
30+
cfg := config.DiggerConfig
31+
32+
if err := sentry.Init(sentry.ClientOptions{
33+
Dsn: os.Getenv("SENTRY_DSN"),
34+
EnableTracing: true,
35+
// Set TracesSampleRate to 1.0 to capture 100%
36+
// of transactions for performance monitoring.
37+
// We recommend adjusting this value in production,
38+
TracesSampleRate: 0.1,
39+
Release: "api@" + Version,
40+
Debug: true,
41+
}); err != nil {
42+
log.Printf("Sentry initialization failed: %v\n", err)
43+
}
44+
45+
//database migrations
46+
models.ConnectDatabase()
47+
48+
r := gin.Default()
49+
// TODO: check "secret"
50+
store := gormsessions.NewStore(models.DB.GormDB, true, []byte("secret"))
51+
52+
r.Use(sessions.Sessions("digger-session", store))
53+
54+
r.Use(sentrygin.New(sentrygin.Options{Repanic: true}))
55+
56+
r.GET("/health", func(c *gin.Context) {
57+
c.JSON(http.StatusOK, gin.H{
58+
"build_date": cfg.GetString("build_date"),
59+
"deployed_at": cfg.GetString("deployed_at"),
60+
"version": Version,
61+
"commit_sha": Version,
62+
})
63+
})
64+
65+
r.SetFuncMap(template.FuncMap{
66+
"formatAsDate": func(msec int64) time.Time {
67+
return time.UnixMilli(msec)
68+
},
69+
})
70+
71+
if _, err := os.Stat("templates"); err != nil {
72+
matches, _ := fs.Glob(templates, "templates/*.tmpl")
73+
for _, match := range matches {
74+
r.LoadHTMLFiles(match)
75+
}
76+
r.StaticFS("/static", http.FS(templates))
77+
} else {
78+
r.Static("/static", "./templates/static")
79+
r.LoadHTMLGlob("templates/*.tmpl")
80+
}
81+
82+
r.POST("/github-app-webhook", controllers.GithubAppWebHook)
83+
r.POST("/github-app-webhook/aam", controllers.GithubAppWebHookAfterMerge)
84+
85+
tenantActionsGroup := r.Group("/api/tenants")
86+
tenantActionsGroup.Use(middleware.CORSMiddleware())
87+
tenantActionsGroup.Any("/associateTenantIdToDiggerOrg", controllers.AssociateTenantIdToDiggerOrg)
88+
89+
githubGroup := r.Group("/github")
90+
githubGroup.Use(middleware.GetWebMiddleware())
91+
githubGroup.GET("/callback", controllers.GithubAppCallbackPage)
92+
githubGroup.GET("/repos", controllers.GithubReposPage)
93+
githubGroup.GET("/setup", controllers.GithubAppSetup)
94+
githubGroup.GET("/exchange-code", controllers.GithubSetupExchangeCode)
95+
96+
authorized := r.Group("/")
97+
authorized.Use(middleware.GetApiMiddleware(), middleware.AccessLevel(models.CliJobAccessType, models.AccessPolicyType, models.AdminPolicyType))
98+
99+
admin := r.Group("/")
100+
admin.Use(middleware.GetApiMiddleware(), middleware.AccessLevel(models.AdminPolicyType))
101+
102+
fronteggWebhookProcessor := r.Group("/")
103+
fronteggWebhookProcessor.Use(middleware.SecretCodeAuth())
104+
105+
authorized.GET("/repos/:repo/projects/:projectName/access-policy", controllers.FindAccessPolicy)
106+
authorized.GET("/orgs/:organisation/access-policy", controllers.FindAccessPolicyForOrg)
107+
108+
authorized.GET("/repos/:repo/projects/:projectName/plan-policy", controllers.FindPlanPolicy)
109+
authorized.GET("/orgs/:organisation/plan-policy", controllers.FindPlanPolicyForOrg)
110+
111+
authorized.GET("/repos/:repo/projects/:projectName/drift-policy", controllers.FindDriftPolicy)
112+
authorized.GET("/orgs/:organisation/drift-policy", controllers.FindDriftPolicyForOrg)
113+
114+
authorized.GET("/repos/:repo/projects/:projectName/runs", controllers.RunHistoryForProject)
115+
authorized.POST("/repos/:repo/projects/:projectName/runs", controllers.CreateRunForProject)
116+
117+
authorized.POST("/repos/:repo/projects/:projectName/jobs/:jobId/set-status", controllers.SetJobStatusForProject)
118+
119+
authorized.GET("/repos/:repo/projects", controllers.FindProjectsForRepo)
120+
authorized.POST("/repos/:repo/report-projects", controllers.ReportProjectsForRepo)
121+
122+
authorized.GET("/orgs/:organisation/projects", controllers.FindProjectsForOrg)
123+
124+
admin.PUT("/repos/:repo/projects/:projectName/access-policy", controllers.UpsertAccessPolicyForRepoAndProject)
125+
admin.PUT("/orgs/:organisation/access-policy", controllers.UpsertAccessPolicyForOrg)
126+
127+
admin.PUT("/repos/:repo/projects/:projectName/plan-policy", controllers.UpsertPlanPolicyForRepoAndProject)
128+
admin.PUT("/orgs/:organisation/plan-policy", controllers.UpsertPlanPolicyForOrg)
129+
130+
admin.PUT("/repos/:repo/projects/:projectName/drift-policy", controllers.UpsertDriftPolicyForRepoAndProject)
131+
admin.PUT("/orgs/:organisation/drift-policy", controllers.UpsertDriftPolicyForOrg)
132+
133+
admin.POST("/tokens/issue-access-token", controllers.IssueAccessTokenForOrg)
134+
135+
r.Use(middleware.CORSMiddleware())
136+
projectsApiGroup := r.Group("/api/projects")
137+
projectsApiGroup.Use(middleware.GetApiMiddleware())
138+
projectsApiGroup.GET("/", controllers.FindProjectsForOrg)
139+
projectsApiGroup.GET("/:project_id", controllers.ProjectDetails)
140+
projectsApiGroup.GET("/:project_id/runs", controllers.RunsForProject)
141+
142+
runsApiGroup := r.Group("/api/runs")
143+
runsApiGroup.Use(middleware.CORSMiddleware(), middleware.GetApiMiddleware())
144+
runsApiGroup.GET("/:run_id", controllers.RunDetails)
145+
runsApiGroup.POST("/:run_id/approve", controllers.ApproveRun)
146+
147+
fronteggWebhookProcessor.POST("/create-org-from-frontegg", controllers.CreateFronteggOrgFromWebhook)
148+
149+
return r
150+
}
151+
152+
func initLogging() {
153+
log.SetOutput(os.Stdout)
154+
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
155+
log.Println("Initialized the logger successfully")
156+
}

backend/controllers/helpers.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package controllers
2+
3+
import (
4+
"github.com/gin-gonic/gin"
5+
"net/http"
6+
)
7+
8+
func Home(c *gin.Context) {
9+
c.HTML(http.StatusOK, "home.tmpl", gin.H{})
10+
}

0 commit comments

Comments
 (0)