forked from PG-AGI/DevOps-Assignment
-
Notifications
You must be signed in to change notification settings - Fork 1
178 lines (149 loc) · 6.27 KB
/
Copy pathcd.yml
File metadata and controls
178 lines (149 loc) · 6.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
name: CD Pipeline
on:
push:
branches: [ "main" ]
env:
AWS_REGION: us-east-2
GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
ECR_REPOSITORY: devops-backend
GCR_REPOSITORY: devops-backend
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- 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: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Create ECR repositories if missing
run: |
aws ecr describe-repositories --repository-names devops-backend || aws ecr create-repository --repository-name devops-backend
aws ecr describe-repositories --repository-names devops-frontend || aws ecr create-repository --repository-name devops-frontend
- name: Build and push Backend to ECR
if: steps.login-ecr.outcome == 'success'
uses: docker/build-push-action@v5
with:
context: ./backend
push: true
tags: |
${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:${{ github.sha }}
${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:latest
- name: Build and push Frontend to ECR
if: steps.login-ecr.outcome == 'success'
uses: docker/build-push-action@v5
with:
context: ./frontend
push: true
tags: |
${{ steps.login-ecr.outputs.registry }}/devops-frontend:${{ github.sha }}
${{ steps.login-ecr.outputs.registry }}/devops-frontend:latest
- name: Google Auth
uses: google-github-actions/auth@v2
with:
credentials_json: '${{ secrets.GCP_CREDENTIALS }}'
continue-on-error: true
- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@v2
continue-on-error: true
- name: Enable GCP Services
run: gcloud services enable artifactregistry.googleapis.com compute.googleapis.com secretmanager.googleapis.com run.googleapis.com
continue-on-error: true
- name: Configure Docker for GCP
run: gcloud auth configure-docker
continue-on-error: true
- name: Build and push Backend to GCR
if: env.GCP_PROJECT_ID != ''
uses: docker/build-push-action@v5
with:
context: ./backend
push: true
tags: |
gcr.io/${{ env.GCP_PROJECT_ID }}/${{ env.GCR_REPOSITORY }}:${{ github.sha }}
gcr.io/${{ env.GCP_PROJECT_ID }}/${{ env.GCR_REPOSITORY }}:latest
- name: Build and push Frontend to GCR
if: env.GCP_PROJECT_ID != ''
uses: docker/build-push-action@v5
with:
context: ./frontend
push: true
tags: |
gcr.io/${{ env.GCP_PROJECT_ID }}/devops-frontend:${{ github.sha }}
gcr.io/${{ env.GCP_PROJECT_ID }}/devops-frontend:latest
deploy-terraform:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
- name: Google Auth
uses: google-github-actions/auth@v2
with:
credentials_json: '${{ secrets.GCP_CREDENTIALS }}'
- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@v2
- name: Create State Bucket
run: |
gcloud storage buckets create gs://devops-assignment-tf-state --location=us-central1 2>/dev/null || echo "Bucket already exists"
- name: Terraform Init GCP
run: |
cd terraform/gcp
terraform init
env:
GOOGLE_CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }}
- name: Terraform Apply GCP
run: |
cd terraform/gcp
terraform apply -auto-approve
env:
TF_VAR_project_id: ${{ secrets.GCP_PROJECT_ID }}
TF_VAR_alert_email: ${{ secrets.ALERT_EMAIL }}
TF_VAR_database_secret: ${{ secrets.DATABASE_SECRET }}
GOOGLE_CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }}
- name: Force Redeploy Cloud Run Services
run: |
gcloud run services update-traffic devops-frontend-v5 --to-revisions LATEST=100 --region us-central1 --project ${{ secrets.GCP_PROJECT_ID }}
gcloud run services update-traffic devops-backend-v5 --to-revisions LATEST=100 --region us-central1 --project ${{ secrets.GCP_PROJECT_ID }}
env:
GOOGLE_CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }}
continue-on-error: true
- 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: ${{ env.AWS_REGION }}
- name: Create AWS State Bucket
run: |
aws s3api create-bucket --bucket devops-assignment-tf-state-aws --region us-east-2 --create-bucket-configuration LocationConstraint=us-east-2 2>/dev/null || echo "Bucket already exists"
- name: Terraform Init AWS
run: |
cd terraform/aws
terraform init
- name: Force Redeploy ECS Services
run: |
aws ecs update-service --cluster devops-cluster --service devops-frontend-service-v2 --force-new-deployment --region ${{ env.AWS_REGION }}
aws ecs update-service --cluster devops-cluster --service devops-backend-service-v2 --force-new-deployment --region ${{ env.AWS_REGION }}
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ env.AWS_REGION }}
- name: Terraform Apply AWS
run: |
cd terraform/aws
terraform apply -auto-approve
env:
TF_VAR_aws_region: ${{ env.AWS_REGION }}
TF_VAR_ecr_repository_url: ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com
TF_VAR_db_password: ${{ secrets.DB_PASSWORD }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}