Skip to content

Instantly share code, notes, and snippets.

@codrcodz
Last active April 29, 2021 12:51
Show Gist options
  • Save codrcodz/4508473b3bcf3aa5e10ea58791e5ecff to your computer and use it in GitHub Desktop.
Save codrcodz/4508473b3bcf3aa5e10ea58791e5ecff to your computer and use it in GitHub Desktop.
tflint Metadata Parser
#!/usr/bin/env bash
metadata_format="v0.1.0";
releases_metadata_file_prefix="releases_metadata";
# Function ensures all deps are in $PATH before continuing
dependency_check() {
deps="git go yq";
for dep in ${deps}; do
hash "${dep}" &>/dev/null \
||
{ \
echo -e "\n[FAIL] Could not find dep ($dep) in \$PATH; exiting." 1>&2;
exit 1;
};
done;
};
# Function that uses `git` commit metadata to parse and sort commits by timestamp into an autosorted bash array
# Parses `tflint` version tag info from `git` tags to identify each `tflint` release
# Parses compatible `terraform` version from output of `go list` for each `tflint` release
# Uses parsed metadata to print YAML file contents with relevant release metadata for each `tflint` release
parse_metadata() {
{ \
echo "---" \
&& echo "metadata_format: \"${1}\"" \
&& echo "tflint_releases:" \
&& while read -r timestamp _ tag hash; do \
releases_array[${timestamp}]="${tag} ${hash}"; \
done < <( \
git \
for-each-ref \
--format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' \
refs/tags \
2>/dev/null\
) \
&& while read -r tag hash; do \
git checkout -q "${hash}" \
&& echo " - tflint_version: \"${tag//*v}\"" \
&& echo " terraform_version: \"$( \
go \
list \
-m \
-f '{{ .Version }}' github.com/hashicorp/terraform \
2>/dev/null \
|| \
echo \
"unknown"; \
)\""; \
done < <( \
for release in "${releases_array[@]}"; do \
echo "${release}"; \
done; \
) \
&& echo "...";
} \
||
{ \
echo -e "\n[FAIL] Failed to parse tflint release metadata and/or output metadata to yaml file; exiting." 1>&2;
exit 1;
};
};
# Converts valid YAML file contents into valid JSON file contents
convert_yaml_to_json() {
if [[ -f "${1}" ]]; then
yq '.' "${1}" \
||
{ \
echo -e "\n[FAIL] Failed to convert YAML file (${1}) to JSON format; exiting." 1>&2;
exit 1;
};
else
echo -e "\n[FAIL] YAML file (${1}) not available for conversion to JSON format; exiting." 1>&2;
exit 1;
fi;
};
# Converts valid YAML file contents into valid Bash file contents
# To use, download file and `source ${filename}` to ingest variables
# Avoids associative arrays for compatibility purposes (Only requires Bash v3+)
convert_yaml_to_bash() {
{ \
echo -e "#!/usr/bin/env bash\n" \
&& echo "metadata_format=\"${2}\"" \
&& arrays=( \
"tflint_version" \
"terraform_version" \
) \
&& for array in "${arrays[@]}"; do
echo "declare -a ${array}";
while read -r line; do
if [[ "${line}" =~ ${array}:.* ]]; then
echo "${array}+=${BASH_REMATCH//$array: }";
fi
done < "${1}";
done;
} \
||
{ \
echo -e "\n[FAIL] Failed to convert YAML file (${1}) to Bash format; exiting." 1>&2;
exit 1;
};
};
# Main function that executes the functions defined elsewhere
# Builds YAML file first, then bases JSON and Bash files contents on YAML file contents
main() {
{ \
dependency_check \
&& echo -e "\n[INFO] Creating YAML version of releases metadata file (${1}.yaml)." \
&& parse_metadata "${2}" > "./${1}.yaml" \
&& echo -e "\n[INFO] Creating JSON version of releases metadata file (${1}.json)." \
&& convert_yaml_to_json "./${1}.yaml" > "./${1}.json" \
&& echo -e "\n[INFO] Creating Bash version of releases metadata file (${1}.bash)." \
&& convert_yaml_to_bash "./${1}.yaml" "${2}" > "./${1}.bash";
} \
||
{ \
echo -e "\n[FAIL] Failed to create one or more releases metadata files; exiting." 1>&2;
exit 1;
};
};
main "${releases_metadata_file_prefix}" "${metadata_format}";
[codz@dt tflint]$
[codz@dt tflint]$ cd .release_metadata/
[codz@dt .release_metadata]$ tree
.
├── metadata_parser.sh
├── releases_metadata.bash
├── releases_metadata.json
└── releases_metadata.yaml
0 directories, 4 files
[codz@dt .release_metadata]$ ./metadata_parser.sh
[INFO] Creating YAML version of releases metadata file (releases_metadata.yaml).
[INFO] Creating JSON version of releases metadata file (releases_metadata.json).
[INFO] Creating Bash version of releases metadata file (releases_metadata.bash).
[codz@dt .release_metadata]$ cat releases_metadata.*
#!/usr/bin/env bash
metadata_format="v0.1.0"
declare -a tflint_version
tflint_version+="0.1.0"
tflint_version+="0.2.0"
tflint_version+="0.2.1"
tflint_version+="0.3.0"
tflint_version+="0.3.1"
tflint_version+="0.3.2"
tflint_version+="0.3.3"
tflint_version+="0.3.4"
tflint_version+="0.3.5"
tflint_version+="0.3.6"
tflint_version+="0.4.0"
tflint_version+="0.4.1"
tflint_version+="0.4.2"
tflint_version+="0.4.3"
tflint_version+="0.5.0"
tflint_version+="0.5.1"
tflint_version+="0.5.2"
tflint_version+="0.5.3"
tflint_version+="0.5.4"
tflint_version+="0.6.0"
tflint_version+="0.7.0"
tflint_version+="0.7.1"
tflint_version+="0.7.2"
tflint_version+="0.7.3"
tflint_version+="0.7.4"
tflint_version+="0.7.5"
tflint_version+="0.7.6"
tflint_version+="0.8.0"
tflint_version+="0.8.1"
tflint_version+="0.8.2"
tflint_version+="0.8.3"
tflint_version+="0.9.0"
tflint_version+="0.9.1"
tflint_version+="0.9.2"
tflint_version+="0.9.3"
tflint_version+="0.10.0"
tflint_version+="0.10.1"
tflint_version+="0.10.2"
tflint_version+="0.10.3"
tflint_version+="0.11.0"
tflint_version+="0.11.1"
tflint_version+="0.11.2"
tflint_version+="0.12.0"
tflint_version+="0.12.1"
tflint_version+="0.13.0"
tflint_version+="0.13.1"
tflint_version+="0.13.2"
tflint_version+="0.13.3"
tflint_version+="0.13.4"
tflint_version+="0.14.0"
tflint_version+="0.15.0"
tflint_version+="0.15.1"
tflint_version+="0.15.2"
tflint_version+="0.15.3"
tflint_version+="0.15.4"
tflint_version+="0.15.5"
tflint_version+="0.16.0"
tflint_version+="0.16.1"
tflint_version+="0.16.2"
tflint_version+="0.17.0"
tflint_version+="0.18.0"
tflint_version+="0.19.0"
tflint_version+="0.19.1"
tflint_version+="0.20.0"
tflint_version+="0.20.1"
tflint_version+="0.20.2"
tflint_version+="0.20.3"
tflint_version+="0.21.0"
tflint_version+="0.22.0"
tflint_version+="0.23.0"
tflint_version+="0.23.1"
tflint_version+="0.24.0"
tflint_version+="0.24.1"
tflint_version+="0.25.0"
tflint_version+="0.26.0"
tflint_version+="0.27.0"
tflint_version+="0.28.0"
declare -a terraform_version
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="unknown"
terraform_version+="v0.12.0"
terraform_version+="v0.12.0"
terraform_version+="v0.12.1"
terraform_version+="v0.12.3"
terraform_version+="v0.12.3"
terraform_version+="v0.12.5"
terraform_version+="v0.12.6"
terraform_version+="v0.12.6"
terraform_version+="v0.12.6"
terraform_version+="v0.12.7"
terraform_version+="v0.12.7"
terraform_version+="v0.12.8"
terraform_version+="v0.12.8"
terraform_version+="v0.12.9"
terraform_version+="v0.12.9"
terraform_version+="v0.12.10"
terraform_version+="v0.12.15"
terraform_version+="v0.12.15"
terraform_version+="v0.12.17"
terraform_version+="v0.12.18"
terraform_version+="v0.12.18"
terraform_version+="v0.12.20"
terraform_version+="v0.12.21"
terraform_version+="v0.12.21"
terraform_version+="v0.12.23"
terraform_version+="v0.12.24"
terraform_version+="v0.12.24"
terraform_version+="v0.12.24"
terraform_version+="v0.12.25"
terraform_version+="v0.12.25"
terraform_version+="v0.12.26"
terraform_version+="v0.12.28"
terraform_version+="v0.12.28"
terraform_version+="v0.13.0"
terraform_version+="v0.13.0"
terraform_version+="v0.13.2"
terraform_version+="v0.13.2"
terraform_version+="v0.13.3"
terraform_version+="v0.13.4"
terraform_version+="v0.13.5"
terraform_version+="v0.14.2"
terraform_version+="v0.14.3"
terraform_version+="v0.14.3"
terraform_version+="v0.14.5"
terraform_version+="v0.14.5"
terraform_version+="v0.14.7"
terraform_version+="v0.14.9"
terraform_version+="v0.15.0"
terraform_version+="v0.15.0"
{
"metadata_format": "v0.1.0",
"tflint_releases": [
{
"tflint_version": "0.1.0",
"terraform_version": "unknown"
},
{
"tflint_version": "0.2.0",
"terraform_version": "unknown"
},
{
"tflint_version": "0.2.1",
"terraform_version": "unknown"
},
{
"tflint_version": "0.3.0",
"terraform_version": "unknown"
},
{
"tflint_version": "0.3.1",
"terraform_version": "unknown"
},
{
"tflint_version": "0.3.2",
"terraform_version": "unknown"
},
{
"tflint_version": "0.3.3",
"terraform_version": "unknown"
},
{
"tflint_version": "0.3.4",
"terraform_version": "unknown"
},
{
"tflint_version": "0.3.5",
"terraform_version": "unknown"
},
{
"tflint_version": "0.3.6",
"terraform_version": "unknown"
},
{
"tflint_version": "0.4.0",
"terraform_version": "unknown"
},
{
"tflint_version": "0.4.1",
"terraform_version": "unknown"
},
{
"tflint_version": "0.4.2",
"terraform_version": "unknown"
},
{
"tflint_version": "0.4.3",
"terraform_version": "unknown"
},
{
"tflint_version": "0.5.0",
"terraform_version": "unknown"
},
{
"tflint_version": "0.5.1",
"terraform_version": "unknown"
},
{
"tflint_version": "0.5.2",
"terraform_version": "unknown"
},
{
"tflint_version": "0.5.3",
"terraform_version": "unknown"
},
{
"tflint_version": "0.5.4",
"terraform_version": "unknown"
},
{
"tflint_version": "0.6.0",
"terraform_version": "unknown"
},
{
"tflint_version": "0.7.0",
"terraform_version": "unknown"
},
{
"tflint_version": "0.7.1",
"terraform_version": "unknown"
},
{
"tflint_version": "0.7.2",
"terraform_version": "unknown"
},
{
"tflint_version": "0.7.3",
"terraform_version": "unknown"
},
{
"tflint_version": "0.7.4",
"terraform_version": "unknown"
},
{
"tflint_version": "0.7.5",
"terraform_version": "unknown"
},
{
"tflint_version": "0.7.6",
"terraform_version": "unknown"
},
{
"tflint_version": "0.8.0",
"terraform_version": "unknown"
},
{
"tflint_version": "0.8.1",
"terraform_version": "v0.12.0"
},
{
"tflint_version": "0.8.2",
"terraform_version": "v0.12.0"
},
{
"tflint_version": "0.8.3",
"terraform_version": "v0.12.1"
},
{
"tflint_version": "0.9.0",
"terraform_version": "v0.12.3"
},
{
"tflint_version": "0.9.1",
"terraform_version": "v0.12.3"
},
{
"tflint_version": "0.9.2",
"terraform_version": "v0.12.5"
},
{
"tflint_version": "0.9.3",
"terraform_version": "v0.12.6"
},
{
"tflint_version": "0.10.0",
"terraform_version": "v0.12.6"
},
{
"tflint_version": "0.10.1",
"terraform_version": "v0.12.6"
},
{
"tflint_version": "0.10.2",
"terraform_version": "v0.12.7"
},
{
"tflint_version": "0.10.3",
"terraform_version": "v0.12.7"
},
{
"tflint_version": "0.11.0",
"terraform_version": "v0.12.8"
},
{
"tflint_version": "0.11.1",
"terraform_version": "v0.12.8"
},
{
"tflint_version": "0.11.2",
"terraform_version": "v0.12.9"
},
{
"tflint_version": "0.12.0",
"terraform_version": "v0.12.9"
},
{
"tflint_version": "0.12.1",
"terraform_version": "v0.12.10"
},
{
"tflint_version": "0.13.0",
"terraform_version": "v0.12.15"
},
{
"tflint_version": "0.13.1",
"terraform_version": "v0.12.15"
},
{
"tflint_version": "0.13.2",
"terraform_version": "v0.12.17"
},
{
"tflint_version": "0.13.3",
"terraform_version": "v0.12.18"
},
{
"tflint_version": "0.13.4",
"terraform_version": "v0.12.18"
},
{
"tflint_version": "0.14.0",
"terraform_version": "v0.12.20"
},
{
"tflint_version": "0.15.0",
"terraform_version": "v0.12.21"
},
{
"tflint_version": "0.15.1",
"terraform_version": "v0.12.21"
},
{
"tflint_version": "0.15.2",
"terraform_version": "v0.12.23"
},
{
"tflint_version": "0.15.3",
"terraform_version": "v0.12.24"
},
{
"tflint_version": "0.15.4",
"terraform_version": "v0.12.24"
},
{
"tflint_version": "0.15.5",
"terraform_version": "v0.12.24"
},
{
"tflint_version": "0.16.0",
"terraform_version": "v0.12.25"
},
{
"tflint_version": "0.16.1",
"terraform_version": "v0.12.25"
},
{
"tflint_version": "0.16.2",
"terraform_version": "v0.12.26"
},
{
"tflint_version": "0.17.0",
"terraform_version": "v0.12.28"
},
{
"tflint_version": "0.18.0",
"terraform_version": "v0.12.28"
},
{
"tflint_version": "0.19.0",
"terraform_version": "v0.13.0"
},
{
"tflint_version": "0.19.1",
"terraform_version": "v0.13.0"
},
{
"tflint_version": "0.20.0",
"terraform_version": "v0.13.2"
},
{
"tflint_version": "0.20.1",
"terraform_version": "v0.13.2"
},
{
"tflint_version": "0.20.2",
"terraform_version": "v0.13.3"
},
{
"tflint_version": "0.20.3",
"terraform_version": "v0.13.4"
},
{
"tflint_version": "0.21.0",
"terraform_version": "v0.13.5"
},
{
"tflint_version": "0.22.0",
"terraform_version": "v0.14.2"
},
{
"tflint_version": "0.23.0",
"terraform_version": "v0.14.3"
},
{
"tflint_version": "0.23.1",
"terraform_version": "v0.14.3"
},
{
"tflint_version": "0.24.0",
"terraform_version": "v0.14.5"
},
{
"tflint_version": "0.24.1",
"terraform_version": "v0.14.5"
},
{
"tflint_version": "0.25.0",
"terraform_version": "v0.14.7"
},
{
"tflint_version": "0.26.0",
"terraform_version": "v0.14.9"
},
{
"tflint_version": "0.27.0",
"terraform_version": "v0.15.0"
},
{
"tflint_version": "0.28.0",
"terraform_version": "v0.15.0"
}
]
}
---
metadata_format: "v0.1.0"
tflint_releases:
- tflint_version: "0.1.0"
terraform_version: "unknown"
- tflint_version: "0.2.0"
terraform_version: "unknown"
- tflint_version: "0.2.1"
terraform_version: "unknown"
- tflint_version: "0.3.0"
terraform_version: "unknown"
- tflint_version: "0.3.1"
terraform_version: "unknown"
- tflint_version: "0.3.2"
terraform_version: "unknown"
- tflint_version: "0.3.3"
terraform_version: "unknown"
- tflint_version: "0.3.4"
terraform_version: "unknown"
- tflint_version: "0.3.5"
terraform_version: "unknown"
- tflint_version: "0.3.6"
terraform_version: "unknown"
- tflint_version: "0.4.0"
terraform_version: "unknown"
- tflint_version: "0.4.1"
terraform_version: "unknown"
- tflint_version: "0.4.2"
terraform_version: "unknown"
- tflint_version: "0.4.3"
terraform_version: "unknown"
- tflint_version: "0.5.0"
terraform_version: "unknown"
- tflint_version: "0.5.1"
terraform_version: "unknown"
- tflint_version: "0.5.2"
terraform_version: "unknown"
- tflint_version: "0.5.3"
terraform_version: "unknown"
- tflint_version: "0.5.4"
terraform_version: "unknown"
- tflint_version: "0.6.0"
terraform_version: "unknown"
- tflint_version: "0.7.0"
terraform_version: "unknown"
- tflint_version: "0.7.1"
terraform_version: "unknown"
- tflint_version: "0.7.2"
terraform_version: "unknown"
- tflint_version: "0.7.3"
terraform_version: "unknown"
- tflint_version: "0.7.4"
terraform_version: "unknown"
- tflint_version: "0.7.5"
terraform_version: "unknown"
- tflint_version: "0.7.6"
terraform_version: "unknown"
- tflint_version: "0.8.0"
terraform_version: "unknown"
- tflint_version: "0.8.1"
terraform_version: "v0.12.0"
- tflint_version: "0.8.2"
terraform_version: "v0.12.0"
- tflint_version: "0.8.3"
terraform_version: "v0.12.1"
- tflint_version: "0.9.0"
terraform_version: "v0.12.3"
- tflint_version: "0.9.1"
terraform_version: "v0.12.3"
- tflint_version: "0.9.2"
terraform_version: "v0.12.5"
- tflint_version: "0.9.3"
terraform_version: "v0.12.6"
- tflint_version: "0.10.0"
terraform_version: "v0.12.6"
- tflint_version: "0.10.1"
terraform_version: "v0.12.6"
- tflint_version: "0.10.2"
terraform_version: "v0.12.7"
- tflint_version: "0.10.3"
terraform_version: "v0.12.7"
- tflint_version: "0.11.0"
terraform_version: "v0.12.8"
- tflint_version: "0.11.1"
terraform_version: "v0.12.8"
- tflint_version: "0.11.2"
terraform_version: "v0.12.9"
- tflint_version: "0.12.0"
terraform_version: "v0.12.9"
- tflint_version: "0.12.1"
terraform_version: "v0.12.10"
- tflint_version: "0.13.0"
terraform_version: "v0.12.15"
- tflint_version: "0.13.1"
terraform_version: "v0.12.15"
- tflint_version: "0.13.2"
terraform_version: "v0.12.17"
- tflint_version: "0.13.3"
terraform_version: "v0.12.18"
- tflint_version: "0.13.4"
terraform_version: "v0.12.18"
- tflint_version: "0.14.0"
terraform_version: "v0.12.20"
- tflint_version: "0.15.0"
terraform_version: "v0.12.21"
- tflint_version: "0.15.1"
terraform_version: "v0.12.21"
- tflint_version: "0.15.2"
terraform_version: "v0.12.23"
- tflint_version: "0.15.3"
terraform_version: "v0.12.24"
- tflint_version: "0.15.4"
terraform_version: "v0.12.24"
- tflint_version: "0.15.5"
terraform_version: "v0.12.24"
- tflint_version: "0.16.0"
terraform_version: "v0.12.25"
- tflint_version: "0.16.1"
terraform_version: "v0.12.25"
- tflint_version: "0.16.2"
terraform_version: "v0.12.26"
- tflint_version: "0.17.0"
terraform_version: "v0.12.28"
- tflint_version: "0.18.0"
terraform_version: "v0.12.28"
- tflint_version: "0.19.0"
terraform_version: "v0.13.0"
- tflint_version: "0.19.1"
terraform_version: "v0.13.0"
- tflint_version: "0.20.0"
terraform_version: "v0.13.2"
- tflint_version: "0.20.1"
terraform_version: "v0.13.2"
- tflint_version: "0.20.2"
terraform_version: "v0.13.3"
- tflint_version: "0.20.3"
terraform_version: "v0.13.4"
- tflint_version: "0.21.0"
terraform_version: "v0.13.5"
- tflint_version: "0.22.0"
terraform_version: "v0.14.2"
- tflint_version: "0.23.0"
terraform_version: "v0.14.3"
- tflint_version: "0.23.1"
terraform_version: "v0.14.3"
- tflint_version: "0.24.0"
terraform_version: "v0.14.5"
- tflint_version: "0.24.1"
terraform_version: "v0.14.5"
- tflint_version: "0.25.0"
terraform_version: "v0.14.7"
- tflint_version: "0.26.0"
terraform_version: "v0.14.9"
- tflint_version: "0.27.0"
terraform_version: "v0.15.0"
- tflint_version: "0.28.0"
terraform_version: "v0.15.0"
...
[codz@dt .release_metadata]$ shellcheck -f json metadata_parser.sh
[]
[codz@dt .release_metadata]$ shellcheck -V
ShellCheck - shell script analysis tool
version: 0.7.1
license: GNU General Public License, version 3
website: https://www.shellcheck.net
[codz@dt .release_metadata]$
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment