Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

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

+74 -5
+74 -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 ··· 128 126 }) 129 127 } 130 128 129 + // Trigger a sites redeploy if this push is to the configured sites branch. 130 + if cfClient.Enabled() { 131 + go triggerSitesDeployIfNeeded(ctx, d, cfClient, c, record, source) 132 + } 133 + 131 134 return errors.Join(errWebhook, errPunchcard, errLanguages, errPosthog) 135 + } 136 + 137 + // triggerSitesDeployIfNeeded checks whether the pushed ref matches the sites 138 + // branch configured for this repo and, if so, syncs the site to R2 139 + func triggerSitesDeployIfNeeded(ctx context.Context, d *db.DB, cfClient *cloudflare.Client, c *config.Config, record tangled.GitRefUpdate, source ec.Source) { 140 + logger := log.FromContext(ctx) 141 + 142 + ref := plumbing.ReferenceName(record.Ref) 143 + if !ref.IsBranch() { 144 + return 145 + } 146 + pushedBranch := ref.Short() 147 + 148 + repos, err := db.GetRepos( 149 + d, 150 + 0, 151 + orm.FilterEq("did", record.RepoDid), 152 + orm.FilterEq("name", record.RepoName), 153 + ) 154 + if err != nil || len(repos) != 1 { 155 + return 156 + } 157 + repo := repos[0] 158 + 159 + siteConfig, err := db.GetRepoSiteConfig(d, repo.RepoAt().String()) 160 + if err != nil || siteConfig == nil { 161 + return 162 + } 163 + if siteConfig.Branch != pushedBranch { 164 + return 165 + } 166 + 167 + scheme := "https" 168 + if c.Core.Dev { 169 + scheme = "http" 170 + } 171 + knotHost := fmt.Sprintf("%s://%s", scheme, source.Key()) 172 + 173 + deploy := &models.SiteDeploy{ 174 + RepoAt: repo.RepoAt().String(), 175 + Branch: siteConfig.Branch, 176 + Dir: siteConfig.Dir, 177 + CommitSHA: record.NewSha, 178 + Trigger: models.SiteDeployTriggerPush, 179 + } 180 + 181 + deployErr := sites.Deploy(ctx, cfClient, knotHost, record.RepoDid, record.RepoName, siteConfig.Branch, siteConfig.Dir) 182 + if deployErr != nil { 183 + logger.Error("sites: R2 sync failed on push", "repo", record.RepoDid+"/"+record.RepoName, "err", deployErr) 184 + deploy.Status = models.SiteDeployStatusFailure 185 + deploy.Error = deployErr.Error() 186 + } else { 187 + deploy.Status = models.SiteDeployStatusSuccess 188 + } 189 + 190 + if err := db.AddSiteDeploy(d, deploy); err != nil { 191 + logger.Error("sites: failed to record deploy", "repo", record.RepoDid+"/"+record.RepoName, "err", err) 192 + } 193 + 194 + if deployErr == nil { 195 + logger.Info("site deployed to r2", "repo", record.RepoDid+"/"+record.RepoName) 196 + } 132 197 } 133 198 134 199 func populatePunchcard(d *db.DB, record tangled.GitRefUpdate) error {