|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +# Ensure we work from the Updatecli directory |
| 5 | +# This is even more important as we use the policy path to generate the policy reference |
| 6 | +pushd updatecli |
| 7 | + |
| 8 | +: "${POLICIES_ROOT_DIR:=policies}" |
| 9 | +: "${POLICY_ERROR:=false}" |
| 10 | +: "${OCI_REPOSITORY:=ghcr.io/ContainerCraft/updatecli-policies}" |
| 11 | + |
| 12 | +: "${GITHUB_REGISTRY:=}" |
| 13 | + |
| 14 | +POLICIES=$(find "$POLICIES_ROOT_DIR" -name "Policy.yaml") |
| 15 | + |
| 16 | +# release publish an Updatecli policy version to the registry |
| 17 | +function release(){ |
| 18 | + local POLICY_ROOT_DIR="$1" |
| 19 | + # Trim policy path with root directory path |
| 20 | + local POLICY_DIR="${1#"$POLICIES_ROOT_DIR/"}" |
| 21 | + |
| 22 | + updatecli manifest push \ |
| 23 | + --config updatecli.d \ |
| 24 | + --values values.yaml \ |
| 25 | + --policy Policy.yaml \ |
| 26 | + --tag "$OCI_REPOSITORY/$POLICY_DIR" \ |
| 27 | + "$POLICY_ROOT_DIR" |
| 28 | +} |
| 29 | + |
| 30 | +function runUpdatecliDiff(){ |
| 31 | + local POLICY_ROOT_DIR="" |
| 32 | + POLICY_ROOT_DIR="$1" |
| 33 | + |
| 34 | + updatecli diff \ |
| 35 | + --config "$POLICY_ROOT_DIR/updatecli.d" \ |
| 36 | + --values "$POLICY_ROOT_DIR/values.yaml" \ |
| 37 | + --values "$POLICY_ROOT_DIR/testdata/values.yaml" |
| 38 | +} |
| 39 | + |
| 40 | +function validateRequiredFile(){ |
| 41 | + local POLICY_ROOT_DIR="$1" |
| 42 | + local POLICY_VALUES="$POLICY_ROOT_DIR/values.yaml" |
| 43 | + local POLICY_README="$POLICY_ROOT_DIR/README.md" |
| 44 | + local POLICY_METADATA="$POLICY_ROOT_DIR/Policy.yaml" |
| 45 | + local POLICY_CHANGELOG="$POLICY_ROOT_DIR/CHANGELOG.md" |
| 46 | + |
| 47 | + echo "* validating policy $POLICY_ROOT_DIR" |
| 48 | + |
| 49 | + |
| 50 | + # Checking for files |
| 51 | + for POLICY_FILE in "$POLICY_VALUES" "$POLICY_CHANGELOG" "$POLICY_README" "$POLICY_METADATA" |
| 52 | + do |
| 53 | + if [[ ! -f "$POLICY_FILE" ]]; then |
| 54 | + |
| 55 | + POLICY_ERROR=true |
| 56 | + echo " * file '$POLICY_FILE' missing for policy $POLICY_ROOT_DIR" |
| 57 | + true |
| 58 | + fi |
| 59 | + done |
| 60 | + |
| 61 | + local POLICY_MANIFEST="$POLICY_ROOT_DIR/updatecli.d" |
| 62 | + # Checking for directories |
| 63 | + if [[ ! -d "$POLICY_MANIFEST" ]]; then |
| 64 | + |
| 65 | + POLICY_ERROR=true |
| 66 | + echo " * directory '$POLICY_MANIFEST' missing for policy $POLICY_ROOT_DIR" |
| 67 | + true |
| 68 | + fi |
| 69 | + |
| 70 | + ## Testing that Policy.yaml contains the required information |
| 71 | + local sourceInformation="" |
| 72 | + sourceInformation=$(sed -n -e 's/^source: //p' "$POLICY_METADATA" ) |
| 73 | + local expectedSourceInformation="\"https://github.com/ContainerCraft/updatecli-policies/tree/main/updatecli/$POLICY_ROOT_DIR/\"" |
| 74 | + if [[ ! $sourceInformation == "$expectedSourceInformation" ]]; then |
| 75 | + POLICY_ERROR=true |
| 76 | + echo " * policy $POLICY_ROOT_DIR missing the right source information in Policy.yaml" |
| 77 | + echo " expected: $expectedSourceInformation" |
| 78 | + echo " got: $sourceInformation" |
| 79 | + fi |
| 80 | + |
| 81 | + local documentationInformation="" |
| 82 | + documentationInformation=$(sed -n -e 's/^documentation: //p' "$POLICY_METADATA") |
| 83 | + local expectedDocumentationInformation="\"https://github.com/ContainerCraft/updatecli-policies/tree/main/updatecli/$POLICY_ROOT_DIR/README.md\"" |
| 84 | + if [[ ! $documentationInformation == "$expectedDocumentationInformation" ]]; then |
| 85 | + POLICY_ERROR=true |
| 86 | + echo " * policy $POLICY_ROOT_DIR missing the right documentation information in Policy.yaml" |
| 87 | + echo " expected: $expectedDocumentationInformation" |
| 88 | + echo " got: $documentationInformation" |
| 89 | + fi |
| 90 | + |
| 91 | + # Testing url annotation is defined |
| 92 | + local urlInformation="" |
| 93 | + urlInformation=$(sed -n -e 's/^url: //p' "$POLICY_METADATA") |
| 94 | + local expectedUrlInformation="\"https://github.com/ContainerCraft/updatecli-policies/\"" |
| 95 | + if [[ ! $urlInformation == "$expectedUrlInformation" ]]; then |
| 96 | + POLICY_ERROR=true |
| 97 | + echo " * policy $POLICY_ROOT_DIR missing the right url information in Policy.yaml" |
| 98 | + echo " expected: $expectedUrlInformation" |
| 99 | + echo " got: $urlInformation" |
| 100 | + fi |
| 101 | + |
| 102 | + # Testing version annotation is defined |
| 103 | + local versionInformation="" |
| 104 | + versionInformation=$(sed -n -e 's/^version: //p' "$POLICY_METADATA") |
| 105 | + if [[ $versionInformation == "" ]]; then |
| 106 | + POLICY_ERROR=true |
| 107 | + echo " * policy $POLICY_ROOT_DIR missing a version information in Policy.yaml" |
| 108 | + fi |
| 109 | + |
| 110 | + # Testing that the latest version has a changelog entry |
| 111 | + local versionChangelogEntry="" |
| 112 | + versionChangelogEntry=$(grep " $versionInformation" "$POLICY_CHANGELOG") |
| 113 | + if [[ $versionChangelogEntry == "" ]]; then |
| 114 | + POLICY_ERROR=true |
| 115 | + echo " * Changelog missing a version entry such as '## $versionInformation' in $POLICY_CHANGELOG" |
| 116 | + fi |
| 117 | + |
| 118 | + # Testing that the latest changelog version is used in the Policy.yaml |
| 119 | + latestVersionChangelogEntry=$(sed -n -e '1,4s/^.*## //p' "$POLICY_CHANGELOG") |
| 120 | + if [[ "$latestVersionChangelogEntry" != "$versionInformation" ]]; then |
| 121 | + POLICY_ERROR=true |
| 122 | + echo " * Latest Changelog version isn't the one used in Policy.yaml" |
| 123 | + echo " '## $latestVersionChangelogEntry' in $POLICY_CHANGELOG" |
| 124 | + echo " '## $versionInformation' in $POLICY_METADATA" |
| 125 | + fi |
| 126 | +} |
| 127 | + |
| 128 | +function main(){ |
| 129 | + |
| 130 | + PARAM="$1" |
| 131 | + |
| 132 | + GLOBAL_ERROR=0 |
| 133 | + |
| 134 | + for POLICY in $POLICIES |
| 135 | + do |
| 136 | + echo "" |
| 137 | + |
| 138 | + POLICY_ROOT_DIR=$(dirname "$POLICY") |
| 139 | + POLICY_ERROR=false |
| 140 | + |
| 141 | + if [[ "$PARAM" == "--e2e-test" ]]; then |
| 142 | + runUpdatecliDiff "$POLICY_ROOT_DIR" |
| 143 | + fi |
| 144 | + |
| 145 | + if [[ "$PARAM" == "--unit-test" || "$PARAM" == "" ]]; then |
| 146 | + validateRequiredFile "$POLICY_ROOT_DIR" |
| 147 | + fi |
| 148 | + |
| 149 | + if [[ "$POLICY_ERROR" = "false" ]]; then |
| 150 | + echo " => all is good" |
| 151 | + |
| 152 | + if [[ "$PARAM" == "--publish" ]]; then |
| 153 | + release "$POLICY_ROOT_DIR" |
| 154 | + fi |
| 155 | + |
| 156 | + else |
| 157 | + echo "" |
| 158 | + echo " => validation test not passing" |
| 159 | + |
| 160 | + GLOBAL_ERROR=1 |
| 161 | + fi |
| 162 | + |
| 163 | + done |
| 164 | + |
| 165 | + exit "$GLOBAL_ERROR" |
| 166 | +} |
| 167 | + |
| 168 | +main "${1:-}" |
0 commit comments