1
+ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ # SPDX-License-Identifier: MIT
3
+ name : " Install/Remove Helm Charts After Scaling"
4
+ on :
5
+ # Use workflow_run to trigger this workflow after the scaling workflow completes
6
+ workflow_run :
7
+ workflows : ["EKS Cluster Scaling"]
8
+ types :
9
+ - completed
10
+ branches :
11
+ - main
12
+
13
+ # Keep the manual trigger option
14
+ workflow_dispatch :
15
+ inputs :
16
+ # Required Core Settings
17
+ cluster_name :
18
+ description : ' EKS Cluster Name'
19
+ required : true
20
+ type : string
21
+ default : ' eks-performance'
22
+ region :
23
+ description : ' AWS Region'
24
+ required : true
25
+ type : string
26
+ default : ' us-west-2'
27
+
28
+ # Optional Settings
29
+ cloudwatch_agent_repository :
30
+ description : ' CloudWatch Agent Repository'
31
+ type : string
32
+ cloudwatch_agent_tag :
33
+ description : ' CloudWatch Agent Tag'
34
+ type : string
35
+ cloudwatch_agent_operator_repository :
36
+ description : ' CloudWatch Agent Operator Repository'
37
+ type : string
38
+ cloudwatch_agent_operator_tag :
39
+ description : ' CloudWatch Agent Operator Tag'
40
+ type : string
41
+ helm-charts-branch :
42
+ description : ' Branch of the helm charts to test'
43
+ type : string
44
+ default : ' main'
45
+ operator-branch :
46
+ description : ' Branch of the operator to test'
47
+ type : string
48
+ default : ' main'
49
+ terraform_assume_role :
50
+ description : ' AWS IAM Role to assume'
51
+ type : string
52
+
53
+ concurrency :
54
+ group : ${{ github.workflow }}-${{ github.ref }}
55
+ cancel-in-progress : true
56
+
57
+ env :
58
+ # Cluster environment variables
59
+ AWS_REGION : ${{ inputs.region || 'us-west-2' }}
60
+ CLUSTER_NAME : ${{ inputs.cluster_name || 'eks-performance' }}
61
+ TERRAFORM_AWS_ASSUME_ROLE : ${{ inputs.terraform_assume_role || vars.TERRAFORM_AWS_ASSUME_ROLE }}
62
+ TERRAFORM_AWS_ASSUME_ROLE_DURATION : 3600 # 1 hour duration
63
+
64
+ # ECR repository environment variables
65
+ AGENT_ECR_TEST_REPO : " cwagent-integration-test"
66
+ OPERATOR_ECR_TEST_REPO : " cwagent-operator-pre-release"
67
+
68
+ # Github repository environment variables
69
+ OPERATOR_GITHUB_REPO_NAME : " aws/amazon-cloudwatch-agent-operator"
70
+
71
+ jobs :
72
+ # Check if this workflow should run
73
+ check-trigger :
74
+ runs-on : ubuntu-latest
75
+ if : ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'schedule') }}
76
+ steps :
77
+ - name : Check trigger type
78
+ id : check-trigger
79
+ run : |
80
+ if [ "${{ github.event_name }}" == "workflow_run" ]; then
81
+ echo "Triggered by workflow_run from a scheduled event"
82
+ else
83
+ echo "Triggered manually via workflow_dispatch"
84
+ fi
85
+ outputs :
86
+ should_continue : ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'schedule') }}
87
+
88
+ # Get latest operator commit from github repo
89
+ GetLatestOperatorCommitSHA :
90
+ needs : check-trigger
91
+ if : ${{ needs.check-trigger.outputs.should_continue == 'true' }}
92
+ runs-on : ubuntu-latest
93
+ outputs :
94
+ operator_commit_sha : ${{steps.get_latest_sha.outputs.operator_sha}}
95
+ operator_repo_name : ${{env.OPERATOR_GITHUB_REPO_NAME}}
96
+ steps :
97
+ - name : Checkout the target repo
98
+ uses : actions/checkout@v4
99
+ with :
100
+ repository : ${{env.OPERATOR_GITHUB_REPO_NAME}}
101
+ ref : ${{ inputs.operator-branch || 'main' }}
102
+ path : operator-repo
103
+
104
+ - name : Get latest commit SHA
105
+ id : get_latest_sha
106
+ run : |
107
+ cd operator-repo
108
+ latest_sha=$(git rev-parse HEAD)
109
+ echo "operator_sha=$latest_sha" >> "$GITHUB_OUTPUT"
110
+
111
+ # Build and upload agent image to ECR repo
112
+ BuildAgent :
113
+ needs : check-trigger
114
+ if : ${{ needs.check-trigger.outputs.should_continue == 'true' }}
115
+ uses : ./.github/workflows/build-test-artifacts.yml
116
+ concurrency :
117
+ group : " Build-Test-Artifacts-${{github.ref_name}}"
118
+ cancel-in-progress : true
119
+ secrets : inherit
120
+ permissions :
121
+ id-token : write
122
+ contents : read
123
+ with :
124
+ test-image-before-upload : false
125
+
126
+ # Build and upload operator image to ECR repo
127
+ BuildOperator :
128
+ needs : [ check-trigger, GetLatestOperatorCommitSHA ]
129
+ if : ${{ needs.check-trigger.outputs.should_continue == 'true' }}
130
+ uses : aws/amazon-cloudwatch-agent-operator/.github/workflows/build-and-upload.yml@main
131
+ concurrency :
132
+ group : ${{ github.workflow }}-operator-${{ inputs.operator-branch || 'main' }}
133
+ cancel-in-progress : true
134
+ secrets : inherit
135
+ with :
136
+ tag : ${{needs.GetLatestOperatorCommitSHA.outputs.operator_commit_sha}}
137
+ target-sha : ${{needs.GetLatestOperatorCommitSHA.outputs.operator_commit_sha}}
138
+ repository : ${{needs.GetLatestOperatorCommitSHA.outputs.operator_repo_name}}
139
+ test-image-before-upload : false
140
+
141
+ install-helm :
142
+ needs : [ check-trigger, BuildAgent, BuildOperator, GetLatestOperatorCommitSHA ]
143
+ if : ${{ needs.check-trigger.outputs.should_continue == 'true' }}
144
+ runs-on : ubuntu-latest
145
+ permissions :
146
+ id-token : write
147
+ contents : read
148
+ steps :
149
+ - name : Configure AWS Credentials
150
+ uses : aws-actions/configure-aws-credentials@v4
151
+ with :
152
+ role-to-assume : ${{ env.TERRAFORM_AWS_ASSUME_ROLE}}
153
+ aws-region : ${{ env.AWS_REGION}}
154
+ role-duration-seconds : ${{ env.TERRAFORM_AWS_ASSUME_ROLE_DURATION }}
155
+
156
+ - name : Login ECR
157
+ id : login-ecr
158
+ uses : aws-actions/amazon-ecr-login@v2
159
+
160
+ - name : Install kubectl
161
+ uses : azure/setup-kubectl@v3
162
+ with :
163
+ version : ' latest'
164
+
165
+ - name : Install Helm
166
+ uses : azure/setup-helm@v3
167
+ with :
168
+ version : ' latest'
169
+
170
+ - name : Update kubeconfig
171
+ run : |
172
+ aws eks update-kubeconfig --name $CLUSTER_NAME --region $AWS_REGION
173
+
174
+ - name : Clone Helm Charts Repository
175
+ run : |
176
+ rm -rf ./helm-charts
177
+ git clone -b ${{ inputs.helm-charts-branch || 'main' }} https://github.com/aws-observability/helm-charts.git ./helm-charts
178
+
179
+ - name : Check node count and manage Helm chart
180
+ run : |
181
+ NODE_COUNT=$(kubectl get nodes --no-headers | wc -l)
182
+
183
+ if [ "$NODE_COUNT" -eq 0 ]; then
184
+ echo "Node count is 0, removing Helm chart"
185
+ helm uninstall amazon-cloudwatch-observability -n amazon-cloudwatch || echo "Chart not found or already removed"
186
+ else
187
+ echo "Node count is $NODE_COUNT, installing/updating Helm chart"
188
+
189
+ # Echo all variables being passed to helm
190
+ echo "CLUSTER_NAME: ${{ inputs.cluster_name ||env.CLUSTER_NAME }}"
191
+ echo "REGION: ${{ inputs.region || env.AWS_REGION }}"
192
+ echo "AGENT_REPOSITORY: ${{ inputs.cloudwatch_agent_repository || env.AGENT_ECR_TEST_REPO }}"
193
+ echo "AGENT_TAG: ${{ inputs.cloudwatch_agent_tag || github.sha }}"
194
+ echo "AGENT_REPOSITORY_DOMAIN: ${{ steps.login-ecr.outputs.registry }}"
195
+ echo "MANAGER_REPOSITORY: ${{ inputs.cloudwatch_agent_operator_repository || env.OPERATOR_ECR_TEST_REPO }}"
196
+ echo "MANAGER_TAG: ${{ inputs.cloudwatch_agent_operator_tag || needs.GetLatestOperatorCommitSHA.outputs.operator_commit_sha }}"
197
+ echo "MANAGER_REPOSITORY_DOMAIN: ${{ steps.login-ecr.outputs.registry }}"
198
+
199
+ helm upgrade --install amazon-cloudwatch-observability \
200
+ ./helm-charts/charts/amazon-cloudwatch-observability \
201
+ --namespace amazon-cloudwatch \
202
+ --create-namespace \
203
+ --set clusterName=${{ inputs.cluster_name ||env.CLUSTER_NAME }} \
204
+ --set region=${{ inputs.region || env.AWS_REGION }} \
205
+ --set agent.image.repository=${{ inputs.cloudwatch_agent_repository || env.AGENT_ECR_TEST_REPO }} \
206
+ --set agent.image.tag=${{ inputs.cloudwatch_agent_tag || github.sha }} \
207
+ --set agent.image.repositoryDomainMap.public=${{ steps.login-ecr.outputs.registry }} \
208
+ --set manager.image.repository=${{ inputs.cloudwatch_agent_operator_repository || env.OPERATOR_ECR_TEST_REPO }} \
209
+ --set manager.image.tag=${{ inputs.cloudwatch_agent_operator_tag || needs.GetLatestOperatorCommitSHA.outputs.operator_commit_sha }} \
210
+ --set manager.image.repositoryDomainMap.public=${{ steps.login-ecr.outputs.registry }}
211
+ fi
212
+
213
+ cleanup-on-failure :
214
+ if : ${{ failure() || cancelled() }}
215
+ runs-on : ubuntu-latest
216
+ needs : [ install-helm ]
217
+ permissions :
218
+ id-token : write
219
+ contents : read
220
+ steps :
221
+ - name : Configure AWS Credentials
222
+ uses : aws-actions/configure-aws-credentials@v4
223
+ with :
224
+ role-to-assume : ${{ env.TERRAFORM_AWS_ASSUME_ROLE}}
225
+ aws-region : ${{ env.AWS_REGION}}
226
+ role-duration-seconds : ${{ env.TERRAFORM_AWS_ASSUME_ROLE_DURATION }}
227
+
228
+ - name : Install kubectl
229
+ uses : azure/setup-kubectl@v3
230
+ with :
231
+ version : ' latest'
232
+
233
+ - name : Install Helm
234
+ uses : azure/setup-helm@v3
235
+ with :
236
+ version : ' latest'
237
+
238
+ - name : Update kubeconfig
239
+ run : |
240
+ aws eks update-kubeconfig --name $CLUSTER_NAME --region $AWS_REGION
241
+
242
+ - name : Uninstall Helm chart
243
+ run : |
244
+ echo "Test was cancelled or failed. Cleaning up resources..."
245
+ helm uninstall amazon-cloudwatch-observability -n amazon-cloudwatch || echo "Chart not found or already removed"
246
+ echo "Cleanup completed"
0 commit comments