@@ -10,6 +10,7 @@ import Colog
1010import Control.AppRequestable
1111import Control.Concurrent
1212import Control.GithubCloner
13+import Control.HasGithubStatus
1314import Control.Monad.Except
1415import Control.Monad.IO.Unlift
1516import Control.Monad.Reader
@@ -37,7 +38,7 @@ import GitHub.App.Request
3738import GitHub.Auth (Auth (OAuth))
3839import GitHub.Data.Name
3940import GitHub.Data.Webhooks.Events
40−import GitHub.Data.Webhooks.Payload
41+import GitHub.Data.Webhooks.Payload hiding (URL (..))
4142import Network.HTTP.Client.TLS (newTlsManager)
4243import Network.HTTP.Media.MediaType
4344import Network.Wai.Handler.Warp
@@ -80,11 +81,8 @@ webhookInstallation _ ((), ev) =
8081 print ev
8182 hFlush stdout
8283
83−pendingStatus :: NewStatus
84−pendingStatus = NewStatus StatusPending Nothing Nothing Nothing
85−
8684webhookPushEvent ::
87− (StaticPQ m, WithLog env Message m, MonadUnliftIO m, HasTasks m, MonadError ServerError m) =>
85+ (StaticPQ m, MonadReader (ServerData m) m, MonadUnliftIO m, HasTasks m, MonadError ServerError m) =>
8886 RepoWebhookEvent ->
8987 ((), PushEvent) ->
9088 m ()
@@ -102,7 +100,7 @@ webhookPushEvent _ ((), ev) = do
102100 M.takeWhileAntitone (repoName >) tasks
103101 case task of
104102 Just (name, TaskConfig {..}) | T.take (T.length name) repoName == name -> do
105− scheduleTask $ StatusUpdate (N owner) (N repoName) (N sha) pendingStatus
103+ schedulePendingStatus (N owner) (N repoName) (N sha)
106104 createSubmission $
107105 Submission
108106 user
@@ -117,7 +115,7 @@ webhookPushEvent _ ((), ev) = do
117115 _ -> return ()
118116
119117retestSubmission ::
120− (StaticPQ m, WithLog env Message m, MonadUnliftIO m, HasTasks m, MonadHasBaseUrl m) =>
118+ (StaticPQ m, MonadReader (ServerData m) m, MonadUnliftIO m, HasTasks m, MonadHasBaseUrl m) =>
121119 String ->
122120 String ->
123121 String ->
@@ -136,7 +134,7 @@ retestSubmission owner repoName sha = do
136134 M.takeWhileAntitone (repoName' >) tasks
137135 case task of
138136 Just (name, TaskConfig {..}) | T.take (T.length name) repoName' == name -> do
139− scheduleTask $ StatusUpdate (N owner') (N repoName') (N sha') pendingStatus
137+ schedulePendingStatus (N owner') (N repoName') (N sha')
140138 updateSubmissionStatus fullRepoName sha BuildScheduled
141139 scheduleTask $ Build prebuild dockerfile (N owner') (N repoName') (N sha') timeoutMinutes
142140 _ -> return ()
@@ -186,7 +184,8 @@ runServer = do
186184 tasks = ts,
187185 logger = cfilter ((logSeverity <=) . msgSeverity) richMessageAction,
188186 baseUrl = baseSiteUrl,
189− dockerUrl = T.pack cfgDockerUrl
187+ dockerUrl = T.pack cfgDockerUrl,
188+ context = githubContext
190189 }
191190 repeatIfNotEmpty n f = f >>= \m -> do
192191 when (m == 0) $ liftIO $ threadDelay n
@@ -230,8 +229,9 @@ data ServerData m
230229 { githubAppAuth :: !InstallationAuth,
231230 tasks :: IORef TasksConfig,
232231 logger :: LogAction m Message,
233− baseUrl :: String,
234− dockerUrl :: T.Text
232+ baseUrl :: T.Text,
233+ dockerUrl :: T.Text,
234+ context :: T.Text
235235 }
236236
237237newtype PolyGitHubKey = PolyGitHubKey (forall result. GitHubKey result)
@@ -266,6 +266,56 @@ instance MonadReader (ServerData n) m => MonadHasBaseUrl m where
266266instance (MonadIO m, MonadReader (ServerData n) m) => HasTasks m where
267267 getTasks = asks tasks >>= liftIO . readIORef
268268
269+instance (MonadReader (ServerData m) m, StaticPQ m, MonadUnliftIO m) => HasGithubStatus m where
270+ schedulePendingStatus nOwner@(N owner) nRepo@(N repo) nCommit@(N sha) = do
271+ h <- asks baseUrl
272+ c <- asks context
273+ scheduleTask $
274+ StatusUpdate
275+ nOwner
276+ nRepo
277+ nCommit
278+ ( NewStatus
279+ StatusPending
280+ (Just . URL $ h <> "/submission/" <> owner <> "/" <> repo <> "/" <> sha)
281+ Nothing
282+ (Just c)
283+ )
284+ scheduleTestedStatus TestResult {..} nOwner@(N owner) nRepo@(N repo) nCommit@(N sha) = do
285+ h <- asks baseUrl
286+ c <- asks context
287+ let total = M.size tests
288+ passed = M.size . M.filter id $ tests
289+ description = T.pack $ show passed <> "/" <> show total
290+ status =
291+ StatusUpdate
292+ nOwner
293+ nRepo
294+ nCommit
295+ NewStatus
296+ { newStatusState =
297+ if total == passed then StatusSuccess else StatusFailure,
298+ newStatusTargetUrl = Just . URL $ h <> "/submission/" <> owner <> "/" <> repo <> "/" <> sha,
299+ newStatusDescription = Just description,
300+ newStatusContext = Just c
301+ }
302+ scheduleTask status
303+ scheduleFailedStatus _ nOwner@(N owner) nRepo@(N repo) nCommit@(N sha) = do
304+ h <- asks baseUrl
305+ c <- asks context
306+ let status =
307+ StatusUpdate
308+ nOwner
309+ nRepo
310+ nCommit
311+ NewStatus
312+ { newStatusState = StatusError,
313+ newStatusTargetUrl = Just . URL $ h <> "/submission/" <> owner <> "/" <> repo <> "/" <> sha,
314+ newStatusDescription = Just "Build failed",
315+ newStatusContext = Just c
316+ }
317+ scheduleTask status
318+
269319instance (MonadReader (ServerData n) m) => HasDockerInfo m where
270320 getDockerUrl = asks dockerUrl
271321