How to Configure GitHub Actions 3.0 for Multi-Cloud CI/CD with Terraform 1.8 and Pulumi 3.120 – Step-by-Step
Modern multi-cloud CI/CD pipelines require seamless integration of infrastructure-as-code (IaC) tools like Terraform and Pulumi with robust automation platforms. This guide walks you through setting up GitHub Actions 3.0 to orchestrate multi-cloud deployments using Terraform 1.8 and Pulumi 3.120, covering prerequisites, pipeline configuration, and validation steps.
Prerequisites
- Active GitHub account with a repository for your CI/CD workflows
- Terraform 1.8 installed locally (or use GitHub Actions runners)
- Pulumi 3.120 CLI configured with your Pulumi access token
- Cloud provider accounts: AWS, Azure, or GCP (we’ll use AWS and Azure for this demo)
- Service principal/ IAM roles for GitHub Actions to access cloud resources
Step 1: Configure Cloud Provider Credentials as GitHub Secrets
GitHub Actions uses encrypted secrets to store sensitive credentials. Navigate to your repository Settings > Secrets and variables > Actions and add the following secrets:
-
AWS_ACCESS_KEY_IDandAWS_SECRET_ACCESS_KEYfor AWS access -
AZURE_CLIENT_ID,AZURE_TENANT_ID,AZURE_SUBSCRIPTION_ID, andAZURE_CLIENT_SECRETfor Azure access -
PULUMI_ACCESS_TOKENfrom your Pulumi account settings -
TERRAFORM_CLOUD_TOKEN(optional, if using Terraform Cloud for state management)
Step 2: Set Up Terraform 1.8 Workflow for Multi-Cloud Infrastructure
Create a GitHub Actions workflow file at .github/workflows/terraform-deploy.yml. This workflow will handle Terraform init, validate, plan, and apply for multi-cloud resources:
name: Terraform 1.8 Multi-Cloud Deploy
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
terraform:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Terraform 1.8
uses: hashicorp/setup-terraform@v3
with:
terraform_version: 1.8.0
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Configure Azure Credentials
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Terraform Init
run: terraform init
- name: Terraform Validate
run: terraform validate
- name: Terraform Plan
run: terraform plan -out=tfplan
- name: Terraform Apply
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
run: terraform apply -auto-approve tfplan
Note: GitHub Actions 3.0 includes native support for workflow versioning and improved runner performance, which we leverage here with the latest action versions.
Step 3: Integrate Pulumi 3.120 for Dynamic Infrastructure Provisioning
Next, create a separate workflow for Pulumi 3.120 to handle dynamic infrastructure components that complement Terraform-managed resources. Create .github/workflows/pulumi-deploy.yml:
name: Pulumi 3.120 Multi-Cloud Deploy
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
pulumi:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Pulumi 3.120
uses: pulumi/setup-pulumi@v2
with:
pulumi-version: 3.120.0
- name: Configure Pulumi Access Token
run: pulumi login --token ${{ secrets.PULUMI_ACCESS_TOKEN }}
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Configure Azure Credentials
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Pulumi Preview
run: pulumi preview
- name: Pulumi Up
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
run: pulumi up --yes
Step 4: Combine Workflows for End-to-End Multi-Cloud CI/CD
To orchestrate both Terraform and Pulumi deployments in a single pipeline, create a parent workflow .github/workflows/multi-cloud-cicd.yml that triggers both jobs sequentially:
name: Multi-Cloud CI/CD with GitHub Actions 3.0
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
terraform-deploy:
uses: ./.github/workflows/terraform-deploy.yml
pulumi-deploy:
needs: terraform-deploy
uses: ./.github/workflows/pulumi-deploy.yml
GitHub Actions 3.0’s reusable workflows feature simplifies this orchestration, reducing duplicate code and improving maintainability.
Step 5: Validate the Pipeline
Push a change to your main branch to trigger the pipeline. Monitor the run under the Actions tab in your GitHub repository:
- Verify Terraform init, validate, plan, and apply steps complete successfully for AWS and Azure resources
- Check Pulumi preview and up steps provision dynamic resources (e.g., serverless functions, databases) across both clouds
- Confirm multi-cloud resources are accessible and properly configured via your cloud provider consoles
Best Practices for Production Use
- Use Terraform workspaces or Pulumi stacks to separate dev, staging, and production environments
- Enable GitHub Actions 3.0’s audit logging for compliance tracking
- Store Terraform state in a remote backend (S3, Azure Blob Storage) or Terraform Cloud
- Use Pulumi’s secrets management to encrypt sensitive configuration values
- Add manual approval steps for production deployments using GitHub Actions environments
Conclusion
By combining GitHub Actions 3.0 with Terraform 1.8 and Pulumi 3.120, you can build a robust, multi-cloud CI/CD pipeline that leverages the strengths of both IaC tools. This setup enables consistent, repeatable deployments across cloud providers while maintaining full visibility and control over your infrastructure lifecycle.



