Skip to content

EPMGCIP-177-Terraform Init terraform configuration #2

EPMGCIP-177-Terraform Init terraform configuration

EPMGCIP-177-Terraform Init terraform configuration #2

Workflow file for this run

name: Deploy to Azure with Terraform and Function App Code
on:
push:
branches:
- main
- master
pull_request:
branches:
- main
- master
workflow_dispatch: # Allow manual workflow dispatch
inputs:
environment:
description: "Specify the environment (DEV, STAGING, PROD)" # Input for manual trigger
required: true
default: DEV
jobs:
terraform:
name: Apply Terraform Resources
runs-on: ubuntu-latest
defaults:
run:
working-directory: infrastructure/terraform # Set the default working directory
steps:
# Step 1: Checkout the code repository
- name: Checkout Code
uses: actions/checkout@v4
# Step 2: Set Environment and Workspace
- name: Set Environment and Workspace
run: |
# Retrieve the base name for the Terraform workspace
BASE_NAME=${{ secrets.TF_CLOUD_WORKSPACE_BASE_NAME }}
# Determine the environment based on the event type
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
# Use the environment input for manual workflow dispatch
ENVIRONMENT=${{ github.event.inputs.environment }}
elif [[ "${{ github.event_name }}" == "push" ]] && [[ "${{ github.ref }}" == "refs/heads/main" || "${{ github.ref }}" == "refs/heads/master" ]]; then
ENVIRONMENT="STAGING"
elif [[ "${{ github.event_name }}" == "pull_request" ]]; then
ENVIRONMENT="DEV"
else
echo "Unknown environment. Exiting."
exit 1
fi
# Save the environment and workspace to GitHub environment variables
echo "ENVIRONMENT=$ENVIRONMENT" >> $GITHUB_ENV
TF_WORKSPACE="${BASE_NAME}-${ENVIRONMENT,,}" # Generate workspace name in lowercase
echo "TF_WORKSPACE=$TF_WORKSPACE" >> $GITHUB_ENV
# Step 3: Setup Terraform
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: latest
cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}
# Step 4: Initialize Terraform
- name: Terraform Init
env:
TF_CLOUD_ORGANIZATION: ${{ secrets.TF_CLOUD_ORGANIZATION }}
TF_WORKSPACE: ${{ env.TF_WORKSPACE }}
run: terraform init
# Step 5: Check Terraform format
- name: Terraform Format
run: terraform fmt -check
# Step 6: Plan Terraform changes
- name: Terraform Plan
env:
TF_CLOUD_ORGANIZATION: ${{ secrets.TF_CLOUD_ORGANIZATION }}
TF_WORKSPACE: ${{ env.TF_WORKSPACE }}
run: terraform plan
# Step 7: Apply Terraform changes
- name: Terraform Apply
if: ${{ github.event_name == 'workflow_dispatch' || env.ENVIRONMENT != 'DEV' }}
env:
TF_CLOUD_ORGANIZATION: ${{ secrets.TF_CLOUD_ORGANIZATION }}
TF_WORKSPACE: ${{ env.TF_WORKSPACE }}
run: terraform apply -auto-approve -input=false
- name: Debug Terraform Outputs
env:
TF_CLOUD_ORGANIZATION: ${{ secrets.TF_CLOUD_ORGANIZATION }}
TF_WORKSPACE: ${{ env.TF_WORKSPACE }}
run: |
terraform output -json
# Step 8: Extract Terraform Outputs
- name: Extract Terraform Outputs
id: outputs
run: |
RG_NAME=$(terraform output -raw resource_group_name)
FN_NAME=$(terraform output -raw function_app_name)
echo "RESOURCE_GROUP_NAME=$RG_NAME" >> $GITHUB_ENV
echo "FUNCTION_APP_NAME=$FN_NAME" >> $GITHUB_ENV
# Step 9: Get Publish Profile
- name: Get Publish Profile
run: |
az functionapp deployment list-publishing-profiles \
--name ${{ env.FUNCTION_APP_NAME }} \
--resource-group ${{ env.RESOURCE_GROUP_NAME }} \
--xml > publish_profile.xml
echo "AZURE_FUNCTIONAPP_PUBLISH_PROFILE=$(cat publish_profile.xml)" >> $GITHUB_ENV
deploy-code:
name: Deploy Function App Code
runs-on: ubuntu-latest
needs: terraform # Ensure this job runs after the Terraform job
steps:
# Step 1: Checkout the code repository
- name: Checkout Code
uses: actions/checkout@v4
# Step 2: Zip Function App Code
- name: Zip Function App Code
run: |
cd ${{ github.workspace }}/functions
zip -r ../function.zip . -x "*.git*"
# Step 3: Deploy Function App Code
- name: Deploy to Azure Function App
uses: azure/functions-action@v1
with:
publish-profile: ${{ env.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
package: ${{ github.workspace }}/function.zip