Skip to content

Commit 0dea41a

Browse files
chore: Improve change tracking action (#1710)
1 parent 1a2408f commit 0dea41a

5 files changed

Lines changed: 169 additions & 73 deletions

File tree

.github/actions/change-tracking/action.yml

Lines changed: 129 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ inputs:
1414
apiKey:
1515
description: 'New Relic User API key for the account'
1616
required: true
17-
region:
18-
description: 'New Relic region (US, EU, Staging)'
17+
application:
18+
description: 'New Relic application name'
1919
required: true
2020
version:
2121
description: 'Version being deployed (required for Deployment category)'
@@ -64,20 +64,12 @@ inputs:
6464
runs:
6565
using: 'composite'
6666
steps:
67-
- name: Install New Relic CLI
68-
shell: bash
69-
run: |
70-
echo "Installing New Relic CLI..."
71-
sudo snap install newrelic-cli
72-
newrelic version
73-
74-
- name: Create change tracking event
67+
- name: Create change tracking event via NerdGraph
7568
shell: bash
7669
env:
77-
ACCOUNT_ID: ${{ inputs.accountId }}
7870
ENTITY_GUID: ${{ inputs.entityGuid }}
7971
API_KEY: ${{ inputs.apiKey }}
80-
REGION: ${{ inputs.region }}
72+
APPLICATION: ${{ inputs.application }}
8173
VERSION: ${{ inputs.version }}
8274
CATEGORY: ${{ inputs.category }}
8375
TYPE: ${{ inputs.type }}
@@ -90,42 +82,136 @@ runs:
9082
GROUP_ID: ${{ inputs.groupId }}
9183
SHORT_DESCRIPTION: ${{ inputs.shortDescription }}
9284
run: |
93-
# Build command arguments array
94-
args=(
95-
"--entitySearch" "id = '$ENTITY_GUID'"
96-
"--category" "$CATEGORY"
97-
"--type" "$TYPE"
98-
)
99-
100-
# Add category-specific required fields
101-
if [ "$CATEGORY" = "Deployment" ]; then
102-
args+=("--version" "$VERSION")
103-
[ -n "$CHANGELOG" ] && args+=("--changelog" "$CHANGELOG")
104-
[ -n "$COMMIT" ] && args+=("--commit" "$COMMIT")
105-
[ -n "$DEEP_LINK" ] && args+=("--deepLink" "$DEEP_LINK")
106-
elif [ "$CATEGORY" = "Feature Flag" ]; then
107-
[ -n "$FEATURE_FLAG_ID" ] && args+=("--featureFlagId" "$FEATURE_FLAG_ID")
108-
fi
109-
110-
# Add common optional fields
111-
[ -n "$DESCRIPTION" ] && args+=("--description" "$DESCRIPTION")
112-
[ -n "$USER" ] && args+=("--user" "$USER")
113-
[ -n "$GROUP_ID" ] && args+=("--groupId" "$GROUP_ID")
114-
[ -n "$SHORT_DESCRIPTION" ] && args+=("--shortDescription" "$SHORT_DESCRIPTION")
85+
# All NerdGraph API calls go to staging
86+
API_ENDPOINT="https://staging-api.newrelic.com/graphql"
11587
116-
# Create change tracking event
117-
echo "Creating change tracking event for account $ACCOUNT_ID..."
88+
echo "Creating change tracking event via NerdGraph..."
11889
echo " Category: $CATEGORY"
11990
echo " Type: $TYPE"
91+
echo " Entity GUID: $ENTITY_GUID"
92+
echo " Application: $APPLICATION"
93+
echo " API Endpoint: $API_ENDPOINT"
94+
95+
# Convert category to uppercase with underscores (e.g., "Feature Flag" -> "FEATURE_FLAG")
96+
CATEGORY_GQL=$(echo "$CATEGORY" | tr '[:lower:]' '[:upper:]' | sed 's/ /_/g')
97+
98+
# Convert type to PascalCase without spaces (e.g., "Blue Green" -> "BlueGreen")
99+
TYPE_GQL=$(echo "$TYPE" | sed -e 's/\b\(.\)/\u\1/g' -e 's/ //g')
100+
101+
# Build categoryFields based on category
102+
CATEGORY_FIELDS=""
120103
if [ "$CATEGORY" = "Deployment" ]; then
121104
echo " Version: $VERSION"
105+
106+
# Escape quotes in values
107+
VERSION_ESC=$(echo "$VERSION" | sed 's/"/\\"/g')
108+
CATEGORY_FIELDS="deployment: { version: \\\"$VERSION_ESC\\\""
109+
110+
if [ -n "$CHANGELOG" ]; then
111+
CHANGELOG_ESC=$(echo "$CHANGELOG" | sed 's/"/\\"/g')
112+
CATEGORY_FIELDS="$CATEGORY_FIELDS, changelog: \\\"$CHANGELOG_ESC\\\""
113+
fi
114+
if [ -n "$COMMIT" ]; then
115+
COMMIT_ESC=$(echo "$COMMIT" | sed 's/"/\\"/g')
116+
CATEGORY_FIELDS="$CATEGORY_FIELDS, commit: \\\"$COMMIT_ESC\\\""
117+
fi
118+
if [ -n "$DEEP_LINK" ]; then
119+
DEEP_LINK_ESC=$(echo "$DEEP_LINK" | sed 's/"/\\"/g')
120+
CATEGORY_FIELDS="$CATEGORY_FIELDS, deepLink: \\\"$DEEP_LINK_ESC\\\""
121+
fi
122+
CATEGORY_FIELDS="$CATEGORY_FIELDS }"
123+
122124
elif [ "$CATEGORY" = "Feature Flag" ]; then
123125
echo " Feature Flag ID: $FEATURE_FLAG_ID"
126+
FEATURE_FLAG_ID_ESC=$(echo "$FEATURE_FLAG_ID" | sed 's/"/\\"/g')
127+
CATEGORY_FIELDS="featureFlag: { featureFlagId: \\\"$FEATURE_FLAG_ID_ESC\\\" }"
128+
fi
129+
130+
# Build optional fields with proper escaping
131+
OPTIONAL_FIELDS=""
132+
if [ -n "$USER" ]; then
133+
USER_ESC=$(echo "$USER" | sed 's/"/\\"/g')
134+
OPTIONAL_FIELDS="$OPTIONAL_FIELDS, user: \\\"$USER_ESC\\\""
135+
fi
136+
if [ -n "$DESCRIPTION" ]; then
137+
DESCRIPTION_ESC=$(echo "$DESCRIPTION" | sed 's/"/\\"/g' | sed 's/$//')
138+
OPTIONAL_FIELDS="$OPTIONAL_FIELDS, description: \\\"$DESCRIPTION_ESC\\\""
139+
fi
140+
if [ -n "$SHORT_DESCRIPTION" ]; then
141+
SHORT_DESCRIPTION_ESC=$(echo "$SHORT_DESCRIPTION" | sed 's/"/\\"/g')
142+
OPTIONAL_FIELDS="$OPTIONAL_FIELDS, shortDescription: \\\"$SHORT_DESCRIPTION_ESC\\\""
143+
fi
144+
if [ -n "$GROUP_ID" ]; then
145+
GROUP_ID_ESC=$(echo "$GROUP_ID" | sed 's/"/\\"/g')
146+
OPTIONAL_FIELDS="$OPTIONAL_FIELDS, groupId: \\\"$GROUP_ID_ESC\\\""
147+
fi
148+
149+
# Build the complete GraphQL mutation
150+
MUTATION_QUERY="mutation {
151+
changeTrackingCreateEvent(
152+
changeTrackingEvent: {
153+
categoryAndTypeData: {
154+
${CATEGORY_FIELDS:+categoryFields: { $CATEGORY_FIELDS },}
155+
kind: { category: \\\"$CATEGORY_GQL\\\", type: \\\"$TYPE_GQL\\\" }
156+
},
157+
entitySearch: { query: \\\"id = '$ENTITY_GUID'\\\" }
158+
$OPTIONAL_FIELDS
159+
}
160+
) {
161+
changeTrackingEvent {
162+
changeTrackingId
163+
timestamp
164+
category
165+
type
166+
user
167+
shortDescription
168+
description
169+
groupId
170+
}
171+
}
172+
}"
173+
174+
# Create JSON payload
175+
PAYLOAD=$(jq -n --arg query "$MUTATION_QUERY" '{"query": $query}')
176+
177+
# Execute the NerdGraph mutation
178+
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "$API_ENDPOINT" \
179+
-H "Content-Type: application/json" \
180+
-H "API-Key: $API_KEY" \
181+
-d "$PAYLOAD")
182+
183+
# Split response body and status code
184+
HTTP_BODY=$(echo "$RESPONSE" | sed '$d')
185+
HTTP_STATUS=$(echo "$RESPONSE" | tail -n1)
186+
187+
echo ""
188+
echo "HTTP Status: $HTTP_STATUS"
189+
echo "Response:"
190+
echo "$HTTP_BODY" | jq '.' 2>/dev/null || echo "$HTTP_BODY"
191+
192+
# Check HTTP status
193+
if [ "$HTTP_STATUS" != "200" ]; then
194+
echo ""
195+
echo "Error: HTTP request failed with status $HTTP_STATUS"
196+
exit 1
197+
fi
198+
199+
# Check for GraphQL errors
200+
if echo "$HTTP_BODY" | jq -e '.errors' > /dev/null 2>&1; then
201+
echo ""
202+
echo "Error: Change tracking event creation failed!"
203+
echo "$HTTP_BODY" | jq '.errors'
204+
exit 1
205+
fi
206+
207+
# Extract and display tracking ID
208+
TRACKING_ID=$(echo "$HTTP_BODY" | jq -r '.data.changeTrackingCreateEvent.changeTrackingEvent.changeTrackingId // empty')
209+
if [ -n "$TRACKING_ID" ]; then
210+
echo ""
211+
echo "✓ Change tracking event created successfully!"
212+
echo " Tracking ID: $TRACKING_ID"
213+
else
214+
echo ""
215+
echo "Error: Tracking ID not found in response"
216+
exit 1
124217
fi
125-
echo " GUID: $ENTITY_GUID"
126-
echo " Region: $REGION"
127-
128-
NEW_RELIC_REGION="$REGION" NEW_RELIC_API_KEY="$API_KEY" \
129-
newrelic changeTracking create "${args[@]}"
130-
131-
echo "Change tracking event created successfully!"

.github/workflows/manual-change-tracking.yml

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@ on:
77
workflow_dispatch:
88
inputs:
99
accountId:
10-
description: 'New Relic Account ID (e.g., 1067061, 550352)'
10+
description: 'New Relic Account ID'
1111
required: true
1212
type: choice
1313
options:
1414
- '1067061'
1515
- '550352'
16-
region:
17-
description: 'New Relic Region'
16+
application:
17+
description: 'New Relic Application'
1818
required: true
1919
type: choice
2020
options:
21-
- 'US'
22-
- 'EU'
23-
- 'Staging'
21+
- 'New Relic One - Staging'
22+
- 'New Relic One - EU Production'
23+
- 'New Relic One - Production'
2424
version:
2525
description: 'Version being deployed (required for Deployment category)'
2626
required: true
@@ -84,7 +84,10 @@ jobs:
8484
id: entity-config
8585
run: |
8686
ACCOUNT_ID="${{ inputs.accountId }}"
87-
REGION="${{ inputs.region }}"
87+
APPLICATION="${{ inputs.application }}"
88+
89+
# Note: All API calls go to staging-api.newrelic.com
90+
# The application parameter determines which entity GUID to use
8891
8992
# Determine API key based on account ID
9093
if [ "$ACCOUNT_ID" = "1067061" ]; then
@@ -96,30 +99,37 @@ jobs:
9699
exit 1
97100
fi
98101
99-
# Determine entity GUID based on account ID and region
100-
if [ "$ACCOUNT_ID" = "1067061" ]; then
101-
case "$REGION" in
102-
"US")
102+
# Determine entity GUID based on account ID and application
103+
if [ "$ACCOUNT_ID" = "550352" ]; then
104+
case "$APPLICATION" in
105+
"New Relic One - Staging")
106+
echo "entityGuid=${{ secrets.NR_ENTITY_GUID_BROWSER_STAGING }}" >> $GITHUB_OUTPUT
107+
;;
108+
"New Relic One - EU Production"|"New Relic One - Production")
109+
echo "Error: Account 550352 only supports 'New Relic One - Staging' application"
110+
exit 1
111+
;;
112+
*)
113+
echo "Error: Unknown application: $APPLICATION"
114+
exit 1
115+
;;
116+
esac
117+
elif [ "$ACCOUNT_ID" = "1067061" ]; then
118+
case "$APPLICATION" in
119+
"New Relic One - Production")
103120
echo "entityGuid=${{ secrets.NR_ENTITY_GUID_NR1_US_PROD }}" >> $GITHUB_OUTPUT
104121
;;
105-
"EU")
122+
"New Relic One - EU Production")
106123
echo "entityGuid=${{ secrets.NR_ENTITY_GUID_NR1_EU_PROD }}" >> $GITHUB_OUTPUT
107124
;;
108-
"Staging")
125+
"New Relic One - Staging")
109126
echo "entityGuid=${{ secrets.NR_ENTITY_GUID_NR1_STAGING }}" >> $GITHUB_OUTPUT
110127
;;
111128
*)
112-
echo "Error: Invalid region $REGION for account $ACCOUNT_ID"
129+
echo "Error: Unknown application: $APPLICATION"
113130
exit 1
114131
;;
115132
esac
116-
elif [ "$ACCOUNT_ID" = "550352" ]; then
117-
if [ "$REGION" = "Staging" ]; then
118-
echo "entityGuid=${{ secrets.NR_ENTITY_GUID_BROWSER_STAGING }}" >> $GITHUB_OUTPUT
119-
else
120-
echo "Error: Account 550352 only supports Staging region"
121-
exit 1
122-
fi
123133
fi
124134
125135
- name: Create Change Tracking Event
@@ -128,7 +138,7 @@ jobs:
128138
accountId: ${{ inputs.accountId }}
129139
entityGuid: ${{ steps.entity-config.outputs.entityGuid }}
130140
apiKey: ${{ steps.entity-config.outputs.apiKey }}
131-
region: ${{ inputs.region }}
141+
application: ${{ inputs.application }}
132142
version: ${{ inputs.version }}
133143
category: ${{ inputs.category }}
134144
type: ${{ inputs.type }}
@@ -148,7 +158,7 @@ jobs:
148158
echo "**Category:** ${{ inputs.category }}" >> $GITHUB_STEP_SUMMARY
149159
echo "**Type:** ${{ inputs.type }}" >> $GITHUB_STEP_SUMMARY
150160
echo "**Account ID:** ${{ inputs.accountId }}" >> $GITHUB_STEP_SUMMARY
151-
echo "**Region:** ${{ inputs.region }}" >> $GITHUB_STEP_SUMMARY
161+
echo "**Application:** ${{ inputs.application }}" >> $GITHUB_STEP_SUMMARY
152162
echo "**Version:** ${{ inputs.version }}" >> $GITHUB_STEP_SUMMARY
153163
if [ -n "${{ inputs.featureFlagId }}" ]; then
154164
echo "**Feature Flag ID:** ${{ inputs.featureFlagId }}" >> $GITHUB_STEP_SUMMARY

.github/workflows/publish-dev.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ jobs:
314314
accountId: '550352'
315315
entityGuid: ${{ secrets.NR_ENTITY_GUID_BROWSER_STAGING }}
316316
apiKey: ${{ secrets.NR_CHANGE_TRACKING_API_KEY_BROWSER }}
317-
region: 'Staging'
317+
application: 'New Relic One - Staging'
318318
version: staging-latest
319319
category: 'Deployment'
320320
type: 'Basic'
@@ -330,7 +330,7 @@ jobs:
330330
accountId: '1067061'
331331
entityGuid: ${{ secrets.NR_ENTITY_GUID_NR1_STAGING }}
332332
apiKey: ${{ secrets.NR_CHANGE_TRACKING_API_KEY_NR1 }}
333-
region: 'Staging'
333+
application: 'New Relic One - Staging'
334334
version: staging-latest
335335
category: 'Feature Flag'
336336
type: 'Basic'
@@ -347,7 +347,7 @@ jobs:
347347
accountId: '550352'
348348
entityGuid: ${{ secrets.NR_ENTITY_GUID_BROWSER_STAGING }}
349349
apiKey: ${{ secrets.NR_CHANGE_TRACKING_API_KEY_BROWSER }}
350-
region: 'Staging'
350+
application: 'New Relic One - Staging'
351351
version: staging-latest
352352
category: 'Feature Flag'
353353
type: 'Basic'

.github/workflows/publish-experiment.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ jobs:
152152
accountId: '550352'
153153
entityGuid: ${{ secrets.NR_ENTITY_GUID_BROWSER_STAGING }}
154154
apiKey: ${{ secrets.NR_CHANGE_TRACKING_API_KEY_BROWSER }}
155-
region: 'Staging'
155+
application: 'New Relic One - Staging'
156156
version: ${{ inputs.nr_environment }}-${{ steps.clean-branch-name.outputs.results }}
157157
type: 'Shadow'
158158
description: 'Experiment deployment for branch ${{ steps.clean-branch-name.outputs.results }}'

.github/workflows/publish-release.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ jobs:
191191
accountId: '1067061'
192192
entityGuid: ${{ secrets.NR_ENTITY_GUID_NR1_US_PROD }}
193193
apiKey: ${{ secrets.NR_CHANGE_TRACKING_API_KEY_NR1 }}
194-
region: 'US'
194+
application: 'New Relic One - Production'
195195
version: ${{ steps.agent-loader-version.outputs.results }}
196196
type: 'Rolling'
197197
description: 'Production release v${{ steps.agent-loader-version.outputs.results }}'
@@ -219,7 +219,7 @@ jobs:
219219
accountId: '1067061'
220220
entityGuid: ${{ secrets.NR_ENTITY_GUID_NR1_EU_PROD }}
221221
apiKey: ${{ secrets.NR_CHANGE_TRACKING_API_KEY_NR1 }}
222-
region: 'EU'
222+
application: 'New Relic One - EU Production'
223223
version: ${{ steps.agent-loader-version.outputs.results }}
224224
type: 'Rolling'
225225
description: 'EU production release v${{ steps.agent-loader-version.outputs.results }}'
@@ -247,7 +247,7 @@ jobs:
247247
accountId: '1067061'
248248
entityGuid: ${{ secrets.NR_ENTITY_GUID_NR1_STAGING }}
249249
apiKey: ${{ secrets.NR_CHANGE_TRACKING_API_KEY_NR1 }}
250-
region: 'Staging'
250+
application: 'New Relic One - Staging'
251251
version: ${{ steps.agent-loader-version.outputs.results }}
252252
type: 'Basic'
253253
description: 'Staging updated to production release v${{ steps.agent-loader-version.outputs.results }}'

0 commit comments

Comments
 (0)