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