At least terraform wants all parameters passed via JSON to be strings. It can't accept maps. This means, allowing to pass a `argstr` JSON dict isn't really possible. However, terraform is perfectly able to JSON-encode a map. So accept a `argstr_json` argument instead, which `jq` will JSON-decode before further processing it. I dropped `argstr` support again so the jq expression still fits on my screen, if anyone else (started) using this, I'm happy to review a CL adding this. We should probably move the jq expression to some multiline format then, though. Change-Id: I5ab7a1169ab7305d3ab02db31c27732d9d1ab4e8 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11228 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
		
			
				
	
	
		
			47 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| 
 | |
| # SPDX-FileCopyrightText: 2023 The TVL Authors
 | |
| #
 | |
| # SPDX-License-Identifier: MIT
 | |
| set -ueo pipefail
 | |
| 
 | |
| # Evaluates a Nix expression.
 | |
| #
 | |
| # Receives input parameters as JSON from stdin.
 | |
| # It expects a dict with the following keys:
 | |
| #
 | |
| #  - `attrpath`: the attribute.path pointing to the expression to instantiate.
 | |
| #    Required.
 | |
| #  - `entrypoint`: the path to the Nix file to invoke.
 | |
| #    Optional. If omitted, will shell out to git to determine the repo root,
 | |
| #    and Nix will use `default.nix` in there.
 | |
| #  - `argstr_json`: A string JSON-encoding a map containing string keys and
 | |
| #    values which should be passed to Nix as `--argstr $key $value`.
 | |
| #    command line args. Optional.
 | |
| #  - `build`: A boolean (or string being "true" or "false") stating whether the
 | |
| #    expression should also be built/substituted on the machine executing this script.
 | |
| #
 | |
| # jq's @sh format takes care of escaping.
 | |
| eval "$(jq -r '@sh "attrpath=\(.attrpath) && entrypoint=\(.entrypoint) && argstr=\((.argstr_json // "{}"|fromjson) | to_entries | map ("--argstr", .key, .value) | join(" ")) build=\(.build)"')"
 | |
| 
 | |
| # Evaluate the expression.
 | |
| [[ -z "$entrypoint" ]] && entrypoint=$(git rev-parse --show-toplevel)
 | |
| # shellcheck disable=SC2086,SC2154
 | |
| drv=$(nix-instantiate -A "${attrpath}" "${entrypoint}" ${argstr})
 | |
| 
 | |
| # If `build` is set to true, invoke nix-build on the .drv.
 | |
| # We need to swallow all stdout, to not garble the JSON printed later.
 | |
| # shellcheck disable=SC2154
 | |
| if [ "${build}" == "true" ]; then
 | |
|   nix-build --no-out-link "${drv}" > /dev/null
 | |
| fi
 | |
| 
 | |
| # Determine the output path.
 | |
| outPath=$(nix show-derivation "${drv}" | jq -r ".\"${drv}\".outputs.out.path")
 | |
| 
 | |
| # Return a JSON back to stdout.
 | |
| # It contains the following keys:
 | |
| #
 | |
| # - `drv`: the store path of the Derivation that has been instantiated.
 | |
| # - `outPath`: the output store path.
 | |
| jq -n --arg drv "$drv" --arg outPath "$outPath" '{"drv":$drv, "outPath":$outPath}'
 |