@@ -10,7 +10,6 @@ import Colog
1010import Control.AppRequestable
1111import Control.Concurrent
1212import Control.GithubCloner
13−import Control.HasGithubStatus
1413import Control.Monad.Except
1514import Control.Monad.IO.Unlift
1615import Control.Monad.Reader
@@ -30,7 +29,6 @@ import Data.Submission.Query
3029import Data.Tasks.Build
3130import Data.Tasks.StatusUpdate
3231import qualified Data.Text as T
33−import Data.Time.Clock
3432import Data.Yaml
3533import GHC.Generics
3634import GitHub hiding (Accept)
@@ -39,7 +37,7 @@ import GitHub.App.Request
3937import GitHub.Auth (Auth (OAuth))
4038import GitHub.Data.Name
4139import GitHub.Data.Webhooks.Events
42−import GitHub.Data.Webhooks.Payload hiding (URL (..))
40+import GitHub.Data.Webhooks.Payload
4341import Network.HTTP.Client.TLS (newTlsManager)
4442import Network.HTTP.Media.MediaType
4543import Network.Wai.Handler.Warp
@@ -50,6 +48,7 @@ import Server.Config
5048import Server.Html
5149import Server.Schema
5250import Squeal.PostgreSQL
51+import System.IO
5352import Text.Blaze.Html
5453import UnliftIO.Exception (catch, displayException, handleAny, throwIO, try)
5554
@@ -75,18 +74,17 @@ type API =
7574 :> Post '[HTML] Markup
7675 :<|> "results" :> Capture "task name" String :> Get '[CSV, HTML] [Score]
7776
78−webhookInstallation :: WithLog env Message m => RepoWebhookEvent -> ((), InstallationEvent) -> m ()
77+webhookInstallation :: MonadIO m => RepoWebhookEvent -> ((), InstallationEvent) -> m ()
7978webhookInstallation _ ((), ev) =
80− logInfo . T.pack . show $ ev
79+ liftIO $ do
80+ print ev
81+ hFlush stdout
82+
83+pendingStatus :: NewStatus
84+pendingStatus = NewStatus StatusPending Nothing Nothing Nothing
8185
8286webhookPushEvent ::
83− ( StaticPQ m,
84− MonadReader (ServerData m) m,
85− MonadUnliftIO m,
86− HasTasks m,
87− MonadError ServerError m,
88− WithLog env Message m
89− ) =>
87+ (StaticPQ m, WithLog env Message m, MonadUnliftIO m, HasTasks m, MonadError ServerError m) =>
9088 RepoWebhookEvent ->
9189 ((), PushEvent) ->
9290 m ()
@@ -104,32 +102,22 @@ webhookPushEvent _ ((), ev) = do
104102 M.takeWhileAntitone (repoName >) tasks
105103 case task of
106104 Just (name, TaskConfig {..}) | T.take (T.length name) repoName == name -> do
107− nowTime <- liftIO getCurrentTime
108− if nowTime > deadline
109− then do
110− deadlineHasPassedStatus (N owner) (N repoName) (N sha)
111− createSubmission $
112− Submission
113− user
114− (T.unpack fullRepoName)
115− (T.unpack name)
116− (T.unpack sha)
117− (Jsonb PastDeadline)
118− else do
119− schedulePendingStatus (N owner) (N repoName) (N sha)
120− createSubmission $
121− Submission
122− user
123− (T.unpack fullRepoName)
124− (T.unpack name)
125− (T.unpack sha)
126− (Jsonb BuildScheduled)
127− scheduleTask $ Build prebuild dockerfile (N owner) (N repoName) (N sha) timeoutMinutes
128− logInfo . T.pack . show $ ev
105+ scheduleTask $ StatusUpdate (N owner) (N repoName) (N sha) pendingStatus
106+ createSubmission $
107+ Submission
108+ user
109+ (T.unpack fullRepoName)
110+ (T.unpack name)
111+ (T.unpack sha)
112+ (Jsonb BuildScheduled)
113+ scheduleTask $ Build prebuild dockerfile (N owner) (N repoName) (N sha) timeoutMinutes
114+ liftIO $ do
115+ print ev
116+ hFlush stdout
129117 _ -> return ()
130118
131119retestSubmission ::
132− (StaticPQ m, MonadReader (ServerData m) m, MonadUnliftIO m, HasTasks m, MonadHasBaseUrl m) =>
120+ (StaticPQ m, WithLog env Message m, MonadUnliftIO m, HasTasks m, MonadHasBaseUrl m) =>
133121 String ->
134122 String ->
135123 String ->
@@ -148,7 +136,7 @@ retestSubmission owner repoName sha = do
148136 M.takeWhileAntitone (repoName' >) tasks
149137 case task of
150138 Just (name, TaskConfig {..}) | T.take (T.length name) repoName' == name -> do
151− schedulePendingStatus (N owner') (N repoName') (N sha')
139+ scheduleTask $ StatusUpdate (N owner') (N repoName') (N sha') pendingStatus
152140 updateSubmissionStatus fullRepoName sha BuildScheduled
153141 scheduleTask $ Build prebuild dockerfile (N owner') (N repoName') (N sha') timeoutMinutes
154142 _ -> return ()
@@ -175,9 +163,9 @@ instance MonadError ServerError (ServerM schema) where
175163server :: ServerT API (ServerM Schema)
176164server = (webhookInstallation :<|> webhookPushEvent) :<|> getSubmissionR :<|> retestSubmission :<|> getResults
177165
178−runServer :: FilePath -> IO ()
179−runServer config = do
180− c@Config {..} <- getConfig config
166+runServer :: IO ()
167+runServer = do
168+ c@Config {..} <- getConfig
181169 print c
182170 pem <- BS.readFile appPkPemPath
183171 appPkPem <- case readRsaPem pem of
@@ -198,19 +186,13 @@ runServer config = do
198186 tasks = ts,
199187 logger = cfilter ((logSeverity <=) . msgSeverity) richMessageAction,
200188 baseUrl = baseSiteUrl,
201− dockerUrl = T.pack cfgDockerUrl,
202− context = githubContext
189+ dockerUrl = T.pack cfgDockerUrl
203190 }
204191 repeatIfNotEmpty n f = f >>= \m -> do
205192 when (m == 0) $ liftIO $ threadDelay n
206193 repeatIfNotEmpty n f
207194 printingErrors =
208195 handleAny (logError . T.pack . displayException >=> const (return 0))
209− usingConnectionPool pool
210− . (`runReaderT` serverData)
211− . unApp
212− . handleAny (error . displayException)
213− $ makeAllRunnable
214196 replicateM_ builderCount
215197 $ forkIO . repeatIfNotEmpty (10 ^ (6 :: Int))
216198 . usingConnectionPool pool
@@ -243,9 +225,8 @@ data ServerData m
243225 { githubAppAuth :: !InstallationAuth,
244226 tasks :: IORef TasksConfig,
245227 logger :: LogAction m Message,
246− baseUrl :: T.Text,
247− dockerUrl :: T.Text,
248− context :: T.Text
228+ baseUrl :: String,
229+ dockerUrl :: T.Text
249230 }
250231
251232newtype PolyGitHubKey = PolyGitHubKey (forall result. GitHubKey result)
@@ -280,71 +261,6 @@ instance MonadReader (ServerData n) m => MonadHasBaseUrl m where
280261instance (MonadIO m, MonadReader (ServerData n) m) => HasTasks m where
281262 getTasks = asks tasks >>= liftIO . readIORef
282263
283−instance (MonadReader (ServerData m) m, StaticPQ m, MonadUnliftIO m) => HasGithubStatus m where
284− schedulePendingStatus nOwner@(N owner) nRepo@(N repo) nCommit@(N sha) = do
285− h <- asks baseUrl
286− c <- asks context
287− scheduleTask $
288− StatusUpdate
289− nOwner
290− nRepo
291− nCommit
292− ( NewStatus
293− StatusPending
294− (Just . URL $ h <> "/submission/" <> owner <> "/" <> repo <> "/" <> sha)
295− (Just "⌛")
296− (Just c)
297− )
298− scheduleTestedStatus TestResult {..} nOwner@(N owner) nRepo@(N repo) nCommit@(N sha) = do
299− h <- asks baseUrl
300− c <- asks context
301− let total = M.size tests
302− passed = M.size . M.filter id $ tests
303− description = T.pack $ show passed <> "/" <> show total <> if passed == total then " ✅" else " ❌"
304− status =
305− StatusUpdate
306− nOwner
307− nRepo
308− nCommit
309− NewStatus
310− { newStatusState =
311− if total == passed then StatusSuccess else StatusFailure,
312− newStatusTargetUrl = Just . URL $ h <> "/submission/" <> owner <> "/" <> repo <> "/" <> sha,
313− newStatusDescription = Just description,
314− newStatusContext = Just c
315− }
316− scheduleTask status
317− scheduleFailedStatus _ nOwner@(N owner) nRepo@(N repo) nCommit@(N sha) = do
318− h <- asks baseUrl
319− c <- asks context
320− let status =
321− StatusUpdate
322− nOwner
323− nRepo
324− nCommit
325− NewStatus
326− { newStatusState = StatusError,
327− newStatusTargetUrl = Just . URL $ h <> "/submission/" <> owner <> "/" <> repo <> "/" <> sha,
328− newStatusDescription = Just "Build failed ☠️",
329− newStatusContext = Just c
330− }
331− scheduleTask status
332− deadlineHasPassedStatus nOwner@(N owner) nRepo@(N repo) nCommit@(N sha) = do
333− h <- asks baseUrl
334− c <- asks context
335− let status =
336− StatusUpdate
337− nOwner
338− nRepo
339− nCommit
340− NewStatus
341− { newStatusState = StatusError,
342− newStatusTargetUrl = Just . URL $ h <> "/submission/" <> owner <> "/" <> repo <> "/" <> sha,
343− newStatusDescription = Just "The deadline has passed ⏰",
344− newStatusContext = Just c
345− }
346− scheduleTask status
347−
348264instance (MonadReader (ServerData n) m) => HasDockerInfo m where
349265 getDockerUrl = asks dockerUrl
350266
@@ -354,8 +270,7 @@ data TaskConfig
354270 = TaskConfig
355271 { prebuild :: String,
356272 dockerfile :: String,
357− timeoutMinutes :: Int,
358− deadline :: UTCTime
273+ timeoutMinutes :: Int
359274 }
360275 deriving stock (Show, Eq, Generic)
361276 deriving anyclass (FromJSON, ToJSON)