Feat: Add packer verify Github Actions workflow
[releng/builder.git] / .github / workflows / gerrit-verify.yaml
index d3b8b7c4056371804ff19f6f6b9cbb884dd3fcf0..924befde5c0fc974a9d6f7bb81c125ba134d70f1 100644 (file)
@@ -9,6 +9,7 @@ on:
         description: "Branch that change is against"
         required: true
         type: string
+        default: master
       GERRIT_CHANGE_ID:
         description: "The ID for the change"
         required: true
@@ -37,13 +38,16 @@ on:
         description: "Project in Gerrit"
         required: true
         type: string
+        default: releng/builder
       GERRIT_REFSPEC:
         description: "Gerrit refspec of change"
         required: true
         type: string
+        default: master
 
 env:
-  PACKER_VERSION: "1.8.6"
+  OS_CLOUD: "vex"
+  PACKER_VERSION: "1.9.1"
 
 concurrency:
   group: ${{ github.event.inputs.GERRIT_CHANGE_ID || github.run_id }}
@@ -70,7 +74,7 @@ jobs:
     needs: prepare
     runs-on: ubuntu-latest
     steps:
-      - uses: lfit/checkout-gerrit-change-action@v0.3
+      - uses: lfit/checkout-gerrit-change-action@v0.4
         with:
           gerrit-refspec: ${{ inputs.GERRIT_REFSPEC }}
           delay: "0s"
@@ -87,7 +91,7 @@ jobs:
     needs: prepare
     runs-on: ubuntu-latest
     steps:
-      - uses: lfit/checkout-gerrit-change-action@v0.3
+      - uses: lfit/checkout-gerrit-change-action@v0.4
         with:
           gerrit-refspec: ${{ inputs.GERRIT_REFSPEC }}
           delay: "0s"
@@ -101,7 +105,7 @@ jobs:
     needs: prepare
     runs-on: ubuntu-latest
     steps:
-      - uses: lfit/checkout-gerrit-change-action@v0.3
+      - uses: lfit/checkout-gerrit-change-action@v0.4
         with:
           gerrit-refspec: ${{ inputs.GERRIT_REFSPEC }}
           delay: "0s"
@@ -131,7 +135,7 @@ jobs:
     needs: prepare
     runs-on: ubuntu-latest
     steps:
-      - uses: lfit/checkout-gerrit-change-action@v0.3
+      - uses: lfit/checkout-gerrit-change-action@v0.4
         with:
           gerrit-refspec: ${{ inputs.GERRIT_REFSPEC }}
           delay: "0s"
@@ -143,57 +147,87 @@ jobs:
         run: >-
           pipx run tox
 
-  packer-validation:
+  packer-validator:
     needs: prepare
     runs-on: ubuntu-latest
     steps:
-      - uses: lfit/checkout-gerrit-change-action@v0.3
+      - uses: lfit/checkout-gerrit-change-action@v0.4
         with:
           gerrit-refspec: ${{ inputs.GERRIT_REFSPEC }}
           delay: "0s"
+      - name: Clone git submodules
+        run: git submodule update --init
       - name: Setup packer
         uses: hashicorp/setup-packer@main
         id: setup
-        env:
-          AUTH_URL: ${{ secrets.cloud_auth_url }}
-          CLOUD_ENV: "packer/cloud-env.json"
         with:
-          cloud_auth_url: "https://auth.vexxhost.net/v3/"
-          cloud_tenant: ${{ secrets.cloud_tenant }}
-          cloud_user: ${{ secrets.cloud_user }}
-          cloud_network: ${{ secrets.cloud_network }}
           version: ${{ env.PACKER_VERSION }}
-          cloud_pass: ${{ secrets.cloud_pass }}
-          dicrectory: packer
-          file_name: cloud-env.json
-          fail_on_empty: true
-      - name: Clone git submodules
-        run: git submodule update --init
+      - name: Create cloud-env file required for packer
+        id: create-cloud-env-file
+        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
+        shell: bash
+        run: |
+          mkdir -p "$HOME/.config/openstack"
+          echo "${{ secrets.CLOUDS_YAML_B64 }}" | base64 --decode > "$HOME/.config/openstack/clouds.yaml"
+      - uses: actions/setup-python@v4
+        id: setup-python
+        with:
+          python-version: "3.11"
+      - name: Install openstack deps
+        id: install-openstack-deps
+        run: |
+          python -m pip install --upgrade pip
+          pip install python-openstackclient
+          pip freeze
       - uses: dorny/paths-filter@v2
         id: changes
         with:
+          base: ${{ inputs.GERRIT_BRANCH }}
+          ref: ${{ inputs.GERRIT_REFSPEC }}
           filters: |
             src:
               - 'packer/**'
       - if: steps.changes.outputs.src == 'true'
         run: |
+          set -x
           cd packer
-          varfiles=(vars/*.json common-packer/vars/*.json)
-          templates=(templates/*.json)
+
+          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
-              # cloud-env.json is a file containing credentials which is pulled in via
-              # CLOUDENV variable so skip it here. Also handle the case where a project
-              # has not vars/*.json file.
-              if [[ "$varfile" == *"cloud-env.json"* ]] || [[ "$varfile" == 'vars/*.json' ]]; then
+              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 "-----> Testing varfile: $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
+
                   export PACKER_LOG="yes"
                   export PACKER_LOG_PATH="$PACKER_LOGS_DIR/packer-validate-${varfile##*/}-${template##*/}.log"
-                  if output=$(packer validate -var-file="$CLOUDENV" -var-file="$varfile" "$template"); then
+                  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"
@@ -211,7 +245,7 @@ jobs:
         pre-commit,
         jjb-validation,
         tox-verify,
-        packer-validation,
+        packer-validator,
       ]
     runs-on: ubuntu-latest
     steps: