diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/prepareArtifactFilesCli.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/prepareArtifactFilesCli.ts index a090aee8a4b..46b4b0a00e6 100644 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/prepareArtifactFilesCli.ts +++ b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/prepareArtifactFilesCli.ts @@ -1,19 +1,35 @@ #!/usr/bin/env node import { + CompletedEvent, GenerateAndBuildOutput, + generateTotalResult, getGenerateAndBuildOutput, + getTaskResults, + InProgressEvent, logger, + PipelineRunEvent, requireJsonc, SDK, - TaskResultStatus + SDKPipelineStatus, + TaskResult, + Trigger } from '@azure-tools/sdk-generation-lib'; import * as fs from 'fs'; import * as path from 'path'; -import { PrepareArtifactFilesInput, prepareArtifactFilesInput } from '../../cliSchema/prepareArtifactFilesCliConfig'; +import { + PrepareArtifactFilesInput, + prepareArtifactFilesInput, + PrepareResultArtifactInput, + prepareResultArtifactInput +} from '../../cliSchema/prepareArtifactFilesCliConfig'; import { GitOperationWrapper } from '../../utils/GitOperationWrapper'; function copyFile(filePath: string, targetDir: string) { + if (!fs.existsSync(filePath)) { + logger.info(`${filePath} isn't exist, skipped it.`); + return; + } const fileDir = path.dirname(filePath); fs.mkdirSync(`${targetDir}/${fileDir}`, { recursive: true }); fs.copyFileSync(`${filePath}`, `${targetDir}/${filePath}`); @@ -24,13 +40,7 @@ async function prepareSourceCode( language: string, artifactDir: string ) { - const gitOperationWrapper: GitOperationWrapper = new GitOperationWrapper(); for (const p of generateAndBuildOutput.packages) { - const result = p.result; - if (result === TaskResultStatus.Failure) { - logger.warn(`Build ${p.packageName} failed, skipped it`); - continue; - } const packageName = p.packageName; const packagePaths = p.path; @@ -41,11 +51,16 @@ async function prepareSourceCode( } if (fs.lstatSync(packagePath).isDirectory()) { + const gitOperationWrapper: GitOperationWrapper = new GitOperationWrapper(packagePath); + for (const filePath of await gitOperationWrapper.getFileListInPackageFolder(packagePath)) { - copyFile(`${path.join(packagePath, filePath)}`, `${artifactDir}/${language}/${packageName}`); + copyFile( + `${path.join(packagePath, filePath)}`, + `${artifactDir}/${language}/sourceCode/${packageName}` + ); } } else { - copyFile(packagePath, `${artifactDir}/${language}/${packageName}`); + copyFile(packagePath, `${artifactDir}/${language}/sourceCode/${packageName}`); } } } @@ -53,28 +68,24 @@ async function prepareSourceCode( async function prepareArtifacts(generateAndBuildOutput: GenerateAndBuildOutput, language: string, artifactDir: string) { for (const p of generateAndBuildOutput.packages) { - const result = p.result; - if (result === TaskResultStatus.Failure) { - logger.warn(`Build ${p.packageName} failed, skipped it`); - continue; - } const artifacts = p.artifacts; if (!artifacts) { // artifacts is optional continue; } + fs.mkdirSync(`${artifactDir}/${language}/artifact`, { recursive: true }); for (const artifact of artifacts) { const artifactName = path.basename(artifact); - fs.mkdirSync(`${artifactDir}/${language}`, { recursive: true }); - fs.copyFileSync(`${artifact}`, `${artifactDir}/${language}/${artifactName}`); + fs.copyFileSync(`${artifact}`, `${artifactDir}/${language}/artifact/${artifactName}`); } } } function validateInput(config: PrepareArtifactFilesInput) { if (!fs.existsSync(config.generateAndBuildOutputFile)) { - throw new Error(`generateAndBuildOutputFile:${config.generateAndBuildOutputFile} isn's exist!`); + logger.error(`generateAndBuildOutputFile:${config.generateAndBuildOutputFile} isn's exist!`); + process.exit(0); } if (!fs.existsSync(config.artifactDir)) { throw new Error(`Invalid artifactDir:${config.artifactDir}!`); @@ -84,7 +95,7 @@ function validateInput(config: PrepareArtifactFilesInput) { } } -async function main() { +async function prepareSourceCodeAndArtifacts() { prepareArtifactFilesInput.validate(); const config: PrepareArtifactFilesInput = prepareArtifactFilesInput.getProperties(); @@ -97,6 +108,96 @@ async function main() { await prepareArtifacts(generateAndBuildOutput, config.language, config.artifactDir); } +function validateResultInput(config: PrepareResultArtifactInput) { + if (!fs.existsSync(config.artifactDir)) { + throw new Error(`Invalid artifactDir:${config.artifactDir}!`); + } +} + +function getTrigger(config: PrepareResultArtifactInput): Trigger { + let trigger: Trigger; + try { + trigger = JSON.parse(config.trigger); + } catch (error) { + logger.error(`Wrong json format:` + config.trigger); + throw new Error(error); + } + + return trigger; +} + +function prepareResult(pipelineStatus: SDKPipelineStatus) { + prepareResultArtifactInput.validate(); + const config: PrepareResultArtifactInput = prepareResultArtifactInput.getProperties(); + + validateResultInput(config); + const trigger: Trigger = getTrigger(config); + let event: PipelineRunEvent = undefined; + + switch (pipelineStatus) { + case 'in_progress': + event = { + status: 'in_progress', + trigger: trigger, + pipelineBuildId: config.pipelineBuildId + } as InProgressEvent; + break; + case 'completed': + if (!config.resultsPath || !config.logPath) { + throw new Error(`Invalid completed event parameter!`); + } + + const taskResults: TaskResult[] = getTaskResults(config.resultsPath); + const taskTotalResult: TaskResult = generateTotalResult(taskResults, config.pipelineBuildId); + event = { + status: 'completed', + trigger: trigger, + pipelineBuildId: config.pipelineBuildId, + logPath: config.logPath, + result: taskTotalResult + } as CompletedEvent; + break; + default: + throw new Error(`Unsupported status: ` + (pipelineStatus as string)); + } + + fs.writeFileSync(config.artifactDir + `/` + pipelineStatus + `/result.json`, JSON.stringify(event, null, 2), { + encoding: 'utf-8' + }); +} + +async function main() { + const args = parseArgs(process.argv); + const pipelineStatus = args['pipelineStatus']; + + if (pipelineStatus === 'completed') { + prepareResult(pipelineStatus); + await prepareSourceCodeAndArtifacts(); + } else if (pipelineStatus === 'in_progress') { + prepareResult(pipelineStatus); + } else { + throw new Error(`Unknown pipelineStatus:${pipelineStatus}!`); + } +} + +/** + * Parse a list of command line arguments. + * @param argv List of cli args(process.argv) + */ +const flagRegex = /^--([^=:]+)([=:](.+))?$/; +export function parseArgs(argv: string[]) { + const result: any = {}; + for (const arg of argv) { + const match = flagRegex.exec(arg); + if (match) { + const key = match[1]; + const rawValue = match[3]; + result[key] = rawValue; + } + } + return result; +} + main().catch((e) => { logger.error(`${e.message} ${e.stack}`); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/publishResultCli.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/publishResultCli.ts index 1e395fe778c..b9583a15788 100644 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/publishResultCli.ts +++ b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cli/pipelineCli/publishResultCli.ts @@ -5,6 +5,7 @@ import { CodeGeneration, CompletedEvent, generateTotalResult, + getTaskResults, InProgressEvent, logger, MongoConnectContext, @@ -123,19 +124,6 @@ function getTrigger(config: ResultPublisherEventHubInput): Trigger { return trigger; } -function getTaskResults(taskResultsPath: string): TaskResult[] { - const taskResultsPathArray = JSON.parse(taskResultsPath); - const taskResults: TaskResult[] = []; - for (const taskResultPath of taskResultsPathArray) { - if (fs.existsSync(taskResultPath)) { - taskResults.push(requireJsonc(taskResultPath)); - } else { - logger.warn(`${taskResultPath} isn't exist, skip.`); - } - } - return taskResults; -} - async function publishEventhub(pipelineStatus: SDKPipelineStatus) { resultPublisherEventHubInput.validate(); const config: ResultPublisherEventHubInput = resultPublisherEventHubInput.getProperties(); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/generateResultCliConfig.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/generateResultCliConfig.ts index adc0303e6b8..6cbb3ff901c 100644 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/generateResultCliConfig.ts +++ b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/generateResultCliConfig.ts @@ -38,7 +38,7 @@ export const generateResultCliInput = convict({ exeResult: { default: null, nullable: true, - format: ['success', 'failure'], + format: ['succeeded', 'failed'], arg: 'exeResult' }, taskOutputPath: { diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/prepareArtifactFilesCliConfig.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/prepareArtifactFilesCliConfig.ts index 8c59b602315..018fc478a0a 100644 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/prepareArtifactFilesCliConfig.ts +++ b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/src/cliSchema/prepareArtifactFilesCliConfig.ts @@ -26,3 +26,43 @@ export const prepareArtifactFilesInput = convict({ arg: 'language' } }); + +export class PrepareResultArtifactInput { + pipelineBuildId: string; + trigger: string; + artifactDir: string; + logPath?: string; + resultsPath?: string; +} + +export const prepareResultArtifactInput = convict({ + pipelineBuildId: { + default: null, + format: assertNullOrEmpty, + arg: 'buildId' + }, + trigger: { + default: null, + format: assertNullOrEmpty, + arg: 'trigger' + }, + artifactDir: { + doc: 'The dir to publish artifact', + default: null, + format: assertNullOrEmpty, + arg: 'artifactDir' + }, + logPath: { + default: null, + nullable: true, + format: String, + arg: 'logPath' + }, + resultsPath: { + doc: 'task result files array', + default: null, + nullable: true, + format: String, + arg: 'resultsPath' + } +}); diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/integration/integrationTest.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/integration/integrationTest.ts index eb84c811556..79cb3e652b1 100644 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/integration/integrationTest.ts +++ b/tools/sdk-generation-pipeline/packages/sdk-generation-cli/test/integration/integrationTest.ts @@ -6,7 +6,7 @@ import * as process from 'process'; const repoCommitId = { 'azure-rest-api-specs': '0baca05c851c1749e92beb0d2134cd958827dd54', - 'azure-sdk-for-js': '67946c5b0ce135f58ecfeab1443e5be52604908e', + 'azure-sdk-for-js': '57382229a700e0e6f607d6ac0811379a6254f3d9', 'azure-sdk-for-java': '307df24267304fbf3947025bef7eaf9698410de8', 'azure-sdk-for-python': '53f66170cc47739204cedfe0a46989290c047c98', 'azure-sdk-for-go': '241bdb849ce431e1a5e398a5649cde93149ee374', @@ -33,20 +33,25 @@ async function prepareRepo(currentPath: string, repoName: string) { stdio: 'inherit' }); - if (!!repoCommitId[repoName] && execSync(`git rev-parse HEAD`, { - encoding: 'utf-8', - cwd: path.join(tmpFolder, repoName) - }).trim() !== repoCommitId[repoName]) { + if ( + !!repoCommitId[repoName] && + execSync(`git rev-parse HEAD`, { + encoding: 'utf-8', + cwd: path.join(tmpFolder, repoName) + }).trim() !== repoCommitId[repoName] + ) { execSync(`git checkout ${repoCommitId[repoName]}`, { cwd: path.join(tmpFolder, repoName), stdio: 'inherit' }); } - if (execSync(`git rev-parse --abbrev-ref HEAD`, { - encoding: 'utf-8', - cwd: path.join(tmpFolder, repoName) - }).trim() !== integrationBranch) { + if ( + execSync(`git rev-parse --abbrev-ref HEAD`, { + encoding: 'utf-8', + cwd: path.join(tmpFolder, repoName) + }).trim() !== integrationBranch + ) { execSync(`git switch -c ${integrationBranch}`, { cwd: path.join(tmpFolder, repoName), stdio: 'inherit' @@ -57,9 +62,15 @@ async function prepareRepo(currentPath: string, repoName: string) { async function runDocker(currentPath: string, sdkRepoName: string, dockerImage: string) { const tmpFolder = path.join(currentPath, 'tmp'); // eslint-disable-next-line max-len - execSync(`docker run -v ${path.join(tmpFolder, 'azure-rest-api-specs')}:/spec-repo -v ${path.join(tmpFolder, sdkRepoName)}:/sdk-repo ${dockerImage} --readme=specification/agrifood/resource-manager/readme.md`, { - stdio: 'inherit' - }); + execSync( + `docker run -v ${path.join(tmpFolder, 'azure-rest-api-specs')}:/spec-repo -v ${path.join( + tmpFolder, + sdkRepoName + )}:/sdk-repo ${dockerImage} --readme=specification/agrifood/resource-manager/readme.md`, + { + stdio: 'inherit' + } + ); } async function buildDockImage(rushCwd: string, dockerCwd: string) { @@ -80,7 +91,9 @@ export async function main(options: any) { options['docker-image'] = defaultImageName; } if (!options['sdk-repo']) { - options['sdk-repo'] = Object.keys(repoCommitId).filter((ele) => ele !== 'azure-rest-api-specs').join(','); + options['sdk-repo'] = Object.keys(repoCommitId) + .filter((ele) => ele !== 'azure-rest-api-specs') + .join(','); } await prepareRepo(currentPath, 'azure-rest-api-specs'); for (const sdkRepo of options['sdk-repo'].split(',')) { diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/generateResult.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/generateResult.ts index 087b8f36f95..6ce10c17beb 100644 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/generateResult.ts +++ b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/lib/generateResult.ts @@ -42,7 +42,8 @@ export function parseGenerateLog( pipelineBuildId: string, taskName: string, logfile: string, - logFilter: LogFilter + logFilter: LogFilter, + taskExeResult: TaskResultStatus ): TaskResultCommon { let errorNum = 0; let warnNum = 0; @@ -86,7 +87,8 @@ export function parseGenerateLog( pipelineBuildId: pipelineBuildId, errorCount: errorNum, warningCount: warnNum, - messages: messages + messages: messages, + result: taskExeResult }; return result; @@ -110,7 +112,7 @@ export function createTaskResult( warningCount: 0 }; } else { - commonResult = parseGenerateLog(pipelineBuildId, taskname, logfile, logFilter); + commonResult = parseGenerateLog(pipelineBuildId, taskname, logfile, logFilter, taskExeResult); } if (taskname === AzureSDKTaskName.MockTest || taskname === AzureSDKTaskName.LiveTest) { if (taskOutput === undefined) { diff --git a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskResult.ts b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskResult.ts index 728babe21a1..26ec9333e2e 100644 --- a/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskResult.ts +++ b/tools/sdk-generation-pipeline/packages/sdk-generation-lib/src/types/taskResult.ts @@ -1,6 +1,8 @@ import * as fs from 'fs'; import { Column, Entity, ObjectIdColumn } from 'typeorm'; +import { logger } from '../utils/logger'; +import { requireJsonc } from '../utils/requireJsonc'; import { getTaskBasicConfig, TaskBasicConfig } from './taskBasicConfig'; import { GenerateAndBuildOutput } from './taskInputAndOuputSchemaTypes/GenerateAndBuildOutput'; import { InitOutput } from './taskInputAndOuputSchemaTypes/InitOutput'; @@ -65,7 +67,7 @@ export type MessageRecord = ResultMessageRecord | RawMessageRecord | MarkdownMes export type TaskResultCommon = { name: string; pipelineBuildId: string; - result?: TaskResultStatus; + result: TaskResultStatus; errorCount?: number; warningCount?: number; logUrl?: string; @@ -144,3 +146,16 @@ export function generateTotalResult(taskResults: TaskResult[], pipelineBuildId: return totalResult; } + +export function getTaskResults(taskResultsPath: string): TaskResult[] { + const taskResultsPathArray = JSON.parse(taskResultsPath); + const taskResults: TaskResult[] = []; + for (const taskResultPath of taskResultsPathArray) { + if (fs.existsSync(taskResultPath)) { + taskResults.push(requireJsonc(taskResultPath)); + } else { + logger.warn(`${taskResultPath} isn't exist, skip.`); + } + } + return taskResults; +} diff --git a/tools/sdk-generation-pipeline/pipelines/steps/after-task.yml b/tools/sdk-generation-pipeline/pipelines/steps/after-task.yml deleted file mode 100644 index 670a6aed7e1..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/after-task.yml +++ /dev/null @@ -1,50 +0,0 @@ -parameters: - - name: sdkGenerationName - type: string - - - name: taskName - type: string - values: - - init - - generateAndBuild - - mockTest - - liveTest - - - name: displayTaskName - type: string - values: - - Init - - Generate - - Mock Test - - Live Test - -steps: - - bash: | - if [[ $PRE_TASK_RESULT == "failure" ]]; then - echo '##vso[task.setVariable variable=PreTaskResult]failure' - fi - if [[ -z "${TASK_NAME}" ]]; then - echo "Cannot Find TASK_NAME, exit" - exit 0 - fi - publishLog - retVal=$? - if [ $retVal -ne 0 ]; then - echo -e "\033[0;31mPublish Log failed" - curl --cert /tmp/sdk-generation.pem -X PATCH -H "Content-Type: application/json" https://$(CodegenApp_Server)/codegenerations/${SDK_GENERATION_NAME} -d '{"updateParameters": {"status": "completed"}}' - echo '##vso[task.setVariable variable=PreTaskResult]failure' - exit 1 - fi - - workingDirectory: $(SDK_REPO) - displayName: Publish ${{ parameters.displayTaskName }} Log - condition: and(contains(variables['TasksToRun'], '${{ parameters.taskName }}'), ne(variables['PreTaskResult'], 'failure')) - env: - TASK_NAME: ${{ parameters.taskName }} - AZURE_STORAGE_BLOB_SAS_URL: $(AZURE_STORAGE_BLOB_SAS_URL) - AZURE_BLOB_CONTAINER_NAME: logs - SDK_GENERATION_NAME: ${{ parameters.sdkGenerationName }} - BUILD_ID: $(Build.BuildId) - SDK_GENERATION_SERVICE_HOST: $(CodegenApp_Server) - PIPE_FULL_LOG: "/tmp/pipe.full.log" - PRE_TASK_RESULT: $(StepResult) diff --git a/tools/sdk-generation-pipeline/pipelines/steps/environment-setup.yml b/tools/sdk-generation-pipeline/pipelines/steps/environment-setup.yml deleted file mode 100644 index a21e5e012e4..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/environment-setup.yml +++ /dev/null @@ -1,54 +0,0 @@ -parameters: - - name: sdk - type: string - - - name: specRepoUrl - type: string - - - name: specRepoBaseBranch - type: string - - - name: sdkRepoUrl - type: string - - - name: sdkRepoBaseBranch - type: string - -steps: - - task: NodeTool@0 - displayName: Specify Node Version - inputs: - versionSpec: 14.x - - - task: AzureKeyVault@2 - displayName: Get Certificate from KeyVault - inputs: - azureSubscription: 'Azure Key Vault' - KeyVaultName: $(KeyVault) - SecretsFilter: 'sdk-generation' - RunAsPreJob: true - - - bash: | - echo "$(sdk-generation)" > sdk-generation.pem - openssl rsa -in sdk-generation.pem -out private.key - displayName: Store Cert and Get Private Key - workingDirectory: /tmp - - - bash: | - npm install -g @microsoft/rush - rush update - rush build - cd tools/sdk-generation-cli - rushx pack - PACKAGE_TGZ=`ls sdk-generation-cli-*.tgz` - npm install -g ${PACKAGE_TGZ} - npm install -g autorest - displayName: Setup Pipeline Runtime Environment - - - bash: | - git clone --branch ${{ parameters.specRepoBaseBranch }} ${{ parameters.specRepoUrl }} - git clone --branch ${{ parameters.sdkRepoBaseBranch }} ${{ parameters.sdkRepoUrl }} - getRepoName SPEC_REPO ${{ parameters.specRepoUrl }} - getRepoName SDK_REPO ${{ parameters.sdkRepoUrl }} - displayName: Clone Spec Repo and Sdk Repo - workingDirectory: ../ diff --git a/tools/sdk-generation-pipeline/pipelines/steps/generate-and-build-task.yml b/tools/sdk-generation-pipeline/pipelines/steps/generate-and-build-task.yml deleted file mode 100644 index 5f20b2eb1d6..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/generate-and-build-task.yml +++ /dev/null @@ -1,47 +0,0 @@ -parameters: - - name: sdkGenerationName - type: string - - - name: sdk - type: string - - - name: serviceType - type: string - - - name: resourceProvider - type: string - - - name: readmeFile - type: string - - - name: sdkRepoUrl - type: string - - - name: sdkRepoBaseBranch - type: string - -steps: - - bash: | - headSha=`git rev-parse HEAD` - export HEAD_SHA=${headSha} - runGenerateAndBuildTask - retVal=$? - if [ $retVal -ne 0 ]; then - echo -e "\033[0;31mGenerateAndBuild Task is failed" - exit 1 - fi - workingDirectory: $(SDK_REPO) - condition: and(contains(variables['TasksToRun'], 'generateAndBuild'), ne(variables['PreTaskResult'], 'failure')) - displayName: Generate - env: - TASKS_TO_RUN: $(TasksToRun) - SDK_REPO: $(SDK_REPO) - SPEC_FOLDER: $(SPEC_REPO) - RELATED_README_MD_FILE: ${{ parameters.readmeFile }} - LANGUAGE: ${{ parameters.sdk }} - RESOURCE_PROVIDER: ${{ parameters.resourceProvider }} - AZURE_STORAGE_BLOB_SAS_URL: $(AZURE_STORAGE_BLOB_SAS_URL) - SDK_GENERATION_NAME: ${{ parameters.sdkGenerationName }} - SERVICE_TYPE: ${{ parameters.serviceType }} - HEAD_REF: ${{ parameters.sdkRepoBaseBranch }} - REPO_HTTP_URL: ${{ parameters.sdkRepoUrl }} diff --git a/tools/sdk-generation-pipeline/pipelines/steps/generate-sdk.yml b/tools/sdk-generation-pipeline/pipelines/steps/generate-sdk.yml new file mode 100644 index 00000000000..4727461aae4 --- /dev/null +++ b/tools/sdk-generation-pipeline/pipelines/steps/generate-sdk.yml @@ -0,0 +1,102 @@ +parameters: + - name: readmeFile + type: string + + - name: trigger + type: string + + - name: triggerType + type: string + + - name: serviceType + type: string + + - name: sdk + type: string + + - name: sdkConfig + type: string + +steps: + - bash: | + publishResult \ + --storageType=eventhub \ + --pipelineStatus=in_progress \ + --buildId="$(Build.BuildId)" \ + --trigger='${{ parameters.trigger }}' + if [ $? -ne 0 ]; then + exit 1 + fi + displayName: Publish status + env: + EVENTHUB_SAS_URL: $(EVENTHUB_SAS_URL) + condition: ne('${{ parameters.triggerType }}', 'release') + + - bash: | + if [ "${{ parameters.serviceType }}" = "resource-manager" ];then + docker run --privileged \ + -v $(SPEC_REPO):/spec-repo \ + -v $(SDK_REPO):/sdk-repo \ + -v /tmp/output:/tmp/output \ + $(DOCKER_IMAGE) \ + --readme=${{ parameters.readmeFile }} $(DOCKER_EX_CMD) + else + echo '${{ parameters.sdkConfig }}' > /tmp/output/autorest.md + configLen=`cat /tmp/output/autorest.md | wc -L` + echo "configLen is :${configLen}" + #check if config is default '' + if [ 2 -ge ${configLen} ];then + docker run --privileged \ + -v $(SPEC_REPO):/spec-repo \ + -v $(SDK_REPO):/sdk-repo \ + -v /tmp/output:/tmp/output \ + $(DOCKER_IMAGE) \ + --readme=${{ parameters.readmeFile }} $(DOCKER_EX_CMD) + else + docker run --privileged \ + -v $(SPEC_REPO):/spec-repo \ + -v $(SDK_REPO):/sdk-repo \ + -v /tmp/output/autorest.md:/autorest.md \ + -v /tmp/output:/tmp/output \ + $(DOCKER_IMAGE) \ + --readme=${{ parameters.readmeFile }} $(DOCKER_EX_CMD) + fi + fi + displayName: Generate sdk + + - bash: | + echo "check output dir" + ls /tmp/output + echo "show docker.log" + head -n 30 /tmp/output/docker.log + echo "*****" + tail -n 30 /tmp/output/docker.log + echo "show generateAndBuild-task.log" + head -n 30 /tmp/output/generateAndBuild-task.log + echo "*****" + tail -n 30 /tmp/output/generateAndBuild-task.log + echo "show generateAndBuildInput.json" + cat /tmp/output/generateAndBuildInput.json + echo "show generateAndBuildOutputJson.json" + cat /tmp/output/generateAndBuildOutputJson.json + echo "show init-task.log" + head -n 30 /tmp/output/init-task.log + echo "*****" + tail -n 30 /tmp/output/init-task.log + echo "show taskResults.json" + cat /tmp/output/taskResults.json + + echo "show mock-host.log" + head -n 30 /tmp/output/mock-host.log | echo "don't quite even failed" + echo "*****" + tail -n 30 /tmp/output/mock-host.log | echo "don't quite even failed" + + echo "show mockTest-task.log" + head -n 30 /tmp/output/mockTest-task.log | echo "don't quite even failed" + echo "*****" + tail -n 30 /tmp/output/mockTest-task.log | echo "don't quite even failed" + + echo "show mockTestOutput.json" + cat /tmp/output/mockTestOutput.json | echo "don't quite even failed" + displayName: Check output dir + condition: ne('$(DEBUGMODE)', 'true') \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/pipelines/steps/init-task.yml b/tools/sdk-generation-pipeline/pipelines/steps/init-task.yml deleted file mode 100644 index 0269c38e4c6..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/init-task.yml +++ /dev/null @@ -1,14 +0,0 @@ -steps: - - bash: | - runInitTask - retVal=$? - if [ $retVal -ne 0 ]; then - echo -e "\033[0;31mInit Task is failed" - exit 1 - fi - displayName: Init - condition: contains(variables['TasksToRun'], 'init') - workingDirectory: $(SDK_REPO) - env: - SDK_REPO: $(SDK_REPO) - TASKS_TO_RUN: $(TasksToRun) diff --git a/tools/sdk-generation-pipeline/pipelines/steps/live-test-task.yml b/tools/sdk-generation-pipeline/pipelines/steps/live-test-task.yml deleted file mode 100644 index bbf93bdd37f..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/live-test-task.yml +++ /dev/null @@ -1,15 +0,0 @@ -steps: - - bash: | - runLiveTestTask - retVal=$? - if [ $retVal -ne 0 ]; then - echo -e "\033[0;31mLiveTest Task is failed" - exit 1 - fi - displayName: Live Test - condition: and(contains(variables['TasksToRun'], 'liveTest'), ne(variables['PreTaskResult'], 'failure')) - workingDirectory: $(SDK_REPO) - env: - SDK_REPO: $(SDK_REPO) - PACKAGE_FOLDERS: $(PackageFolders) - TASKS_TO_RUN: $(TasksToRun) diff --git a/tools/sdk-generation-pipeline/pipelines/steps/mock-test-task.yml b/tools/sdk-generation-pipeline/pipelines/steps/mock-test-task.yml deleted file mode 100644 index 1c7e19a1eb3..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/mock-test-task.yml +++ /dev/null @@ -1,17 +0,0 @@ -steps: - - bash: | - # start mock server - # TODO - runMockTestTask - retVal=$? - if [ $retVal -ne 0 ]; then - echo -e "\033[0;31mMockTest Task is failed" - exit 1 - fi - displayName: Mock Test - condition: and(contains(variables['TasksToRun'], 'mockTest'), ne(variables['PreTaskResult'], 'failure')) - workingDirectory: $(SDK_REPO) - env: - SDK_REPO: $(SDK_REPO) - PACKAGE_FOLDERS: $(PackageFolders) - TASKS_TO_RUN: $(TasksToRun) diff --git a/tools/sdk-generation-pipeline/pipelines/steps/parse-and-publish-result.yml b/tools/sdk-generation-pipeline/pipelines/steps/parse-and-publish-result.yml new file mode 100644 index 00000000000..9a01e0217c8 --- /dev/null +++ b/tools/sdk-generation-pipeline/pipelines/steps/parse-and-publish-result.yml @@ -0,0 +1,189 @@ +parameters: + - name: sdk + type: string + + - name: service + type: string + + - name: serviceType + type: string + + - name: trigger + type: string + + - name: sdkGenerationName + type: string + + - name: triggerType + type: string + +steps: + - bash: | + echo "will parse task result" + LOG_Dir="/tmp/output/" + for TASK_NAME in "init" "generateAndBuild" "mockTest" + do + if [ ${TASK_NAME} = "mockTest" ]; then + TASK_OUTPUT_PATH="/tmp/output/mockTestOutput.json" + else + TASK_OUTPUT_PATH="" + fi + + generateResult \ + --buildId=$(Build.BuildId) \ + --taskName=${TASK_NAME} \ + --logfile="/tmp/output/${TASK_NAME}-task.log" \ + --resultOutputPath="/tmp/output/${TASK_NAME}-task-result.json" \ + --dockerResultFile="/tmp/output/taskResults.json" \ + --taskOutputPath="${TASK_OUTPUT_PATH}" + if [ $? -ne 0 ]; then + #TODO: when all language support mock test, set exit 1 for parse task result failed + echo "wait all language support mock test" + #exit 1 + fi + done + displayName: Parse task result + condition: always() + + - bash: | + echo "will create PR" + git config --global user.email "$(GIT_USER_EMAIL)" + git config --global user.name "$(GIT_USER_NAME)" + + #packages=`cat /tmp/output/generateAndBuildOutputJson.json| jq -c '.packages|.[]'` + package=`cat /tmp/output/generateAndBuildOutputJson.json| jq -c '.packages|.[]'` + #for package in ${packages} + #do + packageName=`echo ${package} | jq -r '.packageName'` + paths=`echo ${package} | jq -r '.path|.[]'` + for path in ${paths} + do + git add ${path} + done + git commit -m '[auto]create by sdk generation' + if [ "${{ parameters.serviceType }}" = "resource-manager" ];then + branchName=sdkGen/${{ parameters.sdkGenerationName }}/arm-${{ parameters.service }}-${packageName} + else + branchName=sdkGen/${{ parameters.sdkGenerationName }}/dpg-${{ parameters.service }}-${packageName} + fi + git checkout -b ${branchName} + pushSdkRepoUrl=$(echo $(sdkRepoUrl) | sed "s#https://#https://$(REPO_OWNER):$(azuresdk-github-pat)@#") + pushSdkRepoUrl=$(echo ${pushSdkRepoUrl} | sed "s#$(SDK_OWNER)#$(SDK_PUSH_OWNER)#") + git push ${pushSdkRepoUrl} --force + echo "git push finished:$?" + sdkRepoPullsApi=$(echo $(sdkRepoUrl) | sed "s#https://#https://api.#") + sdkRepoPullsApi=$(echo ${sdkRepoPullsApi} | sed "s#$(SDK_OWNER)#repos/$(SDK_PUSH_OWNER)#") + sdkRepoPullsApi=$(echo ${sdkRepoPullsApi} | sed "s#.git\$#/pulls#") + echo "will use api:${sdkRepoPullsApi}" + RESULT=$(curl \ + -u "$(REPO_OWNER)":"$(azuresdk-github-pat)" \ + -H "Accept: application/vnd.github.v3+json" \ + -X POST \ + -d '{"title":"[AutoPR-${{ parameters.service }}]autogenerated","body":"","base":"'$(sdkMainBranch)'", "head":"$(SDK_PUSH_OWNER):'${branchName}'"}' \ + ${sdkRepoPullsApi}) + echo "creat pr finished:$?" + + prNumber=`echo ${RESULT} | jq -r '.number'` + echo "##vso[task.setvariable variable=prNumber;]${prNumber}" + prLink=`echo ${RESULT} | jq -r '.html_url'` + echo "##vso[task.setvariable variable=prLink;]${prLink}" + echo "##vso[task.setvariable variable=branchName;]${branchName}" + echo "##vso[task.setvariable variable=packageName;]${packageName}" + packageFolder=`echo ${package} | jq -r '.packageFolder'` + serviceDir=`echo $packageFolder | awk '{split($0,array,"/");print array[2]}' ` + if [ "${{ parameters.sdk }}" = "js" ] && [ "${{ parameters.serviceType }}" = "resource-manager" ];then + echo "##vso[task.setvariable variable=releasePipeline;]${{ parameters.sdk }} - ${serviceDir} - mgmt" + else + echo "##vso[task.setvariable variable=releasePipeline;]${{ parameters.sdk }} - ${serviceDir}" + fi + + git reset HEAD~ + #done + workingDirectory: $(SDK_REPO) + displayName: Submit Pull Request + + - bash: | + cp /tmp/output/docker.log $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-full.log + cp /tmp/output/init-task.log $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-init.log + cp /tmp/output/init-task-result.json $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-init-result.json + cp /tmp/output/generateAndBuild-task.log $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-generateAndBuild.log + cp /tmp/output/generateAndBuild-task-result.json $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-generateAndBuild-result.json + cp /tmp/output/mockTest-task.log $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-mockTest.log | echo "wait all language support mock test" + cp /tmp/output/mockTest-task-result.json $(System.ArtifactsDirectory)/logs/${{ parameters.sdkGenerationName }}-mockTest-result.json | echo "wait all language support mock test" + prepareArtifactFiles \ + --pipelineStatus=completed \ + --artifactDir="$(System.ArtifactsDirectory)" \ + --buildId="$(Build.BuildId)" \ + --generateAndBuildOutputFile="/tmp/output/generateAndBuildOutputJson.json" \ + --trigger='${{ parameters.trigger }}' \ + --logPath="tmplogpath.com" \ + --language="${{ parameters.sdk }}" \ + --resultsPath='["/tmp/output/init-task-result.json", + "/tmp/output/generateAndBuild-task-result.json", + "/tmp/output/mockTest-task-result.json"]' + + #check parse result and completion status + cat /tmp/output/generateAndBuild-task-result.json + cat $(System.ArtifactsDirectory)/completed/result.json + + if [ -n "$(prLink)" ];then + newtaskresult=$(cat $(System.ArtifactsDirectory)/completed/result.json | \ + jq --arg prNumber "$(prNumber)" --arg prLink "$(prLink)" --arg branchName "$(branchName)" \ + --arg packageName "$(packageName)" --arg serviceType "${{ parameters.serviceType }}" \ + --arg releasePipeline "$(releasePipeline)" \ + '.result += {prNumber:$prNumber, prLink:$prLink, branchName:$branchName, serviceType:$serviceType, releasePipeline:$releasePipeline} | + .package += [{packageName:$packageName}]' ) + echo ${newtaskresult} > $(System.ArtifactsDirectory)/completed/result.json + fi + + #recheck jq result + cat $(System.ArtifactsDirectory)/completed/result.json + displayName: Prepare artifact + workingDirectory: $(SDK_REPO) + condition: always() + + - task: PublishPipelineArtifact@1 + displayName: Publish artifact + inputs: + targetPath: $(System.ArtifactsDirectory)/${{ parameters.sdk }}/artifact/ + artifactName: sdk-generation-artifact + continueOnError: true + + - task: PublishPipelineArtifact@1 + displayName: Publish sourceCode + inputs: + targetPath: $(System.ArtifactsDirectory)/${{ parameters.sdk }}/sourceCode/ + artifactName: sdk-generation-sourceCode + continueOnError: true + + - task: PublishPipelineArtifact@1 + displayName: Publish logs + inputs: + targetPath: $(System.ArtifactsDirectory)/logs/ + artifactName: sdk-generation-logs + condition: always() + + - bash: | + publishResult \ + --storageType=eventhub \ + --pipelineStatus=completed \ + --buildId="$(Build.BuildId)" \ + --trigger='${{ parameters.trigger }}' \ + --logPath="www.demoLogUrl.com" \ + --resultsPath='["/tmp/output/init-task-result.json", + "/tmp/output/generateAndBuild-task-result.json", + "/tmp/output/mockTest-task-result.json"]' + if [ $? -ne 0 ]; then + exit 1 + fi + displayName: Publish status + env: + EVENTHUB_SAS_URL: $(EVENTHUB_SAS_URL) + condition: and(always(), ne('${{ parameters.triggerType }}', 'release')) + + - task: PublishPipelineArtifact@1 + displayName: Publish status artifact + inputs: + targetPath: $(System.ArtifactsDirectory)/completed/ + artifactName: sdk-generation-completed-result + condition: always() \ No newline at end of file diff --git a/tools/sdk-generation-pipeline/pipelines/steps/pipeline-setup.yml b/tools/sdk-generation-pipeline/pipelines/steps/pipeline-setup.yml new file mode 100644 index 00000000000..34f5aab3655 --- /dev/null +++ b/tools/sdk-generation-pipeline/pipelines/steps/pipeline-setup.yml @@ -0,0 +1,92 @@ +parameters: + - name: sdk + type: string + + - name: trigger + type: string + + - name: swagger + type: object + + - name: triggerType + type: string + +steps: + - task: NodeTool@0 + displayName: Specify Node Version + inputs: + versionSpec: 14.x + + - bash: | + #install tools + cd tools/sdk-generation-pipeline + npm install -g @microsoft/rush + rush update + rush build + cd packages/sdk-generation-cli + rushx pack + PACKAGE_TGZ=`ls azure-tools-sdk-generation-cli*.tgz` + npm install -g ${PACKAGE_TGZ} + npm install -g autorest + + #mkdir for artifacts + cd $(System.ArtifactsDirectory) + echo "mkdir for docker output" + mkdir -p /tmp/output + echo "mkdir for pipeline artifact" + mkdir -p logs + cd $(Agent.BuildDirectory) + getRepoName SPEC_REPO ${{ parameters.swagger.path }} + getRepoName SDK_REPO $(sdkRepoUrl) + #mkdir for result artifact + mkdir -p $(System.ArtifactsDirectory)/in_progress/ + mkdir -p $(System.ArtifactsDirectory)/completed/ + displayName: Setup Pipeline Runtime Environment + + - bash: | + publishResult \ + --storageType=eventhub \ + --pipelineStatus=queued \ + --buildId="$(Build.BuildId)" \ + --trigger='${{ parameters.trigger }}' + if [ $? -ne 0 ]; then + exit 1 + fi + displayName: Publish status + env: + EVENTHUB_SAS_URL: $(EVENTHUB_SAS_URL) + condition: ne('${{ parameters.triggerType }}', 'release') + + - bash: | + prepareArtifactFiles \ + --pipelineStatus=in_progress \ + --artifactDir="$(System.ArtifactsDirectory)" \ + --buildId="$(Build.BuildId)" \ + --trigger='${{ parameters.trigger }}' + displayName: Prepare in progress status + condition: always() + + - task: PublishPipelineArtifact@1 + displayName: Publish status artifact + inputs: + targetPath: $(System.ArtifactsDirectory)/in_progress/ + artifactName: sdk-generation-in_progress-result + continueOnError: true + + - bash: | + git clone ${{ parameters.swagger.path }} + downloadSdkRepoUrl=$(echo $(sdkRepoUrl) | sed "s#https://#https://$(REPO_OWNER):$(azuresdk-github-pat)@#") + git clone --branch $(sdkMainBranch) ${downloadSdkRepoUrl} + cd $(SPEC_REPO) + export GITHUB_TOKEN=$(azuresdk-github-pat) + if [ -n "${{ parameters.swagger.branch }}" ];then + git checkout ${{ parameters.swagger.branch }} + elif [ -n "${{ parameters.swagger.pullRequest }}" ];then + gh pr checkout ${{ parameters.swagger.pullRequest }} + else + echo "invalid swagger parameters" + exit 1 + fi + + displayName: Repo pull + workingDirectory: ../ diff --git a/tools/sdk-generation-pipeline/pipelines/steps/precheck.yml b/tools/sdk-generation-pipeline/pipelines/steps/precheck.yml new file mode 100644 index 00000000000..8f932cc9de2 --- /dev/null +++ b/tools/sdk-generation-pipeline/pipelines/steps/precheck.yml @@ -0,0 +1,30 @@ +parameters: + - name: swagger + type: object + + - name: sdk + type: string + values: + - js + - java + - go + - net + - python + + - name: service + type: string + + - name: sdkRepoBaseBranch + type: string +steps: + - bash: | + if [ -z ${{ parameters.swagger.path }} ];then + echo "swagger.path is empty" + exit 1 + fi + displayName: Check parameters + + - bash: | + echo "##vso[task.setvariable variable=sdkRepoUrl;]https://github.com/$(SDK_OWNER)/azure-sdk-for-${{parameters.sdk}}.git" + echo "##vso[task.setvariable variable=sdkMainBranch;]$(sdkRepoBaseBranch)" + displayName: Set sdk repo diff --git a/tools/sdk-generation-pipeline/pipelines/steps/sdk-generation-tasks.yml b/tools/sdk-generation-pipeline/pipelines/steps/sdk-generation-tasks.yml deleted file mode 100644 index 4e995cc5771..00000000000 --- a/tools/sdk-generation-pipeline/pipelines/steps/sdk-generation-tasks.yml +++ /dev/null @@ -1,94 +0,0 @@ -parameters: - - name: sdkGenerationName - type: string - - - name: sdk - type: string - - - name: serviceType - type: string - - - name: resourceProvider - type: string - - - name: readmeFile - type: string - - - name: triggerType - type: string - - - name: specRepoType - type: string - - - name: specRepoUrl - type: string - - - name: specRepoBaseBranch - type: string - - - name: sdkRepoType - type: string - - - name: sdkRepoUrl - type: string - - - name: sdkRepoBaseBranch - type: string - - - name: skippedTask - type: string - -steps: - - bash: | - getTasksToRun - retVal=$? - if [ $retVal -ne 0 ]; then - echo -e "\033[0;31mGet tasks to run failed" - exit 1 - fi - displayName: Retrieve Tasks - name: retrieveTasks - workingDirectory: $(SDK_REPO) - env: - SDK_REPO: $(SDK_REPO) - SKIPPED_STEPS: ${{ parameters.skippedTask }} - - - template: init-task.yml - - - template: after-task.yml - parameters: - sdkGenerationName: ${{ parameters.sdkGenerationName }} - taskName: init - displayTaskName: Init - - - template: generate-and-build-task.yml - parameters: - readmeFile: ${{ parameters.readmeFile }} - sdk: ${{ parameters.sdk }} - resourceProvider: ${{ parameters.resourceProvider }} - sdkGenerationName: ${{ parameters.sdkGenerationName }} - serviceType: ${{ parameters.serviceType }} - sdkRepoBaseBranch: ${{ parameters.sdkRepoBaseBranch }} - sdkRepoUrl: ${{ parameters.sdkRepoUrl }} - - - template: after-task.yml - parameters: - sdkGenerationName: ${{ parameters.sdkGenerationName }} - taskName: generateAndBuild - displayTaskName: Generate - - - template: mock-test-task.yml - - - template: after-task.yml - parameters: - sdkGenerationName: ${{ parameters.sdkGenerationName }} - taskName: mockTest - displayTaskName: Mock Test - - - template: live-test-task.yml - - - template: after-task.yml - parameters: - sdkGenerationName: ${{ parameters.sdkGenerationName }} - taskName: liveTest - displayTaskName: Live Test diff --git a/tools/sdk-generation-pipeline/sdk-generation-pipeline.yml b/tools/sdk-generation-pipeline/sdk-generation-pipeline.yml index 4201e81eeab..67d1ffa8842 100644 --- a/tools/sdk-generation-pipeline/sdk-generation-pipeline.yml +++ b/tools/sdk-generation-pipeline/sdk-generation-pipeline.yml @@ -1,10 +1,19 @@ trigger: none -parameters: - - name: sdkGenerationName - type: string +variables: + - template: ../../eng/pipelines/templates/variables/globals.yml - - name: sdk + - name: codegenRepo + value: https://github.com/Azure/azure-sdk-tools.git + + - name: sdkRepoBaseBranch + value: main + + - name: sdkRepoType + value: github + +parameters: + - name: sdkToGernerate type: string values: - js @@ -13,19 +22,15 @@ parameters: - net - python - - name: resourceProvider + - name: service type: string - - name: readmeFile + - name: relativeReadmeFilePath type: string - - name: triggerType + - name: tag type: string - default: ad-hoc - values: - - ad-hoc - - ci - - release + default: "''" - name: serviceType type: string @@ -33,72 +38,67 @@ parameters: - resource-manager - data-plane - - name: specRepoType - type: string - default: github - values: - - github - - devops - - - name: specRepoUrl + - name: swagger + type: object + default: + "type": "github" + "path": "https://github.com/azure/azure-rest-api-specs" + "baseBranch": "main" + "branch": "main" + "commit": "" + "pullRequest": "" + + - name: clientAgent type: string - - name: specRepoBaseBranch + - name: sdkGenerationName type: string - - name: sdkRepoType + - name: triggerType type: string - default: github values: - - github - - devops - - - name: sdkRepoUrl - type: string - - - name: sdkRepoBaseBranch - type: string + - release + - ad-hoc + - ci - - name: skippedTask + - name: sdkConfig type: string + default: "''" stages: - stage: SdkGeneration jobs: - job: SdkGeneration - displayName: ${{ parameters.sdkGenerationName }}-${{ parameters.sdk }}-${{ parameters.serviceType }}-${{ parameters.resourceProvider }} + displayName: ${{ parameters.sdkToGernerate }}-${{ parameters.serviceType }}-${{ parameters.service }} steps: - - bash: | - curl -X PATCH -H "Content-Type: application/json" https://$(CodegenApp_Server)/codegenerations/${SDK_GENERATION_NAME} -d '{"updateParameters": {"status": "in_progress","lastPipelineBuildID": "$(Build.BuildId)"}}' - displayName: Notify Sdk Generation Server to Start - env: - SDK_GENERATION_NAME: ${{ parameters.sdkGenerationName }} + - template: ./pipelines/steps/precheck.yml + parameters: + swagger: ${{ parameters.swagger }} + sdk: ${{ parameters.sdkToGernerate }} + service: ${{ parameters.service }} + sdkRepoBaseBranch: ${{ variables.sdkRepoBaseBranch }} - - template: ./pipelines/steps/environment-setup.yml + - template: ./pipelines/steps/pipeline-setup.yml parameters: - sdk: ${{ parameters.sdk }} - specRepoUrl: ${{ parameters.specRepoUrl }} - specRepoBaseBranch: ${{ parameters.specRepoBaseBranch }} - sdkRepoUrl: ${{ parameters.sdkRepoUrl }} - sdkRepoBaseBranch: ${{ parameters.sdkRepoBaseBranch }} + sdk: ${{ parameters.sdkToGernerate }} + trigger: ${{ parameters.clientAgent }} + swagger: ${{ parameters.swagger }} + triggerType: ${{ parameters.triggerType }} - - template: ./pipelines/steps/sdk-generation-tasks.yml + - template: ./pipelines/steps/generate-sdk.yml parameters: - sdkGenerationName: ${{ parameters.sdkGenerationName }} - sdk: ${{ parameters.sdk }} - resourceProvider: ${{ parameters.resourceProvider }} - readmeFile: ${{ parameters.readmeFile }} + readmeFile: ${{ parameters.relativeReadmeFilePath }} + trigger: ${{ parameters.clientAgent }} triggerType: ${{ parameters.triggerType }} - specRepoType: ${{ parameters.specRepoType }} - specRepoUrl: ${{ parameters.specRepoUrl }} - specRepoBaseBranch: ${{ parameters.specRepoBaseBranch }} - sdkRepoType: ${{ parameters.sdkRepoType }} - sdkRepoUrl: ${{ parameters.sdkRepoUrl }} - sdkRepoBaseBranch: ${{ parameters.sdkRepoBaseBranch }} - skippedTask: ${{ parameters.skippedTask }} serviceType: ${{ parameters.serviceType }} - - bash: | - curl -X PATCH -H "Content-Type: application/json" https://$(CodegenApp_Server)/codegenerations/${SDK_GENERATION_NAME} -d '{"updateParameters": {"status": "completed"}}' - displayName: Set Complete - env: - SDK_GENERATION_NAME: ${{ parameters.sdkGenerationName }} + sdk: ${{ parameters.sdkToGernerate }} + sdkConfig: ${{ parameters.sdkConfig }} + + - template: ./pipelines/steps/parse-and-publish-result.yml + parameters: + sdk: ${{ parameters.sdkToGernerate }} + service: ${{ parameters.service }} + serviceType: ${{ parameters.serviceType }} + trigger: ${{ parameters.clientAgent }} + sdkGenerationName: ${{ parameters.sdkGenerationName }} + triggerType: ${{ parameters.triggerType }}