Skip to content

Integration Tests

Integration Tests #147

# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "Integration Tests"
on:
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
inputs:
terraform_version:
description: "Use Terraform 1.13.4"
required: true
default: 1.13.4
type: string
env:
GOOGLE_APPLICATION_CREDENTIALS: "/home/runner/credentials.json"
PYTEST_ADDOPTS: "--color=yes"
PYTHON_VERSION: "3.12"
TF_PLUGIN_CACHE_DIR: "/home/runner/.terraform.d/plugin-cache"
TFTEST_COPY: 1
DEFAULT_TERRAFORM_VERSION: ${{ inputs.terraform_version || '1.13.4' }}
DEFAULT_TOFU_VERSION: "1.10.0"
jobs:
prerequisites:
runs-on: ubuntu-latest
outputs:
default_terraform_version: ${{ env.DEFAULT_TERRAFORM_VERSION }}
default_tofu_version: ${{ env.DEFAULT_TOFU_VERSION }}
latest_tag: ${{ steps.find_tag.outputs.latest_tag }}
steps:
- uses: actions/checkout@v4
- name: Set up uv and python
uses: astral-sh/setup-uv@v6
with:
python-version: ${{ inputs.PYTHON_VERSION }}
enable-cache: true
cache-dependency-glob: |
./pyproject.toml
./uv.lock
- name: Fetch the latest Fabric tag
id: find_tag
run: |
LATEST_TAG=$(python tools/fetch_latest_tag.py https://github.com/GoogleCloudPlatform/cloud-foundation-fabric)
echo ${LATEST_TAG}
echo "latest_tag=${LATEST_TAG}" >> $GITHUB_OUTPUT
- name: Display latest tag
run: |
echo "The latest tag is: ${{ steps.find_tag.outputs.latest_tag }}"
setup-tf-providers:
runs-on: ubuntu-latest
needs:
- prerequisites
strategy:
matrix:
include:
- flavour: terraform
version: "${{ needs.prerequisites.outputs.default_terraform_version }}"
- flavour: tofu
version: "${{ needs.prerequisites.outputs.default_tofu_version }}"
steps:
- uses: actions/checkout@v4
- name: Set up uv and python
uses: astral-sh/setup-uv@v6
with:
python-version: ${{ inputs.PYTHON_VERSION }}
enable-cache: true
cache-dependency-glob: |
./pyproject.toml
./uv.lock
- name: Update reference to Fabric modules (${{ needs.prerequisites.outputs.latest_tag }})
shell: bash
run: |
python tools/update_fabric_ref.py . ${{ needs.prerequisites.outputs.latest_tag }}
- uses: hashicorp/setup-terraform@v3
if: ${{ matrix.flavour == 'terraform' }}
with:
terraform_version: ${{ matrix.version }}
terraform_wrapper: false
- uses: opentofu/setup-opentofu@v1
if: ${{ matrix.flavour == 'tofu' }}
with:
tofu_version: ${{ matrix.version }}
tofu_wrapper: false
- name: Build lockfile and fetch providers
shell: bash
run: |
mkdir -p ${{ env.TF_PLUGIN_CACHE_DIR }}
echo 'plugin_cache_dir = "${{ env.TF_PLUGIN_CACHE_DIR }}"' | tee -a /home/runner/.terraformrc
echo 'disable_checkpoint = true' | tee -a /home/runner/.terraformrc
# sed -i -e 's/>=\(.*# tftest\)/=\1/g' tools/lockfile/versions.tf
# change terraform version to the one that is running
sed -i 's/required_version = .*$/required_version = ">= ${{ matrix.version }}"/g' tools/lockfile/versions.tf
cd tools/lockfile
${{ matrix.flavour }} init
- name: Upload Terraform provider cache
uses: actions/cache@v4
with:
path: ${{ env.TF_PLUGIN_CACHE_DIR }}
key: ${{ runner.os }}-${{ matrix.flavour }}-${{ matrix.version }}-${{ hashFiles('tools/lockfile/.terraform.lock.hcl') }}
- name: Upload lockfile
uses: actions/upload-artifact@v4
with:
name: lockfile-${{ runner.os }}-${{ matrix.flavour }}-${{ matrix.version }}
path: tools/lockfile/.terraform.lock.hcl
overwrite: true
include-hidden-files: true
tests:
runs-on: ubuntu-latest
needs:
- prerequisites
- setup-tf-providers
strategy:
matrix:
include:
- flavour: terraform
version: "${{ needs.prerequisites.outputs.DEFAULT_TERRAFORM_VERSION }}"
- flavour: tofu
version: "${{ needs.prerequisites.outputs.DEFAULT_TOFU_VERSION }}"
steps:
- uses: actions/checkout@v4
- name: Set up uv and python
uses: astral-sh/setup-uv@v6
with:
python-version: ${{ inputs.PYTHON_VERSION }}
enable-cache: true
cache-dependency-glob: |
./pyproject.toml
./uv.lock
- name: Update reference to Fabric modules (${{ needs.prerequisites.outputs.latest_tag }})
shell: bash
run: |
python tools/update_fabric_ref.py . ${{ needs.prerequisites.outputs.latest_tag }}
- name: Call composite action tests-setup
uses: ./.github/actions/tests-setup
env:
TERRAFORM: ${{ matrix.flavour }}
with:
PYTHON_VERSION: ${{ env.PYTHON_VERSION }}
TERRAFORM_VERSION: ${{ matrix.version }}
TERRAFORM_FLAVOUR: ${{ matrix.flavour }}
- name: Run tests
env:
TERRAFORM: ${{ matrix.flavour }}
run: uv run pytest -vv ${{ matrix.flavour == 'terraform' && '-n4' || '-n4' }} --tb=line --junit-xml=test-results-raw.xml tests
- name: Create report
uses: ./.github/actions/gen-test-report
if: always()
create-pr:
runs-on: ubuntu-latest
permissions: write-all
needs:
- prerequisites
- tests
if: ${{ needs.tests.result == 'success' }}
steps:
- uses: actions/checkout@v4
with:
ref: master
- name: Update reference to Fabric modules (${{ needs.prerequisites.outputs.latest_tag }})
shell: bash
run: |
python tools/update_fabric_ref.py . ${{ needs.prerequisites.outputs.latest_tag }}
- name: Check for file changes
id: git-status
run: |
echo $(git status --porcelain)
echo "changes=$(git status --porcelain | tr -d '\n')" >> $GITHUB_OUTPUT
- uses: webfactory/ssh-agent@v0.9.0
if: steps.git-status.outputs.changes != ''
with:
ssh-private-key: ${{ secrets.DEPLOY_KEY }}
- name: Configure Git
if: steps.git-status.outputs.changes != ''
run: |
git config user.name "genai-factory-robot"
git config user.email "genai-factory-robot@google.com"
- name: Commit and push feature branch
if: steps.git-status.outputs.changes != ''
run: |
git remote set-url origin git@github.com:GoogleCloudPlatform/genai-factory.git
git checkout -b fabric-upgrade-${{ needs.prerequisites.outputs.latest_tag }}
git add .
git commit -m "[GH Actions] Update Fabric to ${{ needs.prerequisites.outputs.latest_tag }}"
git push --set-upstream origin fabric-upgrade-${{ needs.prerequisites.outputs.latest_tag }}
- name: Create PR
if: steps.git-status.outputs.changes != ''
run: |
gh pr create \
--title "[Fabric upgrade] - reference ${{ needs.prerequisites.outputs.latest_tag }}" \
--head fabric-upgrade-${{ needs.prerequisites.outputs.latest_tag }} \
--base master \
--body "Reference in factories Cloud Foundation Fabric modules ${{ needs.prerequisites.outputs.latest_tag }}"
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}