hercules-ci-agent 0.10.1 → 0.10.2
raw patch · 15 files changed
+97/−24 lines, 15 filesdep ~hercules-ci-api-corePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: hercules-ci-api-core
API changes (from Hackage documentation)
Files
- CHANGELOG.md +12/−0
- cbits/hercules-error.cxx +5/−2
- data/default-herculesCI-for-flake.nix +4/−1
- hercules-ci-agent-worker/Hercules/Agent/Worker.hs +0/−1
- hercules-ci-agent-worker/Hercules/Agent/Worker/Build/Logger.hs +7/−3
- hercules-ci-agent-worker/Hercules/Agent/Worker/Build/Prefetched.hs +6/−2
- hercules-ci-agent.cabal +2/−2
- hercules-ci-agent/Hercules/Agent/Cachix.hs +7/−0
- hercules-ci-agent/Hercules/Agent/Client.hs +0/−1
- hercules-ci-agent/Hercules/Agent/Config.hs +9/−3
- hercules-ci-agent/Hercules/Agent/Config/Combined.hs +3/−0
- hercules-ci-agent/Hercules/Agent/Config/Json.hs +21/−2
- hercules-ci-agent/Hercules/Agent/Init.hs +1/−1
- hercules-ci-agent/Hercules/Agent/Nix/Init.hs +11/−3
- test/Hercules/Agent/ConfigSpec.hs +9/−3
CHANGELOG.md view
@@ -5,6 +5,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased++### Added++ - Add `nixSettings` configuration item, to more easily configure Nix settings such as `substituters`, overriding the system Nix settings.+ - Cachix 1.7.2 support++### Fixed++ - Remove most uses of `c_str()`, of which at least one exhibited undefined behavior.+ - `nix-darwin` module now reads `system` correctly from the configuration.+ ## [0.10.1] - 2024-02-12 ### Changed
cbits/hercules-error.cxx view
@@ -1,5 +1,8 @@ #include "hercules-error.hh"+#include "hercules-ci-cnix/string.hxx" +using namespace hercules_ci_cnix;+ void hercules::copyErrorStrings(const nix::Error &err, const char **msgStrPtr, const char **traceStrPtr) noexcept { std::string msg;@@ -7,7 +10,7 @@ std::stringstream s; nix::showErrorInfo(s, err.info(), false); msg = s.str();- *msgStrPtr = strdup(msg.c_str());+ *msgStrPtr = stringdup(msg); } // There's no method for getting just the trace, short of@@ -24,6 +27,6 @@ t = nix::trim(t); } - *traceStrPtr = strdup(t.c_str());+ *traceStrPtr = stringdup(t); } }
data/default-herculesCI-for-flake.nix view
@@ -52,7 +52,10 @@ then attrs: attrs else intersectAttrs ciSystems; - getSystemNixDarwin = sys: sys.config.nixpkgs.system;+ getSystemNixDarwin = sys:+ if sys?options.nixpkgs.hostPlatform && sys.options.nixpkgs.hostPlatform.isDefined+ then sys.config.nixpkgs.buildPlatform.system+ else sys.config.nixpkgs.localSystem.system or sys.config.nixpkgs.system; getSystemNixOS = sys: if sys?options.nixpkgs.hostPlatform && sys.options.nixpkgs.hostPlatform.isDefined
hercules-ci-agent-worker/Hercules/Agent/Worker.hs view
@@ -11,7 +11,6 @@ import Conduit import Control.Concurrent.STM hiding (check)-import Control.Monad.Except import Control.Monad.IO.Unlift import Data.Aeson qualified as A import Data.Binary qualified as B
hercules-ci-agent-worker/Hercules/Agent/Worker/Build/Logger.hs view
@@ -41,12 +41,16 @@ C.include "<nix/globals.hh>" +C.include "<hercules-ci-cnix/string.hxx>"+ C.include "hercules-aliases.h" C.include "hercules-logger.hh" C.using "namespace nix" +C.using "namespace hercules_ci_cnix"+ initLogger :: IO () initLogger = [C.throwBlock| void {@@ -134,11 +138,11 @@ const HerculesLogger::LogEntry &ln = *$(HerculesLoggerEntry *logEntryPtr); switch (ln.entryType) { case 1:- *$(const char **textStrPtr) = strdup(ln.text.c_str());+ *$(const char **textStrPtr) = stringdup(ln.text); *$(int *levelPtr) = ln.level; return ln.entryType; case 2:- *$(const char **textStrPtr) = strdup(ln.text.c_str());+ *$(const char **textStrPtr) = stringdup(ln.text); *$(int *levelPtr) = ln.level; *$(uint64_t *activityIdPtr) = ln.activityId; *$(uint64_t *typePtr) = ln.type;@@ -229,7 +233,7 @@ *$(uint64_t *uintPtr) = field.i; return 0; case nix::Logger::Field::tString:- *$(const char **stringPtr) = strdup(field.s.c_str());+ *$(const char **stringPtr) = stringdup(field.s); return 1; default: return -1;
hercules-ci-agent-worker/Hercules/Agent/Worker/Build/Prefetched.hs view
@@ -58,8 +58,12 @@ C.include "<hercules-ci-cnix/store.hxx>" +C.include "<hercules-ci-cnix/string.hxx>"+ C.using "namespace nix" +C.using "namespace hercules_ci_cnix"+ data BuildStatus = Built | Substituted@@ -172,7 +176,7 @@ printError(e.msg()); status = -2; success = false;- errorMessage = strdup(e.msg().c_str());+ errorMessage = stringdup(e.msg()); startTime = 0; stopTime = 0; }@@ -236,7 +240,7 @@ } printError(result.errorMsg); success = result.success();- errorMessage = strdup(result.errorMsg.c_str());+ errorMessage = stringdup(result.errorMsg); startTime = result.startTime; stopTime = result.stopTime; }
hercules-ci-agent.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.4 name: hercules-ci-agent-version: 0.10.1+version: 0.10.2 synopsis: Runs Continuous Integration tasks on your machines category: Nix, CI, Testing, DevOps homepage: https://docs.hercules-ci.com@@ -267,7 +267,7 @@ , filepath , hercules-ci-agent , hercules-ci-api- , hercules-ci-api-core == 0.1.6.0+ , hercules-ci-api-core == 0.1.7.0 , hercules-ci-api-agent == 0.5.1.0 , hostname , http-client
hercules-ci-agent/Hercules/Agent/Cachix.hs view
@@ -25,6 +25,9 @@ import qualified Hercules.Formats.CachixCache as CachixCache import Protolude import qualified Hercules.CNix as CNix+#if MIN_VERSION_cachix(1,7,2)+import qualified Cachix.Client.OptionsParser as Opts+#endif push :: CNix.Store -> Text -> [StorePath] -> Int -> App () push nixStore cache paths workers = withNamedContext "cache" cache $ do@@ -76,6 +79,10 @@ #endif #if MIN_VERSION_cachix(1,6,0) onUncompressedNARStream = \_ _ -> Conduit.awaitForever Conduit.yield,+#endif+#if MIN_VERSION_cachix(1,7,2)+ chunkSize = Opts.defaultChunkSize,+ numConcurrentChunks = Opts.defaultNumConcurrentChunks, #endif omitDeriver = False }
hercules-ci-agent/Hercules/Agent/Client.hs view
@@ -20,7 +20,6 @@ import Hercules.API.Agent.Build (BuildAPI) import Hercules.API.Agent.Evaluate (EvalAPI) import Hercules.API.Agent.LifeCycle (LifeCycleAPI)-import Hercules.API.Agent.State (ContentLength) import Hercules.API.Agent.Tasks (TasksAPI) import Hercules.API.Logs (LogsAPI) import Hercules.API.Servant (useApi)
hercules-ci-agent/Hercules/Agent/Config.hs view
@@ -25,7 +25,8 @@ import Data.Profunctor (Star (Star)) import GHC.Conc (getNumProcessors) import Hercules.Agent.Config.Combined-import Hercules.Agent.Config.Json as Json+import Hercules.Agent.Config.Json (GCodec (GCodec), (.=.))+import Hercules.Agent.Config.Json qualified as Json import Hercules.Agent.Config.Toml qualified as Toml import Hercules.CNix.Verbosity (Verbosity (..)) import Hercules.Formats.Mountable (Mountable (Mountable))@@ -72,7 +73,8 @@ labels :: Item purpose 'Required (Map Text A.Value), allowInsecureBuiltinFetchers :: Item purpose 'Required Bool, remotePlatformsWithSameFeatures :: Item purpose 'Optional [Text],- effectMountables :: Map Text Mountable+ effectMountables :: Map Text Mountable,+ nixSettings :: Map Text Text } deriving (Generic) @@ -120,6 +122,9 @@ (Json.tableMap' (forJson mountableCodec) "effectMountables") ) .=. effectMountables+ <*> optEmpty+ (tableMap textAtKey "nixSettings")+ .=. nixSettings mountableCodec :: Combi' Mountable mountableCodec =@@ -233,5 +238,6 @@ labels = fromMaybe mempty $ labels input, allowInsecureBuiltinFetchers = fromMaybe False $ allowInsecureBuiltinFetchers input, remotePlatformsWithSameFeatures = remotePlatformsWithSameFeatures input,- effectMountables = effectMountables input+ effectMountables = effectMountables input,+ nixSettings = nixSettings input }
hercules-ci-agent/Hercules/Agent/Config/Combined.hs view
@@ -46,3 +46,6 @@ enumBoundedAtKey :: (Bounded a, Enum a, Show a) => Key -> Combi' a enumBoundedAtKey k = Combi (Data.Bifunctor.Product.Pair (Toml.enumBounded k) (Json.enumBounded k))++tableMap :: (Key -> Combi' a) -> Key -> Combi' (Map Text a)+tableMap c k = Combi $ Pair (Toml.tableMap Toml._KeyText (forToml . c) k) (Json.tableMap (forJson . c) k)
hercules-ci-agent/Hercules/Agent/Config/Json.hs view
@@ -39,6 +39,7 @@ dimap, first, match,+ tableMap, _EnumBounded, _Text, _TextBy,@@ -250,12 +251,30 @@ Key -> JsonCodec' (Map Text v) tableMap' valCodec key =+ tableMap+ ( \k ->+ GCodec+ { gRead =+ local+ (\v -> fromMaybe (panic "tableMap': key disappeared") (v ^? at' k))+ (gRead valCodec),+ gWrite = do+ panic "tableMap': write not implemented"+ }+ )+ key++tableMap ::+ (Key -> JsonCodec' v) ->+ Key ->+ JsonCodec' (Map Text v)+tableMap valCodec key = let c = match (prismWithError "JSON Object expected" (Aeson.Lens._Object . aesonMap)) key in GCodec { gRead = do x <- gRead c- fmap M.fromList $ for (M.toList x) $ \(k, v) -> do- v' <- local (const v) $ gRead valCodec+ fmap M.fromList $ for (M.toList x) $ \(k, _v) -> do+ v' <- gRead (valCodec (key <> (Key $ Piece k :| []))) pure (k, v'), gWrite = do panic "tableMap': write not implemented"
hercules-ci-agent/Hercules/Agent/Init.hs view
@@ -40,7 +40,7 @@ concPushes <- newMemo concQueries <- newMemo withLogging $ Hercules.Agent.Cachix.Init.withEnv config (BC.cachixCaches bcs) \cachix -> liftIO do- nix <- Hercules.Agent.Nix.Init.newEnv+ nix <- Hercules.Agent.Nix.Init.newEnv config serviceInfo <- ServiceInfo.newEnv clientEnv let env = Env
hercules-ci-agent/Hercules/Agent/Nix/Init.hs view
@@ -1,11 +1,19 @@+{-# LANGUAGE DataKinds #-}+ module Hercules.Agent.Nix.Init where +import Data.Map qualified as M+import Hercules.Agent.Config (Config, Purpose (Final))+import Hercules.Agent.Config qualified import Hercules.Agent.EnvironmentInfo qualified as EnvironmentInfo import Hercules.Agent.Nix.Env+import Hercules.CNix qualified as CNix import Protolude -newEnv :: IO Env-newEnv = do+newEnv :: Config 'Final -> IO Env+newEnv config = do+ for_ (M.toList config.nixSettings) $ \(k, v) -> do+ CNix.setGlobalOption k v nixInfo <- EnvironmentInfo.getNixInfo when (EnvironmentInfo.nixNarinfoCacheNegativeTTL nixInfo /= 0) $ do putErrText@@ -33,5 +41,5 @@ -- extraOptions here. pure Env- { extraOptions = []+ { extraOptions = M.toList config.nixSettings }
test/Hercules/Agent/ConfigSpec.hs view
@@ -45,6 +45,8 @@ "workDirectory = \"/var/lib/hercules-ci-agent/work\"", "remotePlatformsWithSameFeatures = [\"aarch64-darwin\"]", "nixVerbosity = \"vomit\"",+ "[nixSettings]",+ " substituters = \"https://example.com\"", -- This line should not be needed! "[effectMountables]", "[effectMountables.hosts]",@@ -91,7 +93,8 @@ condition = Hercules.Formats.Secret.Const True } )- ]+ ],+ nixSettings = M.singleton "substituters" "https://example.com" } ) it "parses empty config" $ do@@ -119,6 +122,7 @@ "\"secretsJsonPath\": \"/var/lib/hercules-ci-agent/secrets/secrets.json\",", "\"logLevel\": \"DebugS\",", "\"nixVerbosity\": \"Vomit\",",+ "\"nixSettings\": { \"substituters\": \"https://example.com\" },", "\"remotePlatformsWithSameFeatures\": [\"aarch64-darwin\"],", "\"labels\": {", " \"agent\": {\"source\": \"flake\"},",@@ -169,7 +173,8 @@ condition = Hercules.Formats.Secret.Const True } )- ]+ ],+ nixSettings = M.singleton "substituters" "https://example.com" } it "handles empty config" $ do@@ -232,5 +237,6 @@ labels = Nothing, allowInsecureBuiltinFetchers = Nothing, remotePlatformsWithSameFeatures = Nothing,- effectMountables = mempty+ effectMountables = mempty,+ nixSettings = mempty }