mirror of
https://github.com/commercialhaskell/stackage.git
synced 2026-01-12 07:18:31 +01:00
89 lines
2.7 KiB
Haskell
89 lines
2.7 KiB
Haskell
{-# LANGUAGE NoImplicitPrelude #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE RecordWildCards #-}
|
|
module Stackage2.CompleteBuild
|
|
( BuildType (..)
|
|
, completeBuild
|
|
) where
|
|
import Data.Default.Class (def)
|
|
import Data.Time
|
|
import Data.Yaml (encodeFile)
|
|
import Network.HTTP.Client
|
|
import Stackage2.BuildConstraints
|
|
import Stackage2.BuildPlan
|
|
import Stackage2.CheckBuildPlan
|
|
import Stackage2.PerformBuild
|
|
import Stackage2.Prelude
|
|
import Stackage2.ServerBundle
|
|
import Stackage2.UpdateBuildPlan
|
|
import Stackage2.Upload
|
|
import System.IO (BufferMode (LineBuffering), hSetBuffering)
|
|
|
|
data BuildType = Nightly | LTS
|
|
|
|
data Settings = Settings
|
|
{ plan :: BuildPlan
|
|
, planFile :: FilePath
|
|
, buildDir :: FilePath
|
|
, title :: Text -> Text -- ^ GHC version -> title
|
|
, slug :: Text
|
|
, setArgs :: Text -> UploadBundle -> UploadBundle
|
|
}
|
|
|
|
getSettings :: BuildType -> IO Settings
|
|
getSettings Nightly = do
|
|
day <- tshow . utctDay <$> getCurrentTime
|
|
let slug' = "nightly-" ++ day
|
|
plan' <- defaultBuildConstraints >>= newBuildPlan
|
|
return Settings
|
|
{ planFile = fpFromText ("nightly-" ++ day) <.> "yaml"
|
|
, buildDir = fpFromText $ "/tmp/stackage-nightly-" ++ day
|
|
, title = \ghcVer -> concat
|
|
[ "Stackage Nightly "
|
|
, day
|
|
, ", GHC "
|
|
, ghcVer
|
|
]
|
|
, slug = slug'
|
|
, setArgs = \ghcVer ub -> ub { ubNightly = Just ghcVer }
|
|
, plan = plan'
|
|
}
|
|
|
|
completeBuild :: BuildType -> IO ()
|
|
completeBuild buildType = withManager defaultManagerSettings $ \man -> do
|
|
hSetBuffering stdout LineBuffering
|
|
|
|
Settings {..} <- getSettings buildType
|
|
encodeFile (fpToString planFile) plan
|
|
checkBuildPlan plan
|
|
let pb = PerformBuild
|
|
{ pbPlan = plan
|
|
, pbInstallDest = buildDir
|
|
, pbLogDir = buildDir </> "logs"
|
|
, pbLog = hPut stdout
|
|
, pbJobs = 8
|
|
}
|
|
performBuild pb
|
|
|
|
token <- readFile "/auth-token"
|
|
now <- epochTime
|
|
let ghcVer = display $ siGhcVersion $ bpSystemInfo plan
|
|
ident <- flip uploadBundle man $ setArgs ghcVer def
|
|
{ ubContents = serverBundle now (title ghcVer) slug plan
|
|
, ubAuthToken = decodeUtf8 token
|
|
, ubAlias = Just slug
|
|
}
|
|
|
|
uploadDocs UploadDocs
|
|
{ udServer = def
|
|
, udAuthToken = decodeUtf8 token
|
|
, udDocs = pbDocDir pb
|
|
, udSnapshot = ident
|
|
} man >>= print
|
|
|
|
creds <- readFile "/hackage-creds"
|
|
case map encodeUtf8 $ words $ decodeUtf8 creds of
|
|
[username, password] ->
|
|
uploadHackageDistro plan username password man >>= print
|
|
_ -> return ()
|