|
6 | 6 |
|
7 | 7 | env: |
8 | 8 | IMAGE_NAME: python-app |
| 9 | + TF_DIR: ./terraform # Update if your terraform path differs |
9 | 10 |
|
10 | 11 | jobs: |
11 | 12 | build-and-deploy: |
12 | 13 | runs-on: ubuntu-latest |
13 | 14 |
|
14 | 15 | steps: |
| 16 | + ############################################################### |
| 17 | + # Checkout Repository |
| 18 | + ############################################################### |
15 | 19 | - name: Checkout repository |
16 | 20 | uses: actions/checkout@v4 |
17 | 21 |
|
| 22 | + ############################################################### |
| 23 | + # Configure Git (for Terraform modules hosted on GitHub) |
| 24 | + ############################################################### |
18 | 25 | - name: Configure Git for Terraform module downloads |
19 | 26 | run: | |
20 | 27 | git config --global url."https://${{ secrets.GH_TOKEN }}:x-oauth-basic@github.com/".insteadOf "https://github.com/" |
21 | 28 |
|
22 | | - - name: Log in to Azure |
| 29 | + ############################################################### |
| 30 | + # Login to Azure |
| 31 | + ############################################################### |
| 32 | + - name: Azure Login |
23 | 33 | uses: azure/login@v2 |
24 | 34 | with: |
25 | 35 | creds: ${{ secrets.AZURE_CREDENTIALS }} |
26 | 36 |
|
| 37 | + ############################################################### |
| 38 | + # Login to Azure Container Registry |
| 39 | + ############################################################### |
27 | 40 | - name: Log in to ACR |
28 | | - run: | |
29 | | - az acr login --name ${{ secrets.ACR_NAME }} |
| 41 | + run: az acr login --name ${{ secrets.ACR_NAME }} |
30 | 42 |
|
| 43 | + ############################################################### |
| 44 | + # Determine Deployment Slot (Blue or Green) |
| 45 | + ############################################################### |
31 | 46 | - name: Determine Deployment Slot (Blue/Green) |
32 | 47 | id: slot |
33 | 48 | run: | |
34 | | - # Toggle deployment slot |
35 | 49 | LAST_SLOT_FILE=".last_slot" |
36 | 50 | if [ -f "$LAST_SLOT_FILE" ]; then |
37 | 51 | LAST_SLOT=$(cat $LAST_SLOT_FILE) |
38 | 52 | if [ "$LAST_SLOT" == "blue" ]; then |
39 | | - echo "green" > $LAST_SLOT_FILE |
40 | | - echo "slot=green" >> $GITHUB_OUTPUT |
| 53 | + NEW_SLOT="green" |
41 | 54 | else |
42 | | - echo "blue" > $LAST_SLOT_FILE |
43 | | - echo "slot=blue" >> $GITHUB_OUTPUT |
| 55 | + NEW_SLOT="blue" |
44 | 56 | fi |
45 | 57 | else |
46 | | - echo "blue" > $LAST_SLOT_FILE |
47 | | - echo "slot=blue" >> $GITHUB_OUTPUT |
| 58 | + NEW_SLOT="blue" |
48 | 59 | fi |
| 60 | + echo $NEW_SLOT > $LAST_SLOT_FILE |
| 61 | + echo "slot=$NEW_SLOT" >> $GITHUB_OUTPUT |
49 | 62 |
|
50 | | - - name: Build and Push Docker image to ACR |
| 63 | + ############################################################### |
| 64 | + # Build & Push Docker Image to ACR |
| 65 | + ############################################################### |
| 66 | + - name: Build and Push Docker image |
51 | 67 | run: | |
52 | 68 | IMAGE_TAG=${{ github.run_number }} |
53 | | - az acr build --registry ${{ secrets.ACR_NAME }} \ |
| 69 | + az acr build \ |
| 70 | + --registry ${{ secrets.ACR_NAME }} \ |
54 | 71 | --image ${{ env.IMAGE_NAME }}:${IMAGE_TAG} \ |
55 | | - --image ${{ env.IMAGE_NAME }}:latest . |
| 72 | + --image ${{ env.IMAGE_NAME }}:${{ steps.slot.outputs.slot }} \ |
| 73 | + . |
56 | 74 |
|
| 75 | + ############################################################### |
| 76 | + # Setup Terraform |
| 77 | + ############################################################### |
57 | 78 | - name: Setup Terraform |
58 | 79 | uses: hashicorp/setup-terraform@v3 |
59 | 80 | with: |
60 | 81 | terraform_version: 1.9.5 |
61 | 82 |
|
| 83 | + ############################################################### |
| 84 | + # Terraform Init |
| 85 | + ############################################################### |
62 | 86 | - name: Terraform Init |
63 | | - working-directory: terraformv3/examples/complete/container_platform |
| 87 | + working-directory: ${{ env.TF_DIR }} |
64 | 88 | env: |
65 | 89 | ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} |
66 | 90 | ARM_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} |
67 | 91 | ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} |
68 | 92 | ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} |
69 | 93 | run: terraform init -input=false |
70 | 94 |
|
| 95 | + ############################################################### |
| 96 | + # Terraform Plan |
| 97 | + ############################################################### |
71 | 98 | - name: Terraform Plan |
72 | | - working-directory: terraformv3/examples/complete/container_platform |
| 99 | + working-directory: ${{ env.TF_DIR }} |
73 | 100 | env: |
74 | 101 | ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} |
75 | 102 | ARM_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} |
76 | 103 | ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} |
77 | 104 | ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} |
78 | 105 | run: | |
79 | 106 | terraform plan \ |
80 | | - -var="image_tag=${{ github.run_number }}" \ |
| 107 | + -var="docker_image_name=${{ env.IMAGE_NAME }}" \ |
| 108 | + -var="docker_registry_url=${{ secrets.ACR_LOGIN_SERVER }}" \ |
81 | 109 | -var="slot_name=${{ steps.slot.outputs.slot }}" \ |
82 | | - -var="acr_login_server=${{ secrets.ACR_LOGIN_SERVER }}" \ |
83 | | - -var="image_name=${{ env.IMAGE_NAME }}" \ |
| 110 | + -var="image_tag=${{ github.run_number }}" \ |
84 | 111 | -out=tfplan |
85 | 112 |
|
| 113 | + ############################################################### |
| 114 | + # Terraform Apply (Deploy Selected Slot) |
| 115 | + ############################################################### |
86 | 116 | - name: Terraform Apply |
87 | | - working-directory: terraformv3/examples/complete/container_platform |
| 117 | + working-directory: ${{ env.TF_DIR }} |
88 | 118 | env: |
89 | 119 | ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} |
90 | 120 | ARM_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} |
91 | 121 | ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} |
92 | 122 | ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} |
93 | 123 | run: terraform apply -auto-approve tfplan |
| 124 | + |
| 125 | + ############################################################### |
| 126 | + # Optional: Swap Slots (Green <-> Blue) |
| 127 | + ############################################################### |
| 128 | + - name: Swap Slots (Post Deployment) |
| 129 | + if: success() |
| 130 | + working-directory: ${{ env.TF_DIR }} |
| 131 | + run: terraform apply -auto-approve -target=azurerm_web_app_slot_swap.swap |
0 commit comments