@peterhauge/apiops-cli 0.2.1-alpha.0 → 0.3.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -169
- package/dist/cli/extract-command.d.ts +2 -2
- package/dist/cli/extract-command.d.ts.map +1 -1
- package/dist/cli/extract-command.js +3 -5
- package/dist/cli/extract-command.js.map +1 -1
- package/dist/cli/index.js +2 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init-command.d.ts +1 -1
- package/dist/cli/init-command.js +1 -1
- package/dist/cli/publish-command.d.ts +2 -2
- package/dist/cli/publish-command.js +3 -3
- package/dist/clients/apim-client.d.ts +16 -5
- package/dist/clients/apim-client.d.ts.map +1 -1
- package/dist/clients/apim-client.js +22 -7
- package/dist/clients/apim-client.js.map +1 -1
- package/dist/clients/artifact-store.d.ts +4 -4
- package/dist/clients/artifact-store.d.ts.map +1 -1
- package/dist/clients/artifact-store.js +10 -4
- package/dist/clients/artifact-store.js.map +1 -1
- package/dist/clients/iapim-client.d.ts +14 -2
- package/dist/clients/iapim-client.d.ts.map +1 -1
- package/dist/clients/iapim-client.js +1 -1
- package/dist/clients/iartifact-store.d.ts +10 -5
- package/dist/clients/iartifact-store.d.ts.map +1 -1
- package/dist/clients/iartifact-store.js +1 -1
- package/dist/lib/cloud-config.d.ts +1 -1
- package/dist/lib/cloud-config.js +1 -1
- package/dist/lib/config-loader.d.ts +2 -7
- package/dist/lib/config-loader.d.ts.map +1 -1
- package/dist/lib/config-loader.js +3 -22
- package/dist/lib/config-loader.js.map +1 -1
- package/dist/lib/dependency-graph.d.ts +1 -1
- package/dist/lib/dependency-graph.js +1 -1
- package/dist/lib/exit-codes.d.ts +1 -1
- package/dist/lib/exit-codes.js +1 -1
- package/dist/lib/logger.js +1 -1
- package/dist/lib/parallel-runner.d.ts +2 -2
- package/dist/lib/parallel-runner.js +2 -2
- package/dist/lib/resource-path.d.ts +1 -1
- package/dist/lib/resource-path.js +1 -1
- package/dist/lib/resource-uri.d.ts +1 -1
- package/dist/lib/resource-uri.js +1 -1
- package/dist/lib/workspace-link.d.ts +31 -3
- package/dist/lib/workspace-link.d.ts.map +1 -1
- package/dist/lib/workspace-link.js +49 -3
- package/dist/lib/workspace-link.js.map +1 -1
- package/dist/models/config.d.ts +2 -4
- package/dist/models/config.d.ts.map +1 -1
- package/dist/models/config.js +1 -1
- package/dist/models/resource-types.d.ts +1 -1
- package/dist/models/resource-types.d.ts.map +1 -1
- package/dist/models/resource-types.js +5 -3
- package/dist/models/resource-types.js.map +1 -1
- package/dist/models/types.d.ts +22 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js +1 -1
- package/dist/services/api-extractor.d.ts +1 -1
- package/dist/services/api-extractor.d.ts.map +1 -1
- package/dist/services/api-extractor.js +29 -127
- package/dist/services/api-extractor.js.map +1 -1
- package/dist/services/api-publisher.d.ts +1 -1
- package/dist/services/api-publisher.d.ts.map +1 -1
- package/dist/services/api-publisher.js +50 -18
- package/dist/services/api-publisher.js.map +1 -1
- package/dist/services/delete-unmatched-service.d.ts +1 -1
- package/dist/services/delete-unmatched-service.js +1 -1
- package/dist/services/dry-run-reporter.d.ts +1 -1
- package/dist/services/dry-run-reporter.js +1 -1
- package/dist/services/extract-service.d.ts +1 -1
- package/dist/services/extract-service.js +1 -1
- package/dist/services/filter-service.d.ts +19 -1
- package/dist/services/filter-service.d.ts.map +1 -1
- package/dist/services/filter-service.js +40 -2
- package/dist/services/filter-service.js.map +1 -1
- package/dist/services/git-diff-service.d.ts +1 -1
- package/dist/services/git-diff-service.js +1 -1
- package/dist/services/identity-guide-service.d.ts +1 -1
- package/dist/services/identity-guide-service.js +12 -12
- package/dist/services/init-service.d.ts +1 -1
- package/dist/services/init-service.js +1 -1
- package/dist/services/override-merger.d.ts +1 -1
- package/dist/services/override-merger.js +1 -1
- package/dist/services/product-extractor.d.ts +1 -1
- package/dist/services/product-extractor.d.ts.map +1 -1
- package/dist/services/product-extractor.js +27 -26
- package/dist/services/product-extractor.js.map +1 -1
- package/dist/services/product-publisher.d.ts.map +1 -1
- package/dist/services/product-publisher.js +25 -9
- package/dist/services/product-publisher.js.map +1 -1
- package/dist/services/prompt-service.d.ts +1 -1
- package/dist/services/prompt-service.js +1 -1
- package/dist/services/publish-service.d.ts +1 -1
- package/dist/services/publish-service.js +1 -1
- package/dist/services/resource-extractor.d.ts +1 -1
- package/dist/services/resource-extractor.js +1 -1
- package/dist/services/resource-publisher.d.ts +9 -1
- package/dist/services/resource-publisher.d.ts.map +1 -1
- package/dist/services/resource-publisher.js +30 -9
- package/dist/services/resource-publisher.js.map +1 -1
- package/dist/services/secret-redactor.d.ts +1 -1
- package/dist/services/secret-redactor.js +1 -1
- package/dist/services/transitive-resolver.d.ts +1 -1
- package/dist/services/transitive-resolver.js +1 -1
- package/dist/services/workspace-extractor.d.ts +7 -1
- package/dist/services/workspace-extractor.d.ts.map +1 -1
- package/dist/services/workspace-extractor.js +75 -10
- package/dist/services/workspace-extractor.js.map +1 -1
- package/dist/templates/azure-devops/extract-pipeline.d.ts +1 -1
- package/dist/templates/azure-devops/extract-pipeline.js +142 -142
- package/dist/templates/azure-devops/publish-pipeline.d.ts +1 -1
- package/dist/templates/azure-devops/publish-pipeline.js +114 -114
- package/dist/templates/configs/filter-config.d.ts +1 -1
- package/dist/templates/configs/filter-config.d.ts.map +1 -1
- package/dist/templates/configs/filter-config.js +118 -109
- package/dist/templates/configs/filter-config.js.map +1 -1
- package/dist/templates/configs/override-config.d.ts +1 -1
- package/dist/templates/configs/override-config.d.ts.map +1 -1
- package/dist/templates/configs/override-config.js +92 -91
- package/dist/templates/configs/override-config.js.map +1 -1
- package/dist/templates/github-actions/extract-workflow.d.ts +1 -1
- package/dist/templates/github-actions/extract-workflow.js +119 -119
- package/dist/templates/github-actions/publish-workflow.d.ts +1 -1
- package/dist/templates/github-actions/publish-workflow.d.ts.map +1 -1
- package/dist/templates/github-actions/publish-workflow.js +147 -104
- package/dist/templates/github-actions/publish-workflow.js.map +1 -1
- package/package.json +69 -69
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Workspace-scoped extraction
|
|
3
3
|
* List workspaces, extract workspace-scoped resources under workspaces/{name}/
|
|
4
4
|
* using same resource-extractor with workspace context prefix.
|
|
5
5
|
*/
|
|
@@ -23,4 +23,10 @@ export interface WorkspaceExtractionResult {
|
|
|
23
23
|
* @returns Results per workspace
|
|
24
24
|
*/
|
|
25
25
|
export declare function extractWorkspaces(client: IApimClient, store: IArtifactStore, context: ApimServiceContext, outputDir: string, filter?: FilterConfig): Promise<WorkspaceExtractionResult[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the effective FilterConfig for a workspace.
|
|
28
|
+
* If the workspace has a sub-filter in workspaceSubFilters, convert it to a FilterConfig.
|
|
29
|
+
* Otherwise return undefined (no filter = extract everything in the workspace).
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveWorkspaceFilter(workspaceName: string, filter?: FilterConfig): FilterConfig | undefined;
|
|
26
32
|
//# sourceMappingURL=workspace-extractor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-extractor.d.ts","sourceRoot":"","sources":["../../src/services/workspace-extractor.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"workspace-extractor.d.ts","sourceRoot":"","sources":["../../src/services/workspace-extractor.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AAiBvE,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAqEtC;AA0ID;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,YAAY,GACpB,YAAY,GAAG,SAAS,CAiB1B"}
|
|
@@ -4,6 +4,7 @@ import { extractApiResources, extractWorkspaceApiTags } from './api-extractor.js
|
|
|
4
4
|
import { extractProductResources, extractWorkspaceProductTags } from './product-extractor.js';
|
|
5
5
|
import { logger } from '../lib/logger.js';
|
|
6
6
|
import { getNamePart } from '../lib/resource-path.js';
|
|
7
|
+
import { isWildcardPattern, wildcardMatch } from './filter-service.js';
|
|
7
8
|
/**
|
|
8
9
|
* Types that can exist at the workspace level, derived from RESOURCE_TYPE_METADATA.
|
|
9
10
|
* Enumerated in declaration order for deterministic iteration.
|
|
@@ -30,18 +31,30 @@ export async function extractWorkspaces(client, store, context, outputDir, filte
|
|
|
30
31
|
logger.debug('Workspace filter is empty array — excluding all workspaces');
|
|
31
32
|
return results;
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
+
const hasWildcards = filter.workspaces.some(isWildcardPattern);
|
|
35
|
+
if (hasWildcards) {
|
|
36
|
+
// Wildcard patterns require discovery so we can match against real names
|
|
37
|
+
const discovered = await discoverWorkspaceNames(client, context);
|
|
38
|
+
workspaceNames = discovered.filter((name) => filter.workspaces.some((pattern) => isWildcardPattern(pattern)
|
|
39
|
+
? wildcardMatch(pattern, name)
|
|
40
|
+
: pattern.toLowerCase() === name.toLowerCase()));
|
|
41
|
+
// Warn about exact (non-wildcard) entries that didn't match any discovered workspace
|
|
42
|
+
for (const entry of filter.workspaces) {
|
|
43
|
+
if (!isWildcardPattern(entry)) {
|
|
44
|
+
const matched = discovered.some((d) => d.toLowerCase() === entry.toLowerCase());
|
|
45
|
+
if (!matched) {
|
|
46
|
+
logger.warn(`Workspace filter entry "${entry}" did not match any discovered workspace`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
workspaceNames = filter.workspaces;
|
|
53
|
+
}
|
|
34
54
|
}
|
|
35
55
|
else {
|
|
36
56
|
// No workspace filter defined — discover all workspaces
|
|
37
|
-
|
|
38
|
-
for await (const item of client.listResources(context, ResourceType.Workspace)) {
|
|
39
|
-
const name = item['name'];
|
|
40
|
-
if (typeof name === 'string') {
|
|
41
|
-
discovered.push(name);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
workspaceNames = discovered;
|
|
57
|
+
workspaceNames = await discoverWorkspaceNames(client, context);
|
|
45
58
|
}
|
|
46
59
|
if (workspaceNames.length === 0) {
|
|
47
60
|
logger.debug('No workspaces found — skipping workspace extraction');
|
|
@@ -59,7 +72,7 @@ export async function extractWorkspaces(client, store, context, outputDir, filte
|
|
|
59
72
|
else {
|
|
60
73
|
await store.writeResource(outputDir, wsDescriptor, wsJson);
|
|
61
74
|
}
|
|
62
|
-
const wsResult = await extractWorkspace(client, store, context, wsName, outputDir, filter);
|
|
75
|
+
const wsResult = await extractWorkspace(client, store, context, wsName, outputDir, resolveWorkspaceFilter(wsName, filter));
|
|
63
76
|
results.push(wsResult);
|
|
64
77
|
}
|
|
65
78
|
return results;
|
|
@@ -155,4 +168,56 @@ async function extractWorkspace(client, store, context, workspaceName, outputDir
|
|
|
155
168
|
logger.info(`Workspace "${workspaceName}": extracted ${resourceCount} resources, ${errorCount} errors`);
|
|
156
169
|
return { workspaceName, resourceCount, errorCount };
|
|
157
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Discover all workspace names from APIM.
|
|
173
|
+
*/
|
|
174
|
+
async function discoverWorkspaceNames(client, context) {
|
|
175
|
+
const names = [];
|
|
176
|
+
for await (const item of client.listResources(context, ResourceType.Workspace)) {
|
|
177
|
+
const name = item['name'];
|
|
178
|
+
if (typeof name === 'string') {
|
|
179
|
+
names.push(name);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return names;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Resolve the effective FilterConfig for a workspace.
|
|
186
|
+
* If the workspace has a sub-filter in workspaceSubFilters, convert it to a FilterConfig.
|
|
187
|
+
* Otherwise return undefined (no filter = extract everything in the workspace).
|
|
188
|
+
*/
|
|
189
|
+
export function resolveWorkspaceFilter(workspaceName, filter) {
|
|
190
|
+
if (!filter?.workspaceSubFilters) {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
// Case-insensitive lookup of workspace sub-filter
|
|
194
|
+
const lowerName = workspaceName.toLowerCase();
|
|
195
|
+
const matchingKey = Object.keys(filter.workspaceSubFilters).find((k) => k.toLowerCase() === lowerName);
|
|
196
|
+
if (!matchingKey) {
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
const sub = filter.workspaceSubFilters[matchingKey];
|
|
200
|
+
return workspaceSubFilterToFilterConfig(sub);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Convert a WorkspaceSubFilter to a FilterConfig so the standard
|
|
204
|
+
* filter-service matching logic can be applied to workspace-scoped resources.
|
|
205
|
+
*/
|
|
206
|
+
function workspaceSubFilterToFilterConfig(sub) {
|
|
207
|
+
return {
|
|
208
|
+
apis: sub.apis,
|
|
209
|
+
apiSubFilters: sub.apiSubFilters,
|
|
210
|
+
backends: sub.backends,
|
|
211
|
+
diagnostics: sub.diagnostics,
|
|
212
|
+
groups: sub.groups,
|
|
213
|
+
loggers: sub.loggers,
|
|
214
|
+
namedValues: sub.namedValues,
|
|
215
|
+
policyFragments: sub.policyFragments,
|
|
216
|
+
products: sub.products,
|
|
217
|
+
schemas: sub.schemas,
|
|
218
|
+
subscriptions: sub.subscriptions,
|
|
219
|
+
tags: sub.tags,
|
|
220
|
+
versionSets: sub.versionSets,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
158
223
|
//# sourceMappingURL=workspace-extractor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-extractor.js","sourceRoot":"","sources":["../../src/services/workspace-extractor.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAEnF,OAAO,EAAE,mBAAmB,EAAqB,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-extractor.js","sourceRoot":"","sources":["../../src/services/workspace-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Microsoft Corporation.
|
|
2
2
|
// Licensed under the MIT license.
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Azure DevOps extract pipeline template
|
|
5
5
|
* Manual trigger with environment choice, configuration choice, and auto-PR creation
|
|
6
6
|
*/
|
|
7
7
|
export function generateExtractPipeline(config) {
|
|
@@ -10,147 +10,147 @@ export function generateExtractPipeline(config) {
|
|
|
10
10
|
const varGroupBlocks = config.environments
|
|
11
11
|
.map((env) => `- \${{ if eq(parameters.ENVIRONMENT, '${env}') }}:\n - group: apim-${env}`)
|
|
12
12
|
.join('\n');
|
|
13
|
-
return `# Azure DevOps Pipeline: Run APIM Extractor
|
|
14
|
-
|
|
15
|
-
trigger: none
|
|
16
|
-
|
|
17
|
-
parameters:
|
|
18
|
-
- name: ENVIRONMENT
|
|
19
|
-
type: string
|
|
20
|
-
displayName: 'Choose which environment to extract from'
|
|
21
|
-
default: '${defaultEnv}'
|
|
22
|
-
values:
|
|
23
|
-
${envValues}
|
|
24
|
-
- name: CONFIGURATION_YAML_PATH
|
|
25
|
-
type: string
|
|
26
|
-
displayName: 'Choose whether to extract all APIs or use the extraction configuration file'
|
|
27
|
-
default: 'Extract All APIs'
|
|
28
|
-
values:
|
|
29
|
-
- 'Extract All APIs'
|
|
30
|
-
- 'configuration.extractor.yaml'
|
|
31
|
-
|
|
32
|
-
pool:
|
|
33
|
-
vmImage: 'ubuntu-latest'
|
|
34
|
-
|
|
35
|
-
variables:
|
|
36
|
-
${varGroupBlocks}
|
|
37
|
-
|
|
38
|
-
steps:
|
|
39
|
-
- checkout: self
|
|
40
|
-
persistCredentials: true
|
|
41
|
-
fetchDepth: 2
|
|
42
|
-
|
|
43
|
-
- task: UseNode@1
|
|
44
|
-
displayName: 'Setup Node.js'
|
|
45
|
-
inputs:
|
|
46
|
-
version: '22.x'
|
|
47
|
-
|
|
48
|
-
- script: |
|
|
49
|
-
if [ -f package-lock.json ] || [ -f npm-shrinkwrap.json ]; then
|
|
50
|
-
npm ci
|
|
51
|
-
else
|
|
52
|
-
npm install --no-audit --no-fund
|
|
53
|
-
fi
|
|
54
|
-
displayName: 'Install dependencies'
|
|
55
|
-
|
|
56
|
-
- bash: |
|
|
57
|
-
APIM_RESOURCE_GROUP='$(APIM_RESOURCE_GROUP)'
|
|
58
|
-
APIM_SERVICE_NAME='$(APIM_SERVICE_NAME)'
|
|
59
|
-
SERVICE_CONNECTION='$(AZURE_SERVICE_CONNECTION)'
|
|
60
|
-
SUBSCRIPTION_ID='$(AZURE_SUBSCRIPTION_ID)'
|
|
61
|
-
|
|
62
|
-
if [[ -z "$APIM_RESOURCE_GROUP" || "$APIM_RESOURCE_GROUP" == '$('*')' ]]; then
|
|
63
|
-
echo "##vso[task.logissue type=error]APIM_RESOURCE_GROUP is not set. Ensure variable group 'apim-\${{ parameters.ENVIRONMENT }}' is authorized and defines APIM_RESOURCE_GROUP."
|
|
64
|
-
exit 2
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
if [[ -z "$APIM_SERVICE_NAME" || "$APIM_SERVICE_NAME" == '$('*')' ]]; then
|
|
68
|
-
echo "##vso[task.logissue type=error]APIM_SERVICE_NAME is not set. Ensure variable group 'apim-\${{ parameters.ENVIRONMENT }}' is authorized and defines APIM_SERVICE_NAME."
|
|
69
|
-
exit 2
|
|
70
|
-
fi
|
|
71
|
-
|
|
72
|
-
if [[ -z "$SERVICE_CONNECTION" || "$SERVICE_CONNECTION" == '$('*')' ]]; then
|
|
73
|
-
echo "##vso[task.logissue type=error]AZURE_SERVICE_CONNECTION is not set. Ensure variable group 'apim-\${{ parameters.ENVIRONMENT }}' is authorized and defines AZURE_SERVICE_CONNECTION."
|
|
74
|
-
exit 2
|
|
75
|
-
fi
|
|
76
|
-
|
|
77
|
-
if [[ -z "$SUBSCRIPTION_ID" || "$SUBSCRIPTION_ID" == '$('*')' ]]; then
|
|
78
|
-
echo "##vso[task.logissue type=error]AZURE_SUBSCRIPTION_ID is not set. Ensure variable group 'apim-\${{ parameters.ENVIRONMENT }}' is authorized and defines AZURE_SUBSCRIPTION_ID."
|
|
79
|
-
exit 2
|
|
80
|
-
fi
|
|
81
|
-
|
|
82
|
-
echo "All required variables are configured for environment '\${{ parameters.ENVIRONMENT }}'"
|
|
83
|
-
displayName: 'Validate required variables'
|
|
84
|
-
|
|
85
|
-
- task: AzureCLI@2
|
|
86
|
-
displayName: 'Run APIM Extract (All APIs)'
|
|
87
|
-
condition: eq('\${{ parameters.CONFIGURATION_YAML_PATH }}', 'Extract All APIs')
|
|
88
|
-
inputs:
|
|
89
|
-
azureSubscription: '$(AZURE_SERVICE_CONNECTION)'
|
|
90
|
-
scriptType: 'bash'
|
|
91
|
-
scriptLocation: 'inlineScript'
|
|
92
|
-
inlineScript: |
|
|
93
|
-
npx @peterhauge/apiops-cli extract \\
|
|
94
|
-
--resource-group "$(APIM_RESOURCE_GROUP)" \\
|
|
95
|
-
--service-name "$(APIM_SERVICE_NAME)" \\
|
|
96
|
-
--output ${config.artifactDir} \\
|
|
97
|
-
--subscription-id "$(AZURE_SUBSCRIPTION_ID)"
|
|
98
|
-
|
|
99
|
-
- task: AzureCLI@2
|
|
100
|
-
displayName: 'Run APIM Extract (With Configuration)'
|
|
101
|
-
condition: ne('\${{ parameters.CONFIGURATION_YAML_PATH }}', 'Extract All APIs')
|
|
102
|
-
inputs:
|
|
103
|
-
azureSubscription: '$(AZURE_SERVICE_CONNECTION)'
|
|
104
|
-
scriptType: 'bash'
|
|
105
|
-
scriptLocation: 'inlineScript'
|
|
106
|
-
inlineScript: |
|
|
107
|
-
npx @peterhauge/apiops-cli extract \\
|
|
108
|
-
--resource-group "$(APIM_RESOURCE_GROUP)" \\
|
|
109
|
-
--service-name "$(APIM_SERVICE_NAME)" \\
|
|
110
|
-
--output ${config.artifactDir} \\
|
|
111
|
-
--filter configuration.extractor.yaml \\
|
|
112
|
-
--subscription-id "$(AZURE_SUBSCRIPTION_ID)"
|
|
113
|
-
|
|
114
|
-
- task: PublishPipelineArtifact@1
|
|
115
|
-
displayName: 'Publish artifacts'
|
|
116
|
-
inputs:
|
|
117
|
-
targetPath: ${config.artifactDir}
|
|
118
|
-
artifactName: apim-artifacts
|
|
119
|
-
|
|
120
|
-
- bash: |
|
|
121
|
-
BRANCH_NAME="apim-extract-$(Build.BuildId)"
|
|
122
|
-
TARGET_BRANCH="$(Build.SourceBranch)"
|
|
123
|
-
BUILD_ID="$(Build.BuildId)"
|
|
124
|
-
|
|
125
|
-
git config user.name "Azure DevOps"
|
|
126
|
-
git config user.email "azuredevops@microsoft.com"
|
|
127
|
-
git checkout -b "$BRANCH_NAME"
|
|
128
|
-
git add ${config.artifactDir}
|
|
129
|
-
if git diff --cached --quiet; then
|
|
130
|
-
echo "No changes to commit"
|
|
131
|
-
exit 0
|
|
132
|
-
fi
|
|
133
|
-
git commit -m "chore: update APIM artifacts from extract"
|
|
134
|
-
git push origin "$BRANCH_NAME"
|
|
135
|
-
|
|
136
|
-
PR_PAYLOAD=$(printf '{"title":"APIM Extract - Update artifacts","description":"Auto-generated by APIM extract pipeline run %s","sourceRefName":"refs/heads/%s","targetRefName":"%s"}' \\
|
|
137
|
-
"$BUILD_ID" "$BRANCH_NAME" "$TARGET_BRANCH")
|
|
138
|
-
|
|
139
|
-
HTTP_STATUS=$(curl -s -o /tmp/pr_response.json -w "%{http_code}" -X POST \\
|
|
140
|
-
-H "Content-Type: application/json" \\
|
|
141
|
-
-H "Authorization: Bearer $SYSTEM_ACCESSTOKEN" \\
|
|
142
|
-
"$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.Name)/pullrequests?api-version=7.1" \\
|
|
143
|
-
-d "$PR_PAYLOAD")
|
|
144
|
-
|
|
145
|
-
if [ "$HTTP_STATUS" = "201" ]; then
|
|
146
|
-
PR_ID=$(python3 -c "import json; print(json.load(open('/tmp/pr_response.json'))['pullRequestId'])" 2>/dev/null)
|
|
147
|
-
echo "##vso[task.logissue type=warning]Pull request created: $(System.TeamFoundationCollectionUri)$(System.TeamProject)/_git/$(Build.Repository.Name)/pullrequest/$PR_ID"
|
|
148
|
-
else
|
|
149
|
-
echo "##vso[task.logissue type=warning]Could not auto-create PR (HTTP $HTTP_STATUS). Please create a PR from '$BRANCH_NAME' to '$TARGET_BRANCH' manually."
|
|
150
|
-
fi
|
|
151
|
-
displayName: 'Create branch and open pull request'
|
|
152
|
-
env:
|
|
153
|
-
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
|
|
13
|
+
return `# Azure DevOps Pipeline: Run APIM Extractor
|
|
14
|
+
|
|
15
|
+
trigger: none
|
|
16
|
+
|
|
17
|
+
parameters:
|
|
18
|
+
- name: ENVIRONMENT
|
|
19
|
+
type: string
|
|
20
|
+
displayName: 'Choose which environment to extract from'
|
|
21
|
+
default: '${defaultEnv}'
|
|
22
|
+
values:
|
|
23
|
+
${envValues}
|
|
24
|
+
- name: CONFIGURATION_YAML_PATH
|
|
25
|
+
type: string
|
|
26
|
+
displayName: 'Choose whether to extract all APIs or use the extraction configuration file'
|
|
27
|
+
default: 'Extract All APIs'
|
|
28
|
+
values:
|
|
29
|
+
- 'Extract All APIs'
|
|
30
|
+
- 'configuration.extractor.yaml'
|
|
31
|
+
|
|
32
|
+
pool:
|
|
33
|
+
vmImage: 'ubuntu-latest'
|
|
34
|
+
|
|
35
|
+
variables:
|
|
36
|
+
${varGroupBlocks}
|
|
37
|
+
|
|
38
|
+
steps:
|
|
39
|
+
- checkout: self
|
|
40
|
+
persistCredentials: true
|
|
41
|
+
fetchDepth: 2
|
|
42
|
+
|
|
43
|
+
- task: UseNode@1
|
|
44
|
+
displayName: 'Setup Node.js'
|
|
45
|
+
inputs:
|
|
46
|
+
version: '22.x'
|
|
47
|
+
|
|
48
|
+
- script: |
|
|
49
|
+
if [ -f package-lock.json ] || [ -f npm-shrinkwrap.json ]; then
|
|
50
|
+
npm ci
|
|
51
|
+
else
|
|
52
|
+
npm install --no-audit --no-fund
|
|
53
|
+
fi
|
|
54
|
+
displayName: 'Install dependencies'
|
|
55
|
+
|
|
56
|
+
- bash: |
|
|
57
|
+
APIM_RESOURCE_GROUP='$(APIM_RESOURCE_GROUP)'
|
|
58
|
+
APIM_SERVICE_NAME='$(APIM_SERVICE_NAME)'
|
|
59
|
+
SERVICE_CONNECTION='$(AZURE_SERVICE_CONNECTION)'
|
|
60
|
+
SUBSCRIPTION_ID='$(AZURE_SUBSCRIPTION_ID)'
|
|
61
|
+
|
|
62
|
+
if [[ -z "$APIM_RESOURCE_GROUP" || "$APIM_RESOURCE_GROUP" == '$('*')' ]]; then
|
|
63
|
+
echo "##vso[task.logissue type=error]APIM_RESOURCE_GROUP is not set. Ensure variable group 'apim-\${{ parameters.ENVIRONMENT }}' is authorized and defines APIM_RESOURCE_GROUP."
|
|
64
|
+
exit 2
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
if [[ -z "$APIM_SERVICE_NAME" || "$APIM_SERVICE_NAME" == '$('*')' ]]; then
|
|
68
|
+
echo "##vso[task.logissue type=error]APIM_SERVICE_NAME is not set. Ensure variable group 'apim-\${{ parameters.ENVIRONMENT }}' is authorized and defines APIM_SERVICE_NAME."
|
|
69
|
+
exit 2
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
if [[ -z "$SERVICE_CONNECTION" || "$SERVICE_CONNECTION" == '$('*')' ]]; then
|
|
73
|
+
echo "##vso[task.logissue type=error]AZURE_SERVICE_CONNECTION is not set. Ensure variable group 'apim-\${{ parameters.ENVIRONMENT }}' is authorized and defines AZURE_SERVICE_CONNECTION."
|
|
74
|
+
exit 2
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
if [[ -z "$SUBSCRIPTION_ID" || "$SUBSCRIPTION_ID" == '$('*')' ]]; then
|
|
78
|
+
echo "##vso[task.logissue type=error]AZURE_SUBSCRIPTION_ID is not set. Ensure variable group 'apim-\${{ parameters.ENVIRONMENT }}' is authorized and defines AZURE_SUBSCRIPTION_ID."
|
|
79
|
+
exit 2
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
echo "All required variables are configured for environment '\${{ parameters.ENVIRONMENT }}'"
|
|
83
|
+
displayName: 'Validate required variables'
|
|
84
|
+
|
|
85
|
+
- task: AzureCLI@2
|
|
86
|
+
displayName: 'Run APIM Extract (All APIs)'
|
|
87
|
+
condition: eq('\${{ parameters.CONFIGURATION_YAML_PATH }}', 'Extract All APIs')
|
|
88
|
+
inputs:
|
|
89
|
+
azureSubscription: '$(AZURE_SERVICE_CONNECTION)'
|
|
90
|
+
scriptType: 'bash'
|
|
91
|
+
scriptLocation: 'inlineScript'
|
|
92
|
+
inlineScript: |
|
|
93
|
+
npx @peterhauge/apiops-cli extract \\
|
|
94
|
+
--resource-group "$(APIM_RESOURCE_GROUP)" \\
|
|
95
|
+
--service-name "$(APIM_SERVICE_NAME)" \\
|
|
96
|
+
--output ${config.artifactDir} \\
|
|
97
|
+
--subscription-id "$(AZURE_SUBSCRIPTION_ID)"
|
|
98
|
+
|
|
99
|
+
- task: AzureCLI@2
|
|
100
|
+
displayName: 'Run APIM Extract (With Configuration)'
|
|
101
|
+
condition: ne('\${{ parameters.CONFIGURATION_YAML_PATH }}', 'Extract All APIs')
|
|
102
|
+
inputs:
|
|
103
|
+
azureSubscription: '$(AZURE_SERVICE_CONNECTION)'
|
|
104
|
+
scriptType: 'bash'
|
|
105
|
+
scriptLocation: 'inlineScript'
|
|
106
|
+
inlineScript: |
|
|
107
|
+
npx @peterhauge/apiops-cli extract \\
|
|
108
|
+
--resource-group "$(APIM_RESOURCE_GROUP)" \\
|
|
109
|
+
--service-name "$(APIM_SERVICE_NAME)" \\
|
|
110
|
+
--output ${config.artifactDir} \\
|
|
111
|
+
--filter configuration.extractor.yaml \\
|
|
112
|
+
--subscription-id "$(AZURE_SUBSCRIPTION_ID)"
|
|
113
|
+
|
|
114
|
+
- task: PublishPipelineArtifact@1
|
|
115
|
+
displayName: 'Publish artifacts'
|
|
116
|
+
inputs:
|
|
117
|
+
targetPath: ${config.artifactDir}
|
|
118
|
+
artifactName: apim-artifacts
|
|
119
|
+
|
|
120
|
+
- bash: |
|
|
121
|
+
BRANCH_NAME="apim-extract-$(Build.BuildId)"
|
|
122
|
+
TARGET_BRANCH="$(Build.SourceBranch)"
|
|
123
|
+
BUILD_ID="$(Build.BuildId)"
|
|
124
|
+
|
|
125
|
+
git config user.name "Azure DevOps"
|
|
126
|
+
git config user.email "azuredevops@microsoft.com"
|
|
127
|
+
git checkout -b "$BRANCH_NAME"
|
|
128
|
+
git add ${config.artifactDir}
|
|
129
|
+
if git diff --cached --quiet; then
|
|
130
|
+
echo "No changes to commit"
|
|
131
|
+
exit 0
|
|
132
|
+
fi
|
|
133
|
+
git commit -m "chore: update APIM artifacts from extract"
|
|
134
|
+
git push origin "$BRANCH_NAME"
|
|
135
|
+
|
|
136
|
+
PR_PAYLOAD=$(printf '{"title":"APIM Extract - Update artifacts","description":"Auto-generated by APIM extract pipeline run %s","sourceRefName":"refs/heads/%s","targetRefName":"%s"}' \\
|
|
137
|
+
"$BUILD_ID" "$BRANCH_NAME" "$TARGET_BRANCH")
|
|
138
|
+
|
|
139
|
+
HTTP_STATUS=$(curl -s -o /tmp/pr_response.json -w "%{http_code}" -X POST \\
|
|
140
|
+
-H "Content-Type: application/json" \\
|
|
141
|
+
-H "Authorization: Bearer $SYSTEM_ACCESSTOKEN" \\
|
|
142
|
+
"$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.Name)/pullrequests?api-version=7.1" \\
|
|
143
|
+
-d "$PR_PAYLOAD")
|
|
144
|
+
|
|
145
|
+
if [ "$HTTP_STATUS" = "201" ]; then
|
|
146
|
+
PR_ID=$(python3 -c "import json; print(json.load(open('/tmp/pr_response.json'))['pullRequestId'])" 2>/dev/null)
|
|
147
|
+
echo "##vso[task.logissue type=warning]Pull request created: $(System.TeamFoundationCollectionUri)$(System.TeamProject)/_git/$(Build.Repository.Name)/pullrequest/$PR_ID"
|
|
148
|
+
else
|
|
149
|
+
echo "##vso[task.logissue type=warning]Could not auto-create PR (HTTP $HTTP_STATUS). Please create a PR from '$BRANCH_NAME' to '$TARGET_BRANCH' manually."
|
|
150
|
+
fi
|
|
151
|
+
displayName: 'Create branch and open pull request'
|
|
152
|
+
env:
|
|
153
|
+
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
|
|
154
154
|
`;
|
|
155
155
|
}
|
|
156
156
|
//# sourceMappingURL=extract-pipeline.js.map
|