@@ -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:
6464runs :
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!"
0 commit comments