Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2

appview/state: trigger site redeploy on git push to configured branch

Signed-off-by: Anirudh Oppiliappan <anirudh@tangled.org>

anirudh.fi a37711ab f2bc9cd7

verified
+75 -5
+75 -5
appview/state/knotstream.go
··· 8 8 "slices" 9 9 "time" 10 10 11 + "tangled.org/core/appview/cloudflare" 11 12 "tangled.org/core/appview/notify" 12 13 13 14 "tangled.org/core/api/tangled" ··· 16 15 "tangled.org/core/appview/config" 17 16 "tangled.org/core/appview/db" 18 17 "tangled.org/core/appview/models" 18 + "tangled.org/core/appview/sites" 19 19 ec "tangled.org/core/eventconsumer" 20 20 "tangled.org/core/eventconsumer/cursor" 21 21 "tangled.org/core/log" ··· 29 27 "github.com/posthog/posthog-go" 30 28 ) 31 29 32 - func Knotstream(ctx context.Context, c *config.Config, d *db.DB, enforcer *rbac.Enforcer, posthog posthog.Client, notifier notify.Notifier) (*ec.Consumer, error) { 30 + func Knotstream(ctx context.Context, c *config.Config, d *db.DB, enforcer *rbac.Enforcer, posthog posthog.Client, notifier notify.Notifier, cfClient *cloudflare.Client) (*ec.Consumer, error) { 33 31 logger := log.FromContext(ctx) 34 32 logger = log.SubLogger(logger, "knotstream") 35 33 ··· 52 50 53 51 cfg := ec.ConsumerConfig{ 54 52 Sources: srcs, 55 - ProcessFunc: knotIngester(d, enforcer, posthog, notifier, c.Core.Dev), 53 + ProcessFunc: knotIngester(d, enforcer, posthog, notifier, c.Core.Dev, c, cfClient), 56 54 RetryInterval: c.Knotstream.RetryInterval, 57 55 MaxRetryInterval: c.Knotstream.MaxRetryInterval, 58 56 ConnectionTimeout: c.Knotstream.ConnectionTimeout, ··· 66 64 return ec.NewConsumer(cfg), nil 67 65 } 68 66 69 - func knotIngester(d *db.DB, enforcer *rbac.Enforcer, posthog posthog.Client, notifier notify.Notifier, dev bool) ec.ProcessFunc { 67 + func knotIngester(d *db.DB, enforcer *rbac.Enforcer, posthog posthog.Client, notifier notify.Notifier, dev bool, c *config.Config, cfClient *cloudflare.Client) ec.ProcessFunc { 70 68 return func(ctx context.Context, source ec.Source, msg ec.Message) error { 71 69 switch msg.Nsid { 72 70 case tangled.GitRefUpdateNSID: 73 - return ingestRefUpdate(d, enforcer, posthog, notifier, dev, source, msg, ctx) 71 + return ingestRefUpdate(ctx, d, enforcer, posthog, notifier, dev, c, cfClient, source, msg) 74 72 case tangled.PipelineNSID: 75 73 return ingestPipeline(d, source, msg) 76 74 } ··· 79 77 } 80 78 } 81 79 82 - func ingestRefUpdate(d *db.DB, enforcer *rbac.Enforcer, pc posthog.Client, notifier notify.Notifier, dev bool, source ec.Source, msg ec.Message, ctx context.Context) error { 80 + func ingestRefUpdate(ctx context.Context, d *db.DB, enforcer *rbac.Enforcer, pc posthog.Client, notifier notify.Notifier, dev bool, c *config.Config, cfClient *cloudflare.Client, source ec.Source, msg ec.Message) error { 83 81 logger := log.FromContext(ctx) 84 82 85 83 var record tangled.GitRefUpdate ··· 130 128 }) 131 129 } 132 130 131 + // Trigger a sites redeploy if this push is to the configured sites branch. 132 + if cfClient.Enabled() { 133 + fmt.Println("triggered deploy") 134 + go triggerSitesDeployIfNeeded(ctx, d, cfClient, c, record, source) 135 + } 136 + 133 137 return errors.Join(errWebhook, errPunchcard, errLanguages, errPosthog) 138 + } 139 + 140 + // triggerSitesDeployIfNeeded checks whether the pushed ref matches the sites 141 + // branch configured for this repo and, if so, syncs the site to R2 142 + func triggerSitesDeployIfNeeded(ctx context.Context, d *db.DB, cfClient *cloudflare.Client, c *config.Config, record tangled.GitRefUpdate, source ec.Source) { 143 + logger := log.FromContext(ctx) 144 + 145 + ref := plumbing.ReferenceName(record.Ref) 146 + if !ref.IsBranch() { 147 + return 148 + } 149 + pushedBranch := ref.Short() 150 + 151 + repos, err := db.GetRepos( 152 + d, 153 + 0, 154 + orm.FilterEq("did", record.RepoDid), 155 + orm.FilterEq("name", record.RepoName), 156 + ) 157 + if err != nil || len(repos) != 1 { 158 + return 159 + } 160 + repo := repos[0] 161 + 162 + siteConfig, err := db.GetRepoSiteConfig(d, repo.RepoAt().String()) 163 + if err != nil || siteConfig == nil { 164 + return 165 + } 166 + if siteConfig.Branch != pushedBranch { 167 + return 168 + } 169 + 170 + scheme := "https" 171 + if c.Core.Dev { 172 + scheme = "http" 173 + } 174 + knotHost := fmt.Sprintf("%s://%s", scheme, source.Key()) 175 + 176 + deploy := &models.SiteDeploy{ 177 + RepoAt: repo.RepoAt().String(), 178 + Branch: siteConfig.Branch, 179 + Dir: siteConfig.Dir, 180 + CommitSHA: record.NewSha, 181 + Trigger: models.SiteDeployTriggerPush, 182 + } 183 + 184 + deployErr := sites.Deploy(ctx, cfClient, knotHost, record.RepoDid, record.RepoName, siteConfig.Branch, siteConfig.Dir) 185 + if deployErr != nil { 186 + logger.Error("sites: R2 sync failed on push", "repo", record.RepoDid+"/"+record.RepoName, "err", deployErr) 187 + deploy.Status = models.SiteDeployStatusFailure 188 + deploy.Error = deployErr.Error() 189 + } else { 190 + deploy.Status = models.SiteDeployStatusSuccess 191 + } 192 + 193 + if err := db.AddSiteDeploy(d, deploy); err != nil { 194 + logger.Error("sites: failed to record deploy", "repo", record.RepoDid+"/"+record.RepoName, "err", err) 195 + } 196 + 197 + if deployErr == nil { 198 + logger.Info("site deployed to r2", "repo", record.RepoDid+"/"+record.RepoName) 199 + } 134 200 } 135 201 136 202 func populatePunchcard(d *db.DB, record tangled.GitRefUpdate) error {