Deployment and lifecycle management for Nix
0
fork

Configure Feed

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

cli: fix error handling, add memory limit option

+64 -30
+1 -1
apps/nix/lib/nix/build.ex
··· 162 162 defp finalize_output(output) when is_list(output) do 163 163 output 164 164 |> Enum.reverse() 165 - |> Enum.join("\n") 165 + |> Enum.flat_map(&String.split(&1, "\n")) 166 166 end 167 167 168 168 defp finalize_output(output), do: output
+8
apps/sower_cli/lib/sower_cli.ex
··· 128 128 help: "Evaluation type: auto, flake, or path (default: auto)", 129 129 parser: &parse_nix_type/1, 130 130 default: :auto 131 + ], 132 + memory_limit: [ 133 + short: "-m", 134 + long: "--memory-limit", 135 + value_name: "MB", 136 + help: "Memory limit per evaluation in MB (default: 4000)", 137 + parser: :integer, 138 + default: 4_000 131 139 ] 132 140 ] 133 141 ]
+54 -28
apps/sower_cli/lib/sower_cli/build.ex
··· 90 90 opts = [ 91 91 workers: state.options.jobs, 92 92 type: state.options.eval_type, 93 - use_eval_cache: state.flags.use_eval_cache 93 + use_eval_cache: state.flags.use_eval_cache, 94 + memory_limit_kb: state.options.memory_limit * 1_000 94 95 ] 95 96 96 97 case Nix.Eval.Jobs.run(state.flake, opts) do ··· 133 134 if state.flags.fail_fast do 134 135 {:error, :build_failed} 135 136 else 136 - if not Enum.all?(builds, &(&1.status == :ok)) do 137 + successful = Enum.filter(builds, &(&1.status == :ok)) 138 + 139 + if Enum.empty?(successful) do 137 140 {:error, :build_failed} 138 141 else 139 - run_steps(rest, %{state | builds: builds}) 142 + run_steps(rest, %{state | builds: successful}) 140 143 end 141 144 end 142 145 end ··· 190 193 191 194 client = SowerClient.ApiClient.new() 192 195 193 - Enum.each(state.builds, fn 194 - %Nix.Build{ 195 - eval: %Nix.Eval{ 196 - output: %{ 197 - "meta" => %{ 198 - "sower" => %{ 199 - "seed" => seed_meta 196 + results = 197 + Enum.map(state.builds, fn 198 + %Nix.Build{ 199 + eval: %Nix.Eval{ 200 + output: %{ 201 + "meta" => %{ 202 + "sower" => %{ 203 + "seed" => seed_meta 204 + } 200 205 } 201 206 } 202 207 } 203 - } 204 - } = build -> 205 - tags = load_tags(state) ++ Map.get(seed_meta, "tags", []) ++ SowerCli.Repo.get_tags() 208 + } = build -> 209 + tags = load_tags(state) ++ Map.get(seed_meta, "tags", []) ++ SowerCli.Repo.get_tags() 206 210 207 - case seed_meta 208 - |> Map.put("tags", tags) 209 - |> Map.put("artifact", build.store_path) 210 - |> SowerClient.Seed.cast() do 211 - {:ok, seed} -> 212 - SowerClient.Seed.create(client, seed) 211 + case seed_meta 212 + |> Map.put("tags", tags) 213 + |> Map.put("artifact", build.store_path) 214 + |> SowerClient.Seed.cast() do 215 + {:ok, seed} -> 216 + case SowerClient.Seed.create(client, seed) do 217 + {:ok, _} = result -> 218 + result 213 219 214 - {:error, error} -> 215 - Logger.error(msg: "Failed to submit seed", error: error, seed_meta: seed_meta) 216 - :error 217 - end 220 + {:error, reason} = error -> 221 + Output.error("Failed to register seed: #{inspect(reason)}") 222 + error 223 + end 224 + 225 + {:error, error} -> 226 + Output.error("Failed to cast seed: #{inspect(error)}") 227 + {:error, {:cast_failed, error}} 228 + end 229 + 230 + %Nix.Build{eval: eval} -> 231 + Logger.debug(msg: "Eval is missing sower seed metadata", eval: eval) 232 + :skip 233 + end) 218 234 219 - %Nix.Build{eval: eval} -> 220 - Logger.debug(msg: "Eval is missing sower seed metadata", eval: eval) 221 - :skip 222 - end) 235 + errors = 236 + results 237 + |> Enum.filter(fn 238 + {:error, _} -> true 239 + _ -> false 240 + end) 223 241 224 - run_steps(rest, state) 242 + if Enum.empty?(errors) do 243 + run_steps(rest, state) 244 + else 245 + if state.flags.fail_fast do 246 + {:error, :seed_failed} 247 + else 248 + run_steps(rest, state) 249 + end 250 + end 225 251 end 226 252 227 253 defp load_tags(%__MODULE__{} = state) do
+1 -1
apps/sower_cli/lib/sower_cli/repo.ex
··· 97 97 98 98 defp git_rev(git) do 99 99 case System.cmd(git, ["rev-parse", "HEAD"], stderr_to_stdout: true) do 100 - {rev, 0} -> 100 + {rev, 0} when rev != "HEAD" -> 101 101 rev = String.trim(rev) 102 102 103 103 if git_dirty?(git), do: rev <> "-dirty", else: rev