CI: Update GHA packer validation job
[releng/builder.git] / .github / workflows / gerrit-verify.yaml
index 793099ae4655a9d9d2276bef075881f6bb9f2025..eb49273dc33f58bb2be3a8121f78743399783dae 100644 (file)
@@ -42,6 +42,10 @@ on:
         required: true
         type: string
 
+env:
+  OS_CLOUD: "vex"
+  PACKER_VERSION: "1.9.1"
+
 concurrency:
   group: ${{ github.event.inputs.GERRIT_CHANGE_ID || github.run_id }}
   cancel-in-progress: true
@@ -140,9 +144,125 @@ jobs:
         run: >-
           pipx run tox
 
+  packer-validator:
+    needs: prepare
+    runs-on: ubuntu-latest
+    steps:
+      - name: Gerrit Checkout
+        # yamllint disable-line rule:line-length
+        uses: lfit/checkout-gerrit-change-action@70360ca2f8bee3e6a15224d8a03f8e017b1ac91f # v0.4
+        with:
+          gerrit-refspec: ${{ inputs.GERRIT_REFSPEC }}
+          delay: "0s"
+      - name: Clone git submodules
+        shell: bash
+        run: git submodule update --init
+      - name: Check for changes
+        # yamllint disable-line rule:line-length
+        uses: dorny/paths-filter@4512585405083f25c027a35db413c2b3b9006d50 # v2.11.1
+        id: changes
+        with:
+          base: ${{ inputs.GERRIT_BRANCH }}
+          ref: ${{ inputs.GERRIT_PATCHSET_REVISION }}
+          filters: |
+            src:
+              - 'packer/**'
+      - name: Setup packer
+        if: steps.changes.outputs.src == 'true'
+        uses: hashicorp/setup-packer@main
+        id: setup
+        with:
+          version: ${{ env.PACKER_VERSION }}
+      - name: Create cloud-env file required for packer
+        id: create-cloud-env-file
+        if: steps.changes.outputs.src == 'true'
+        shell: bash
+        run: |
+          echo "${{ secrets.CLOUDS_ENV_B64 }}" | base64 --decode \
+                  > "${GITHUB_WORKSPACE}/cloud-env.pkrvars.hcl"
+      - name: Create cloud.yaml file for openstack client
+        id: create-cloud-yaml-file
+        if: steps.changes.outputs.src == 'true'
+        shell: bash
+        run: |
+          mkdir -p "$HOME/.config/openstack"
+          echo "${{ secrets.CLOUDS_YAML_B64 }}" | base64 --decode \
+                  > "$HOME/.config/openstack/clouds.yaml"
+      - name: Setup Python
+        if: steps.changes.outputs.src == 'true'
+        # yamllint disable-line rule:line-length
+        uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0
+        with:
+          python-version: "3.11"
+      - name: Install openstack deps
+        id: install-openstack-deps
+        if: steps.changes.outputs.src == 'true'
+        shell: bash
+        run: |
+          python -m pip install --upgrade pip
+          pip install python-openstackclient
+          pip freeze
+      - name: Verify packer files
+        if: steps.changes.outputs.src == 'true'
+        shell: bash
+        run: |
+          set -x
+          cd packer
+
+          varfiles=(common-packer/vars/*.pkrvars.hcl)
+          templates=(templates/*.pkr.hcl)
+
+          mkdir -p "${GITHUB_WORKSPACE}/logs"
+          PACKER_LOGS_DIR="${GITHUB_WORKSPACE}/logs"
+
+          for varfile in "${varfiles[@]}"; do
+              if [[ "$varfile" == *"cloud-env.json"* ]] || \
+                 [[ "$varfile" == "vars/*.json" ]] || \
+                 [[ "$varfile" == *"cloud-env.pkrvars.hcl"* ]] || \
+                 [[ "$varfile" == *"cloud-env-aws.pkrvars.hcl"* ]] || \
+                 [[ "$varfile" == "vars/*.pkrvars.hcl" ]]; then
+                  continue
+              fi
+
+              echo "::group::$varfile"
+              echo "-----> Test var: $varfile"
+              for template in "${templates[@]}"; do
+                  if [[ "$template" == *"variables.pkr.hcl"* ]] || \
+                     [[ "$template" == *"variables.auto.pkr.hcl"* ]]; then
+                      continue
+                  fi
+
+                  if [[ "${template#*.}" == "pkr.hcl" ]]; then
+                      echo "packer init $template ..."
+                      packer init "$template"
+                  fi
+
+                  LOG_FILE="packer-validate-${varfile##*/}-${template##*/}.log"
+                  export PACKER_LOG="yes"
+                  export PACKER_LOG_PATH="$PACKER_LOGS_DIR/$LOG_FILE"
+                  if output=$(OS_CLOUD=${{ env.OS_CLOUD }} packer validate \
+                        -var-file="${GITHUB_WORKSPACE}/cloud-env.pkrvars.hcl" \
+                        -var-file="$varfile" "$template"); then
+                      echo "$template: $output"
+                  else
+                      echo "$template: $output"
+                      exit 1
+                  fi
+              done
+              echo "::endgroup::"
+          done
+
   vote:
     if: ${{ always() }}
-    needs: [prepare, actionlint, pre-commit, jjb-validation, tox-verify]
+    needs:
+      [
+        prepare,
+        actionlint,
+        pre-commit,
+        jjb-validation,
+        tox-verify,
+        packer-validator,
+      ]
     runs-on: ubuntu-latest
     steps:
       - uses: technote-space/workflow-conclusion-action@v3