From c2be99307672eccf37fad72f572e052963a6cc04 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Tue, 23 Aug 2022 09:15:23 -0700 Subject: [PATCH 01/69] Move azdo assets into bootstrap directory --- .../bootstrap/code}/Bootcamp.sln | 112 +++++++++--------- .../bootstrap/code}/src/Attendee/Attendee.cs | 30 ++--- .../code}/src/Attendee/Attendee.csproj | 14 +-- .../code}/test/AttendeeTest/AttendeeExists.cs | 36 +++--- .../test/AttendeeTest/AttendeeTest.csproj | 52 ++++---- .../pipelines/classic/valet-classic1.json | 0 .../pipelines/classic/valet-classic2.json | 0 .../{ => bootstrap}/pipelines/readme.md | 0 .../pipelines/yml/valet-mapper-example.yml | 0 .../pipelines/yml/valet-pipeline1.yml | 0 .../pipelines/yml/valet-pipeline2.yml | 0 code/readme.md | 5 - valet/.env.local.template | 7 -- 13 files changed, 122 insertions(+), 134 deletions(-) rename {code => azure_devops/bootstrap/code}/Bootcamp.sln (98%) rename {code => azure_devops/bootstrap/code}/src/Attendee/Attendee.cs (94%) rename {code => azure_devops/bootstrap/code}/src/Attendee/Attendee.csproj (94%) rename {code => azure_devops/bootstrap/code}/test/AttendeeTest/AttendeeExists.cs (95%) rename {code => azure_devops/bootstrap/code}/test/AttendeeTest/AttendeeTest.csproj (97%) rename azure_devops/{ => bootstrap}/pipelines/classic/valet-classic1.json (100%) rename azure_devops/{ => bootstrap}/pipelines/classic/valet-classic2.json (100%) rename azure_devops/{ => bootstrap}/pipelines/readme.md (100%) rename azure_devops/{ => bootstrap}/pipelines/yml/valet-mapper-example.yml (100%) rename azure_devops/{ => bootstrap}/pipelines/yml/valet-pipeline1.yml (100%) rename azure_devops/{ => bootstrap}/pipelines/yml/valet-pipeline2.yml (100%) delete mode 100644 code/readme.md delete mode 100644 valet/.env.local.template diff --git a/code/Bootcamp.sln b/azure_devops/bootstrap/code/Bootcamp.sln similarity index 98% rename from code/Bootcamp.sln rename to azure_devops/bootstrap/code/Bootcamp.sln index 099b74f..005c7db 100644 --- a/code/Bootcamp.sln +++ b/azure_devops/bootstrap/code/Bootcamp.sln @@ -1,56 +1,56 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30114.105 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B26D43AA-4A35-4035-9E99-48EF9A3E64DD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Attendee", "src\Attendee\Attendee.csproj", "{2804EC63-670C-4970-85E4-2A63C9327FF8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{348A52EC-7046-4D1A-88DB-55B025C2BB68}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AttendeeTest", "test\AttendeeTest\AttendeeTest.csproj", "{DED76823-F195-46D4-8509-5692E3431D53}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|x64.ActiveCfg = Debug|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|x64.Build.0 = Debug|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|x86.ActiveCfg = Debug|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|x86.Build.0 = Debug|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|Any CPU.Build.0 = Release|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|x64.ActiveCfg = Release|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|x64.Build.0 = Release|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|x86.ActiveCfg = Release|Any CPU - {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|x86.Build.0 = Release|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Debug|x64.ActiveCfg = Debug|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Debug|x64.Build.0 = Debug|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Debug|x86.ActiveCfg = Debug|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Debug|x86.Build.0 = Debug|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Release|Any CPU.Build.0 = Release|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Release|x64.ActiveCfg = Release|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Release|x64.Build.0 = Release|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Release|x86.ActiveCfg = Release|Any CPU - {DED76823-F195-46D4-8509-5692E3431D53}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {2804EC63-670C-4970-85E4-2A63C9327FF8} = {B26D43AA-4A35-4035-9E99-48EF9A3E64DD} - {DED76823-F195-46D4-8509-5692E3431D53} = {348A52EC-7046-4D1A-88DB-55B025C2BB68} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30114.105 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B26D43AA-4A35-4035-9E99-48EF9A3E64DD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Attendee", "src\Attendee\Attendee.csproj", "{2804EC63-670C-4970-85E4-2A63C9327FF8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{348A52EC-7046-4D1A-88DB-55B025C2BB68}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AttendeeTest", "test\AttendeeTest\AttendeeTest.csproj", "{DED76823-F195-46D4-8509-5692E3431D53}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|x64.ActiveCfg = Debug|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|x64.Build.0 = Debug|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|x86.ActiveCfg = Debug|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Debug|x86.Build.0 = Debug|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|Any CPU.Build.0 = Release|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|x64.ActiveCfg = Release|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|x64.Build.0 = Release|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|x86.ActiveCfg = Release|Any CPU + {2804EC63-670C-4970-85E4-2A63C9327FF8}.Release|x86.Build.0 = Release|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Debug|x64.ActiveCfg = Debug|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Debug|x64.Build.0 = Debug|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Debug|x86.ActiveCfg = Debug|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Debug|x86.Build.0 = Debug|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Release|Any CPU.Build.0 = Release|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Release|x64.ActiveCfg = Release|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Release|x64.Build.0 = Release|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Release|x86.ActiveCfg = Release|Any CPU + {DED76823-F195-46D4-8509-5692E3431D53}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {2804EC63-670C-4970-85E4-2A63C9327FF8} = {B26D43AA-4A35-4035-9E99-48EF9A3E64DD} + {DED76823-F195-46D4-8509-5692E3431D53} = {348A52EC-7046-4D1A-88DB-55B025C2BB68} + EndGlobalSection +EndGlobal diff --git a/code/src/Attendee/Attendee.cs b/azure_devops/bootstrap/code/src/Attendee/Attendee.cs similarity index 94% rename from code/src/Attendee/Attendee.cs rename to azure_devops/bootstrap/code/src/Attendee/Attendee.cs index 37e4c52..5fd4008 100644 --- a/code/src/Attendee/Attendee.cs +++ b/azure_devops/bootstrap/code/src/Attendee/Attendee.cs @@ -1,15 +1,15 @@ -using System; - -namespace Attendees -{ - public class Attendee - { - public bool AddAttendee(string added) - { - if (added == "exists") - return true; - - return false; - } - } -} +using System; + +namespace Attendees +{ + public class Attendee + { + public bool AddAttendee(string added) + { + if (added == "exists") + return true; + + return false; + } + } +} diff --git a/code/src/Attendee/Attendee.csproj b/azure_devops/bootstrap/code/src/Attendee/Attendee.csproj similarity index 94% rename from code/src/Attendee/Attendee.csproj rename to azure_devops/bootstrap/code/src/Attendee/Attendee.csproj index 563e6f9..f208d30 100644 --- a/code/src/Attendee/Attendee.csproj +++ b/azure_devops/bootstrap/code/src/Attendee/Attendee.csproj @@ -1,7 +1,7 @@ - - - - net5.0 - - - + + + + net5.0 + + + diff --git a/code/test/AttendeeTest/AttendeeExists.cs b/azure_devops/bootstrap/code/test/AttendeeTest/AttendeeExists.cs similarity index 95% rename from code/test/AttendeeTest/AttendeeExists.cs rename to azure_devops/bootstrap/code/test/AttendeeTest/AttendeeExists.cs index 70e3b6d..12134ca 100644 --- a/code/test/AttendeeTest/AttendeeExists.cs +++ b/azure_devops/bootstrap/code/test/AttendeeTest/AttendeeExists.cs @@ -1,18 +1,18 @@ -using System; -using Xunit; -using Xunit.Extensions; -using Attendees; - -namespace AttendeeTest -{ - public class AttendeeTest - { - [Fact] - public void AttendeeExistsReturnTrue() - { - Attendee attendee = new Attendee(); - bool doesExist = attendee.AddAttendee("doesnotexist"); - Assert.False(doesExist, "The attendee does not exist"); - } - } -} +using System; +using Xunit; +using Xunit.Extensions; +using Attendees; + +namespace AttendeeTest +{ + public class AttendeeTest + { + [Fact] + public void AttendeeExistsReturnTrue() + { + Attendee attendee = new Attendee(); + bool doesExist = attendee.AddAttendee("doesnotexist"); + Assert.False(doesExist, "The attendee does not exist"); + } + } +} diff --git a/code/test/AttendeeTest/AttendeeTest.csproj b/azure_devops/bootstrap/code/test/AttendeeTest/AttendeeTest.csproj similarity index 97% rename from code/test/AttendeeTest/AttendeeTest.csproj rename to azure_devops/bootstrap/code/test/AttendeeTest/AttendeeTest.csproj index 8b41439..8f533dd 100644 --- a/code/test/AttendeeTest/AttendeeTest.csproj +++ b/azure_devops/bootstrap/code/test/AttendeeTest/AttendeeTest.csproj @@ -1,26 +1,26 @@ - - - - net5.0 - - false - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - + + + + net5.0 + + false + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/azure_devops/pipelines/classic/valet-classic1.json b/azure_devops/bootstrap/pipelines/classic/valet-classic1.json similarity index 100% rename from azure_devops/pipelines/classic/valet-classic1.json rename to azure_devops/bootstrap/pipelines/classic/valet-classic1.json diff --git a/azure_devops/pipelines/classic/valet-classic2.json b/azure_devops/bootstrap/pipelines/classic/valet-classic2.json similarity index 100% rename from azure_devops/pipelines/classic/valet-classic2.json rename to azure_devops/bootstrap/pipelines/classic/valet-classic2.json diff --git a/azure_devops/pipelines/readme.md b/azure_devops/bootstrap/pipelines/readme.md similarity index 100% rename from azure_devops/pipelines/readme.md rename to azure_devops/bootstrap/pipelines/readme.md diff --git a/azure_devops/pipelines/yml/valet-mapper-example.yml b/azure_devops/bootstrap/pipelines/yml/valet-mapper-example.yml similarity index 100% rename from azure_devops/pipelines/yml/valet-mapper-example.yml rename to azure_devops/bootstrap/pipelines/yml/valet-mapper-example.yml diff --git a/azure_devops/pipelines/yml/valet-pipeline1.yml b/azure_devops/bootstrap/pipelines/yml/valet-pipeline1.yml similarity index 100% rename from azure_devops/pipelines/yml/valet-pipeline1.yml rename to azure_devops/bootstrap/pipelines/yml/valet-pipeline1.yml diff --git a/azure_devops/pipelines/yml/valet-pipeline2.yml b/azure_devops/bootstrap/pipelines/yml/valet-pipeline2.yml similarity index 100% rename from azure_devops/pipelines/yml/valet-pipeline2.yml rename to azure_devops/bootstrap/pipelines/yml/valet-pipeline2.yml diff --git a/code/readme.md b/code/readme.md deleted file mode 100644 index d58f7e7..0000000 --- a/code/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# code folder -This folder contains a dotnet core application used for building puproses with the CI/CD selected. - -### Note any file added to this folder or sub folders will get migrated to the Azure DevOps instance when the GitHub Action runs to create and bootstrap the Azure DevOps project - diff --git a/valet/.env.local.template b/valet/.env.local.template deleted file mode 100644 index ce4ca6f..0000000 --- a/valet/.env.local.template +++ /dev/null @@ -1,7 +0,0 @@ -GITHUB_ACCESS_TOKEN= -GITHUB_INSTANCE_URL= - -AZURE_DEVOPS_PROJECT= -AZURE_DEVOPS_ORGANIZATION= -AZURE_DEVOPS_INSTANCE_URL= -AZURE_DEVOPS_ACCESS_TOKEN= From 0b691536d496d88277c660846e23c8cbec354155 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Tue, 23 Aug 2022 15:03:43 -0700 Subject: [PATCH 02/69] Add setup script to seed azdo project --- .../pipelines/classic/valet-classic1.json | 452 +++++++++--------- .../pipelines/classic/valet-classic2.json | 452 +++++++++--------- ...l => valet-custom-transformer-example.yml} | 0 azure_devops/bootstrap/setup | 178 +++++++ azure_devops/valet-migrate-custom-lab.md | 4 +- 5 files changed, 632 insertions(+), 454 deletions(-) rename azure_devops/bootstrap/pipelines/yml/{valet-mapper-example.yml => valet-custom-transformer-example.yml} (100%) create mode 100755 azure_devops/bootstrap/setup diff --git a/azure_devops/bootstrap/pipelines/classic/valet-classic1.json b/azure_devops/bootstrap/pipelines/classic/valet-classic1.json index 1ade862..43052b4 100644 --- a/azure_devops/bootstrap/pipelines/classic/valet-classic1.json +++ b/azure_devops/bootstrap/pipelines/classic/valet-classic1.json @@ -1,243 +1,243 @@ { - "options": [ - { + "options": [ + { + "enabled": true, + "definition": { + "id": "5d58cc01-7c75-450c-be18-a388ddb129ec" + }, + "inputs": { + "branchFilters": "[\"+refs/heads/*\"]", + "additionalFields": "{}" + } + }, + { + "enabled": false, + "definition": { + "id": "a9db38f9-9fdc-478c-b0f9-464221e58316" + }, + "inputs": { + "workItemType": "Task", + "assignToRequestor": "true", + "additionalFields": "{}" + } + } + ], + "variables": { + "BuildConfiguration": { + "value": "release", + "allowOverride": true + }, + "BuildPlatform": { + "value": "any cpu", + "allowOverride": true + }, + "system.debug": { + "value": "false", + "allowOverride": true + } + }, + "properties": {}, + "tags": [], + "_links": [], + "buildNumberFormat": "$(date:yyyyMMdd)$(rev:.r)", + "jobAuthorizationScope": 1, + "jobTimeoutInMinutes": 60, + "jobCancelTimeoutInMinutes": 5, + "process": { + "phases": [ + { + "steps": [ + { + "environment": {}, "enabled": true, - "definition": { - "id": "5d58cc01-7c75-450c-be18-a388ddb129ec" + "continueOnError": false, + "alwaysRun": false, + "displayName": "Use NuGet 4.4.1", + "timeoutInMinutes": 0, + "retryCountOnTaskFailure": 0, + "condition": "succeeded()", + "task": { + "id": "2c65196a-54fd-4a02-9be8-d9d1837b7c5d", + "versionSpec": "0.*", + "definitionType": "task" }, "inputs": { - "branchFilters": "[\"+refs/heads/*\"]", - "additionalFields": "{}" + "versionSpec": "4.4.1", + "checkLatest": "false" } - }, - { - "enabled": false, - "definition": { - "id": "a9db38f9-9fdc-478c-b0f9-464221e58316" + }, + { + "environment": {}, + "enabled": true, + "continueOnError": false, + "alwaysRun": false, + "displayName": "NuGet restore", + "timeoutInMinutes": 0, + "retryCountOnTaskFailure": 0, + "condition": "succeeded()", + "task": { + "id": "333b11bd-d341-40d9-afcf-b32d5ce6f23b", + "versionSpec": "2.*", + "definitionType": "task" }, "inputs": { - "workItemType": "Task", - "assignToRequestor": "true", - "additionalFields": "{}" + "command": "restore", + "solution": "$(Parameters.solution)", + "selectOrConfig": "select", + "feedRestore": "", + "includeNuGetOrg": "true", + "nugetConfigPath": "", + "externalEndpoints": "", + "noCache": "false", + "disableParallelProcessing": "false", + "packagesDirectory": "", + "verbosityRestore": "Detailed", + "searchPatternPush": "$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg", + "nuGetFeedType": "internal", + "feedPublish": "", + "publishPackageMetadata": "true", + "allowPackageConflicts": "false", + "externalEndpoint": "", + "verbosityPush": "Detailed", + "searchPatternPack": "**/*.csproj", + "configurationToPack": "$(BuildConfiguration)", + "outputDir": "$(Build.ArtifactStagingDirectory)", + "versioningScheme": "off", + "includeReferencedProjects": "false", + "versionEnvVar": "", + "requestedMajorVersion": "1", + "requestedMinorVersion": "0", + "requestedPatchVersion": "0", + "packTimezone": "utc", + "includeSymbols": "false", + "toolPackage": "false", + "buildProperties": "", + "basePath": "", + "verbosityPack": "Detailed", + "arguments": "" } - } - ], - "variables": { - "BuildConfiguration": { - "value": "release", - "allowOverride": true - }, - "BuildPlatform": { - "value": "any cpu", - "allowOverride": true - }, - "system.debug": { - "value": "false", - "allowOverride": true - } - }, - "properties": {}, - "tags": [], - "_links": [], - "buildNumberFormat": "$(date:yyyyMMdd)$(rev:.r)", - "jobAuthorizationScope": 1, - "jobTimeoutInMinutes": 60, - "jobCancelTimeoutInMinutes": 5, - "process": { - "phases": [ - { - "steps": [ - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "Use NuGet 4.4.1", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "2c65196a-54fd-4a02-9be8-d9d1837b7c5d", - "versionSpec": "0.*", - "definitionType": "task" - }, - "inputs": { - "versionSpec": "4.4.1", - "checkLatest": "false" - } - }, - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "NuGet restore", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "333b11bd-d341-40d9-afcf-b32d5ce6f23b", - "versionSpec": "2.*", - "definitionType": "task" - }, - "inputs": { - "command": "restore", - "solution": "$(Parameters.solution)", - "selectOrConfig": "select", - "feedRestore": "", - "includeNuGetOrg": "true", - "nugetConfigPath": "", - "externalEndpoints": "", - "noCache": "false", - "disableParallelProcessing": "false", - "packagesDirectory": "", - "verbosityRestore": "Detailed", - "searchPatternPush": "$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg", - "nuGetFeedType": "internal", - "feedPublish": "", - "publishPackageMetadata": "true", - "allowPackageConflicts": "false", - "externalEndpoint": "", - "verbosityPush": "Detailed", - "searchPatternPack": "**/*.csproj", - "configurationToPack": "$(BuildConfiguration)", - "outputDir": "$(Build.ArtifactStagingDirectory)", - "versioningScheme": "off", - "includeReferencedProjects": "false", - "versionEnvVar": "", - "requestedMajorVersion": "1", - "requestedMinorVersion": "0", - "requestedPatchVersion": "0", - "packTimezone": "utc", - "includeSymbols": "false", - "toolPackage": "false", - "buildProperties": "", - "basePath": "", - "verbosityPack": "Detailed", - "arguments": "" - } - }, - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "PowerShell Script", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1", - "versionSpec": "2.*", - "definitionType": "task" - }, - "inputs": { - "targetType": "inline", - "filePath": "", - "arguments": "", - "script": "# Write your PowerShell commands here.\n\nWrite-Host \"Hello World\"\n", - "errorActionPreference": "stop", - "warningPreference": "default", - "informationPreference": "default", - "verbosePreference": "default", - "debugPreference": "default", - "failOnStderr": "false", - "showWarnings": "false", - "ignoreLASTEXITCODE": "false", - "pwsh": "false", - "workingDirectory": "", - "runScriptInSeparateScope": "false" - } - } - ], - "name": "Agent job 1", - "refName": "Job_1", - "condition": "succeeded()", - "target": { - "executionOptions": { - "type": 0 - }, - "allowScriptsAuthAccessOption": false, - "type": 1 - }, - "jobAuthorizationScope": 1 + }, + { + "environment": {}, + "enabled": true, + "continueOnError": false, + "alwaysRun": false, + "displayName": "PowerShell Script", + "timeoutInMinutes": 0, + "retryCountOnTaskFailure": 0, + "condition": "succeeded()", + "task": { + "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1", + "versionSpec": "2.*", + "definitionType": "task" + }, + "inputs": { + "targetType": "inline", + "filePath": "", + "arguments": "", + "script": "# Write your PowerShell commands here.\n\nWrite-Host \"Hello World\"\n", + "errorActionPreference": "stop", + "warningPreference": "default", + "informationPreference": "default", + "verbosePreference": "default", + "debugPreference": "default", + "failOnStderr": "false", + "showWarnings": "false", + "ignoreLASTEXITCODE": "false", + "pwsh": "false", + "workingDirectory": "", + "runScriptInSeparateScope": "false" } + } ], + "name": "Agent job 1", + "refName": "Job_1", + "condition": "succeeded()", "target": { - "agentSpecification": { - "identifier": "windows-latest" - } + "executionOptions": { + "type": 0 + }, + "allowScriptsAuthAccessOption": false, + "type": 1 }, - "type": 1 + "jobAuthorizationScope": 1 + } + ], + "target": { + "agentSpecification": { + "identifier": "windows-latest" + } }, - "repository": { - "properties": { - "cleanOptions": "0", - "labelSources": "0", - "labelSourcesFormat": "$(build.buildNumber)", - "reportBuildStatus": "true", - "gitLfsSupport": "false", - "skipSyncSource": "false", - "checkoutNestedSubmodules": "false", - "fetchDepth": "0" - }, - "id": "", - "type": "TfsGit", - "name": "REPOTOREPLACE", - "url": "", - "defaultBranch": "refs/heads/main", - "clean": "false", - "checkoutSubmodules": false + "type": 1 + }, + "repository": { + "properties": { + "cleanOptions": "0", + "labelSources": "0", + "labelSourcesFormat": "$(build.buildNumber)", + "reportBuildStatus": "true", + "gitLfsSupport": "false", + "skipSyncSource": "false", + "checkoutNestedSubmodules": "false", + "fetchDepth": "0" }, - "processParameters": { - "inputs": [ - { - "aliases": [], - "options": {}, - "properties": {}, - "name": "solution", - "label": "Solution", - "defaultValue": "**\\*.sln", - "required": true, - "type": "filePath", - "helpMarkDown": "The path to the Visual Studio solution file or NuGet packages.config. Wildcards can be used. For example, `**\\\\*.sln` for all sln files in all sub folders." - } - ] + "id": "", + "type": "TfsGit", + "name": "REPOTOREPLACE", + "url": "", + "defaultBranch": "refs/heads/main", + "clean": "false", + "checkoutSubmodules": false + }, + "processParameters": { + "inputs": [ + { + "aliases": [], + "options": {}, + "properties": {}, + "name": "solution", + "label": "Solution", + "defaultValue": "**\\*.sln", + "required": true, + "type": "filePath", + "helpMarkDown": "The path to the Visual Studio solution file or NuGet packages.config. Wildcards can be used. For example, `**\\\\*.sln` for all sln files in all sub folders." + } + ] + }, + "quality": 1, + "authoredBy": { + "displayName": "David Kalmin", + "url": "https://spsprodcus5.vssps.visualstudio.com/A8ceff4ff-6429-4de3-9c39-fd7f0b1fb05a/_apis/Identities/a886d3a4-5700-6920-a3e4-6dadf46e7614", + "_links": { + "avatar": { + "href": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" + } }, - "quality": 1, - "authoredBy": { - "displayName": "David Kalmin", - "url": "https://spsprodcus5.vssps.visualstudio.com/A8ceff4ff-6429-4de3-9c39-fd7f0b1fb05a/_apis/Identities/a886d3a4-5700-6920-a3e4-6dadf46e7614", - "_links": { - "avatar": { - "href": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" - } - }, - "id": "a886d3a4-5700-6920-a3e4-6dadf46e7614", - "uniqueName": "davidkalmin@microsoft.com", - "imageUrl": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0", - "descriptor": "aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" + "id": "a886d3a4-5700-6920-a3e4-6dadf46e7614", + "uniqueName": "davidkalmin@microsoft.com", + "imageUrl": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0", + "descriptor": "aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" + }, + "drafts": [], + "queue": { + "_links": { + "self": { + "href": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126" + } }, - "drafts": [], - "queue": { - "_links": { - "self": { - "href": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126" - } - }, - "name": "Azure Pipelines", - "url": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126", - "pool": { - "name": "Azure Pipelines", - "isHosted": true - } - }, - "id": 10, - "name": "valet-classic-test-import1", - "uri": "vstfs:///Build/Definition/10", - "path": "\\", - "type": 2, - "queueStatus": 0, - "revision": 1, - "createdDate": "2022-02-17T19:05:52.500Z", + "name": "Azure Pipelines", + "url": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126", + "pool": { + "name": "Azure Pipelines", + "isHosted": true + } + }, + "id": 10, + "name": "valet-classic-test-import1", + "uri": "vstfs:///Build/Definition/10", + "path": "\\", + "type": 2, + "queueStatus": 0, + "revision": 1, + "createdDate": "2022-02-17T19:05:52.500Z" } diff --git a/azure_devops/bootstrap/pipelines/classic/valet-classic2.json b/azure_devops/bootstrap/pipelines/classic/valet-classic2.json index fa966c1..b368aa1 100644 --- a/azure_devops/bootstrap/pipelines/classic/valet-classic2.json +++ b/azure_devops/bootstrap/pipelines/classic/valet-classic2.json @@ -1,243 +1,243 @@ { - "options": [ - { + "options": [ + { + "enabled": true, + "definition": { + "id": "5d58cc01-7c75-450c-be18-a388ddb129ec" + }, + "inputs": { + "branchFilters": "[\"+refs/heads/*\"]", + "additionalFields": "{}" + } + }, + { + "enabled": false, + "definition": { + "id": "a9db38f9-9fdc-478c-b0f9-464221e58316" + }, + "inputs": { + "workItemType": "Task", + "assignToRequestor": "true", + "additionalFields": "{}" + } + } + ], + "variables": { + "BuildConfiguration": { + "value": "release", + "allowOverride": true + }, + "BuildPlatform": { + "value": "any cpu", + "allowOverride": true + }, + "system.debug": { + "value": "false", + "allowOverride": true + } + }, + "properties": {}, + "tags": [], + "_links": [], + "buildNumberFormat": "$(date:yyyyMMdd)$(rev:.r)", + "jobAuthorizationScope": 1, + "jobTimeoutInMinutes": 60, + "jobCancelTimeoutInMinutes": 5, + "process": { + "phases": [ + { + "steps": [ + { + "environment": {}, "enabled": true, - "definition": { - "id": "5d58cc01-7c75-450c-be18-a388ddb129ec" + "continueOnError": false, + "alwaysRun": false, + "displayName": "Use NuGet 4.4.1", + "timeoutInMinutes": 0, + "retryCountOnTaskFailure": 0, + "condition": "succeeded()", + "task": { + "id": "2c65196a-54fd-4a02-9be8-d9d1837b7c5d", + "versionSpec": "0.*", + "definitionType": "task" }, "inputs": { - "branchFilters": "[\"+refs/heads/*\"]", - "additionalFields": "{}" + "versionSpec": "4.4.1", + "checkLatest": "false" } - }, - { - "enabled": false, - "definition": { - "id": "a9db38f9-9fdc-478c-b0f9-464221e58316" + }, + { + "environment": {}, + "enabled": true, + "continueOnError": false, + "alwaysRun": false, + "displayName": "NuGet restore", + "timeoutInMinutes": 0, + "retryCountOnTaskFailure": 0, + "condition": "succeeded()", + "task": { + "id": "333b11bd-d341-40d9-afcf-b32d5ce6f23b", + "versionSpec": "2.*", + "definitionType": "task" }, "inputs": { - "workItemType": "Task", - "assignToRequestor": "true", - "additionalFields": "{}" + "command": "restore", + "solution": "$(Parameters.solution)", + "selectOrConfig": "select", + "feedRestore": "", + "includeNuGetOrg": "true", + "nugetConfigPath": "", + "externalEndpoints": "", + "noCache": "false", + "disableParallelProcessing": "false", + "packagesDirectory": "", + "verbosityRestore": "Detailed", + "searchPatternPush": "$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg", + "nuGetFeedType": "internal", + "feedPublish": "", + "publishPackageMetadata": "true", + "allowPackageConflicts": "false", + "externalEndpoint": "", + "verbosityPush": "Detailed", + "searchPatternPack": "**/*.csproj", + "configurationToPack": "$(BuildConfiguration)", + "outputDir": "$(Build.ArtifactStagingDirectory)", + "versioningScheme": "off", + "includeReferencedProjects": "false", + "versionEnvVar": "", + "requestedMajorVersion": "1", + "requestedMinorVersion": "0", + "requestedPatchVersion": "0", + "packTimezone": "utc", + "includeSymbols": "false", + "toolPackage": "false", + "buildProperties": "", + "basePath": "", + "verbosityPack": "Detailed", + "arguments": "" } - } - ], - "variables": { - "BuildConfiguration": { - "value": "release", - "allowOverride": true - }, - "BuildPlatform": { - "value": "any cpu", - "allowOverride": true - }, - "system.debug": { - "value": "false", - "allowOverride": true - } - }, - "properties": {}, - "tags": [], - "_links": [], - "buildNumberFormat": "$(date:yyyyMMdd)$(rev:.r)", - "jobAuthorizationScope": 1, - "jobTimeoutInMinutes": 60, - "jobCancelTimeoutInMinutes": 5, - "process": { - "phases": [ - { - "steps": [ - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "Use NuGet 4.4.1", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "2c65196a-54fd-4a02-9be8-d9d1837b7c5d", - "versionSpec": "0.*", - "definitionType": "task" - }, - "inputs": { - "versionSpec": "4.4.1", - "checkLatest": "false" - } - }, - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "NuGet restore", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "333b11bd-d341-40d9-afcf-b32d5ce6f23b", - "versionSpec": "2.*", - "definitionType": "task" - }, - "inputs": { - "command": "restore", - "solution": "$(Parameters.solution)", - "selectOrConfig": "select", - "feedRestore": "", - "includeNuGetOrg": "true", - "nugetConfigPath": "", - "externalEndpoints": "", - "noCache": "false", - "disableParallelProcessing": "false", - "packagesDirectory": "", - "verbosityRestore": "Detailed", - "searchPatternPush": "$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg", - "nuGetFeedType": "internal", - "feedPublish": "", - "publishPackageMetadata": "true", - "allowPackageConflicts": "false", - "externalEndpoint": "", - "verbosityPush": "Detailed", - "searchPatternPack": "**/*.csproj", - "configurationToPack": "$(BuildConfiguration)", - "outputDir": "$(Build.ArtifactStagingDirectory)", - "versioningScheme": "off", - "includeReferencedProjects": "false", - "versionEnvVar": "", - "requestedMajorVersion": "1", - "requestedMinorVersion": "0", - "requestedPatchVersion": "0", - "packTimezone": "utc", - "includeSymbols": "false", - "toolPackage": "false", - "buildProperties": "", - "basePath": "", - "verbosityPack": "Detailed", - "arguments": "" - } - }, - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "PowerShell Script", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1", - "versionSpec": "2.*", - "definitionType": "task" - }, - "inputs": { - "targetType": "inline", - "filePath": "", - "arguments": "", - "script": "# Write your PowerShell commands here.\n\nWrite-Host \"Hello World\"\n", - "errorActionPreference": "stop", - "warningPreference": "default", - "informationPreference": "default", - "verbosePreference": "default", - "debugPreference": "default", - "failOnStderr": "false", - "showWarnings": "false", - "ignoreLASTEXITCODE": "false", - "pwsh": "false", - "workingDirectory": "", - "runScriptInSeparateScope": "false" - } - } - ], - "name": "Agent job 1", - "refName": "Job_1", - "condition": "succeeded()", - "target": { - "executionOptions": { - "type": 0 - }, - "allowScriptsAuthAccessOption": false, - "type": 1 - }, - "jobAuthorizationScope": 1 + }, + { + "environment": {}, + "enabled": true, + "continueOnError": false, + "alwaysRun": false, + "displayName": "PowerShell Script", + "timeoutInMinutes": 0, + "retryCountOnTaskFailure": 0, + "condition": "succeeded()", + "task": { + "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1", + "versionSpec": "2.*", + "definitionType": "task" + }, + "inputs": { + "targetType": "inline", + "filePath": "", + "arguments": "", + "script": "# Write your PowerShell commands here.\n\nWrite-Host \"Hello World\"\n", + "errorActionPreference": "stop", + "warningPreference": "default", + "informationPreference": "default", + "verbosePreference": "default", + "debugPreference": "default", + "failOnStderr": "false", + "showWarnings": "false", + "ignoreLASTEXITCODE": "false", + "pwsh": "false", + "workingDirectory": "", + "runScriptInSeparateScope": "false" } + } ], + "name": "Agent job 1", + "refName": "Job_1", + "condition": "succeeded()", "target": { - "agentSpecification": { - "identifier": "windows-latest" - } + "executionOptions": { + "type": 0 + }, + "allowScriptsAuthAccessOption": false, + "type": 1 }, - "type": 1 + "jobAuthorizationScope": 1 + } + ], + "target": { + "agentSpecification": { + "identifier": "windows-latest" + } }, - "repository": { - "properties": { - "cleanOptions": "0", - "labelSources": "0", - "labelSourcesFormat": "$(build.buildNumber)", - "reportBuildStatus": "true", - "gitLfsSupport": "false", - "skipSyncSource": "false", - "checkoutNestedSubmodules": "false", - "fetchDepth": "0" - }, - "id": "", - "type": "TfsGit", - "name": "REPOTOREPLACE", - "url": "", - "defaultBranch": "refs/heads/main", - "clean": "false", - "checkoutSubmodules": false + "type": 1 + }, + "repository": { + "properties": { + "cleanOptions": "0", + "labelSources": "0", + "labelSourcesFormat": "$(build.buildNumber)", + "reportBuildStatus": "true", + "gitLfsSupport": "false", + "skipSyncSource": "false", + "checkoutNestedSubmodules": "false", + "fetchDepth": "0" }, - "processParameters": { - "inputs": [ - { - "aliases": [], - "options": {}, - "properties": {}, - "name": "solution", - "label": "Solution", - "defaultValue": "**\\*.sln", - "required": true, - "type": "filePath", - "helpMarkDown": "The path to the Visual Studio solution file or NuGet packages.config. Wildcards can be used. For example, `**\\\\*.sln` for all sln files in all sub folders." - } - ] + "id": "", + "type": "TfsGit", + "name": "REPOTOREPLACE", + "url": "", + "defaultBranch": "refs/heads/main", + "clean": "false", + "checkoutSubmodules": false + }, + "processParameters": { + "inputs": [ + { + "aliases": [], + "options": {}, + "properties": {}, + "name": "solution", + "label": "Solution", + "defaultValue": "**\\*.sln", + "required": true, + "type": "filePath", + "helpMarkDown": "The path to the Visual Studio solution file or NuGet packages.config. Wildcards can be used. For example, `**\\\\*.sln` for all sln files in all sub folders." + } + ] + }, + "quality": 1, + "authoredBy": { + "displayName": "David Kalmin", + "url": "https://spsprodcus5.vssps.visualstudio.com/A8ceff4ff-6429-4de3-9c39-fd7f0b1fb05a/_apis/Identities/a886d3a4-5700-6920-a3e4-6dadf46e7614", + "_links": { + "avatar": { + "href": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" + } }, - "quality": 1, - "authoredBy": { - "displayName": "David Kalmin", - "url": "https://spsprodcus5.vssps.visualstudio.com/A8ceff4ff-6429-4de3-9c39-fd7f0b1fb05a/_apis/Identities/a886d3a4-5700-6920-a3e4-6dadf46e7614", - "_links": { - "avatar": { - "href": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" - } - }, - "id": "a886d3a4-5700-6920-a3e4-6dadf46e7614", - "uniqueName": "davidkalmin@microsoft.com", - "imageUrl": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0", - "descriptor": "aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" + "id": "a886d3a4-5700-6920-a3e4-6dadf46e7614", + "uniqueName": "davidkalmin@microsoft.com", + "imageUrl": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0", + "descriptor": "aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" + }, + "drafts": [], + "queue": { + "_links": { + "self": { + "href": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126" + } }, - "drafts": [], - "queue": { - "_links": { - "self": { - "href": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126" - } - }, - "name": "Azure Pipelines", - "url": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126", - "pool": { - "name": "Azure Pipelines", - "isHosted": true - } - }, - "id": 10, - "name": "valet-classic-test-import2", - "uri": "vstfs:///Build/Definition/10", - "path": "\\", - "type": 2, - "queueStatus": 0, - "revision": 1, - "createdDate": "2022-02-17T19:05:52.500Z", + "name": "Azure Pipelines", + "url": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126", + "pool": { + "name": "Azure Pipelines", + "isHosted": true + } + }, + "id": 10, + "name": "valet-classic-test-import2", + "uri": "vstfs:///Build/Definition/10", + "path": "\\", + "type": 2, + "queueStatus": 0, + "revision": 1, + "createdDate": "2022-02-17T19:05:52.500Z" } diff --git a/azure_devops/bootstrap/pipelines/yml/valet-mapper-example.yml b/azure_devops/bootstrap/pipelines/yml/valet-custom-transformer-example.yml similarity index 100% rename from azure_devops/bootstrap/pipelines/yml/valet-mapper-example.yml rename to azure_devops/bootstrap/pipelines/yml/valet-custom-transformer-example.yml diff --git a/azure_devops/bootstrap/setup b/azure_devops/bootstrap/setup new file mode 100755 index 0000000..e225a95 --- /dev/null +++ b/azure_devops/bootstrap/setup @@ -0,0 +1,178 @@ +#!/usr/bin/env ruby +require "json" +require "net/http" +require "optparse" +require "pathname" +require "pry" + +options = { + code_assets_dir: "code", + pipeline_assets_dir: "pipelines", + root_dir: File.join(ENV["CODESPACE_VSCODE_FOLDER"], "azure_devops/bootstrap") +} + +OptionParser.new do |opt| + opt.on('--organization ORGANIZATION') { |o| options[:organization] = o } + opt.on('--project PROJECT') { |o| options[:project] = o } + opt.on('--access-token ACCESS_TOKEN') { |o| options[:access_token] = o } +end.parse! + +[:organization, :project, :access_token].each do |key| + raise OptionParser::MissingArgument, key if options[key].nil? +end + +def post_request(uri, body, access_token) + Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http| + request = Net::HTTP::Post.new(uri) + request.basic_auth "", access_token + request.body = body.to_json + request.content_type = 'application/json' + + response = http.request request + + yield(response) if block_given? + + sleep(5) + + JSON.parse(response.body) + end +end + +def create_project(options) + organization = options[:organization] + project = options[:project] + access_token = options[:access_token] + + puts "Creating project #{project} in organization #{organization}..." + uri = URI("https://dev.azure.com/#{organization}/_apis/projects?api-version=6.0") + + project_to_create = { + name: project, + description: "Project to be used for Valet Labs", + capabilities: { + versioncontrol: { + sourceControlType: "Git" + }, + processTemplate: { + templateTypeId: "6b724908-ef14-45cf-84f8-768b5384da45" + } + } + } + + post_request(uri, project_to_create, access_token) do |response| + raise "Error creating project (#{response.code}:#{response.message})" unless response.code.start_with?("20") + end +end + +def create_repository(options) + organization = options[:organization] + project = options[:project] + # use the default repository created when the project is created + repository = options[:project] + access_token = options[:access_token] + root_dir = options[:root_dir] + directories = [options[:code_assets_dir], options[:pipeline_assets_dir]] + + puts "Creating repository #{repository}..." + uri = URI("https://dev.azure.com/#{organization}/#{project}/_apis/git/repositories/#{repository}/pushes?api-version=7.1-preview.2") + + root = Pathname.new(root_dir) + repository_to_create = { + refUpdates: [{ + name: "refs/heads/main", + oldObjectId: "0000000000000000000000000000000000000000" + }], + commits: [{ + comment: "Initial commit.", + changes: directories.map do |directory| + Dir[File.join(root_dir, directory, "**/*")].reject {|f| File.directory?(f) }.map do |entry| + { + changeType: "add", + item: { + path: File.join("/", Pathname.new(entry).relative_path_from(root).to_s) + }, + newContent: { + content: File.read(entry), + contentType: "rawText" + } + } + end + end.flatten + }] + } + + post_request(uri, repository_to_create, access_token) do |response| + raise "Error creating repository (#{response.code}:#{response.message})" unless response.code.start_with?("20") + end +end + +def create_yaml_pipelines(options, repository) + organization = options[:organization] + project = options[:project] + repository_name = repository.dig("repository", "name") + repository_id = repository.dig("repository", "id") + access_token = options[:access_token] + root_dir = options[:root_dir] + pipeline_assets_dir = options[:pipeline_assets_dir] + + puts "Creating yaml pipelines..." + + uri = URI("https://dev.azure.com/#{organization}/#{project}/_apis/pipelines?api-version=6.0-preview.1") + root = Pathname.new(root_dir) + Dir[File.join(root_dir, pipeline_assets_dir, "yml", "*")].each do |entry| + puts "Creating pipeline #{entry}..." + + pipeline_to_create = { + folder: "pipelines", + name: File.basename(entry, ".yml"), + configuration: { + type: "yaml", + path: File.join("/", Pathname.new(entry).relative_path_from(root).to_s), + repository: { + id: repository_id, + name: repository_name, + type: "azureReposGit" + } + } + } + + post_request(uri, pipeline_to_create, access_token) do |response| + raise "Error creating pipeline (#{response.code}:#{response.message})" unless response.code.start_with?("20") + end + end +end + +def create_classic_pipelines(options, repository) + organization = options[:organization] + project = options[:project] + repository_name = repository.dig("repository", "name") + repository_id = repository.dig("repository", "id") + access_token = options[:access_token] + root_dir = options[:root_dir] + pipeline_assets_dir = options[:pipeline_assets_dir] + + puts "Creating classic pipelines..." + + uri = URI("https://dev.azure.com/#{organization}/#{project}/_apis/build/definitions?api-version=7.1-preview.7") + root = Pathname.new(root_dir) + Dir[File.join(root_dir, pipeline_assets_dir, "classic", "*")].each do |entry| + puts "Creating pipeline #{entry}..." + + pipeline_to_create = JSON.parse(File.read(entry)) + + pipeline_to_create["repository"]["name"] = repository_name + pipeline_to_create["repository"]["id"] = repository_id + + post_request(uri, pipeline_to_create, access_token) do |response| + raise "Error creating pipeline (#{response.code}:#{response.message})" unless response.code.start_with?("20") + end + end +end + + +create_project(options) +repository = create_repository(options) +create_yaml_pipelines(options, repository) +create_classic_pipelines(options, repository) + +puts "Success!" \ No newline at end of file diff --git a/azure_devops/valet-migrate-custom-lab.md b/azure_devops/valet-migrate-custom-lab.md index eb7ca67..ffe7725 100644 --- a/azure_devops/valet-migrate-custom-lab.md +++ b/azure_devops/valet-migrate-custom-lab.md @@ -15,9 +15,9 @@ In this lab, you will create a custom plugin that transforms some of the existin 4. Complete the [Valet migrate lab](valet-migrate-lab.md). ## Identify the Azure DevOps pipeline ID to use -You will need the `valet-mapper-example` Azure DevOps pipeline ID to perform the migration +You will need the `valet-custom-transformer-example` Azure DevOps pipeline ID to perform the migration 1. Go to the `valet/ValetBootstrap/pipelines` folder -2. Open the `valet/ValetBootstrap/pipelines/valet-mapper-example.config.json` file +2. Open the `valet/ValetBootstrap/pipelines/valet-custom-transformer-example.config.json` file 3. Look for the `web - href` link 4. At the end of the link is the pipeline ID. Copy or note the ID. From 3e863042a12bd4c9358cb0b70b89ffd1a369280a Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Tue, 23 Aug 2022 15:22:48 -0700 Subject: [PATCH 03/69] Update azure devops setup instructions --- .devcontainer/devcontainer.json | 8 +- .devcontainer/setupcodespace.sh | 28 ---- .github/workflows/valetbsazdo.yml | 35 ----- azure_devops/bootstrap/azDevOps.ps1 | 235 ---------------------------- azure_devops/readme.md | 158 +++++++------------ azure_devops/valet-configure-lab.md | 0 6 files changed, 57 insertions(+), 407 deletions(-) delete mode 100644 .devcontainer/setupcodespace.sh delete mode 100644 .github/workflows/valetbsazdo.yml delete mode 100644 azure_devops/bootstrap/azDevOps.ps1 create mode 100644 azure_devops/valet-configure-lab.md diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 8c3f8c2..c0cd1c0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,5 @@ { - "name": "Codespace to bootstrap valet in a Codespace", - //Use base codespace image then pull Valet on postCreateCommand, + "name": "Codespace to perform Valet Labs", "image": "mcr.microsoft.com/vscode/devcontainers/universal:linux", "remoteUser": "codespace", "overrideCommand": false, @@ -15,8 +14,7 @@ // Add the IDs of extensions you want installed when the container is created. "extensions": [ - "ms-azuretools.vscode-docker", + "ms-azuretools.vscode-docker" ], - "onCreateCommand": 'echo "export GITHUB_ACCESS_TOKEN=$VALET_GHCR_PASSWORD" >> ~/.bashrc', - "postCreateCommand": "sudo bash .devcontainer/setupcodespace.sh ${VALET_GHCR_PASSWORD} ${AZURE_DEVOPS_PROJECT} ${AZURE_DEVOPS_ORGANIZATION} ${AZURE_DEVOPS_ACCESS_TOKEN} ${GITHUB_USER} 'https://github.com/' && gh extension install github/gh-valet || echo 'Could not auto-build. Skipping.' " + "postCreateCommand": "gh extension install github/gh-valet || echo 'Could not auto-build. Skipping.' " } diff --git a/.devcontainer/setupcodespace.sh b/.devcontainer/setupcodespace.sh deleted file mode 100644 index c98469a..0000000 --- a/.devcontainer/setupcodespace.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -echo "Starting setupcodespace.sh" - -azdoProject="AZURE_DEVOPS_PROJECT=" -azdoOrg="AZURE_DEVOPS_ORGANIZATION=" -azdoInstance="AZURE_DEVOPS_INSTANCE_URL=" -ghAccess="GITHUB_ACCESS_TOKEN=" -azdoAccess="AZURE_DEVOPS_ACCESS_TOKEN=" -ghInstanceUrl="GITHUB_INSTANCE_URL=" - -if [ -z "$1" -o -z "$5" ] -then - echo "Error: Docker Pull Valet not executing because GITHUB_USER and/or VALET_PASSWORD not set" -else - docker login ghcr.io/valet-customers --username $5 --password $1 - docker pull ghcr.io/valet-customers/valet-cli:latest - echo "Success: Docker Pull Valet completed" -fi - -value=`cat valet/.env.local.template` -echo "$value" > valet/.env.local - -if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" -o -z "$6" ] -then - echo "Error: Set envars not set, valid values not passed in. You will have to manually use the valet/.env.local folder" -fi - -echo "Finished setupcodespace.sh" diff --git a/.github/workflows/valetbsazdo.yml b/.github/workflows/valetbsazdo.yml deleted file mode 100644 index bdcda6f..0000000 --- a/.github/workflows/valetbsazdo.yml +++ /dev/null @@ -1,35 +0,0 @@ -# This is a workflow to set up an Azure DevOps instance seeded with pipelines -# You need to Add a secret for an Azure DevOps PAT called AZDOPAT - -name: Valet Bootstrap for Azure DevOps - -on: - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - inputs: - AzDoOrgName: - description: 'Azure DevOps organization name' - required: true - type: string - AzDoUserName: - description: 'Azure DevOps user name' - required: true - type: string - AzDoProjectName: - description: 'Azure DevOps project name' - default: 'ValetBootstrap' - type: string -jobs: - bootstrap: - name: Bootstrap - runs-on: windows-latest - steps: - - name: Check out repository code - uses: actions/checkout@v2 - - name: Run powershell file to bootstrap Azure DevOps - env: - AZDOPATTOUSE: ${{ secrets.AZURE_DEVOPS_ACCESS_TOKEN }} - ROOTFOLDER: ${{ github.workspace }} - shell: pwsh - run: | - ./azure_devops/bootstrap/azDevOps.ps1 -project ${{ github.event.inputs.AzDoProjectName }} -userName ${{ github.event.inputs.AzDoUserName }} -repoName ${{ github.event.inputs.AzDoProjectName }} -orgToUse ${{ github.event.inputs.AzDoOrgName }} -rootFolder $env:ROOTFOLDER -daPassword $env:AZDOPATTOUSE diff --git a/azure_devops/bootstrap/azDevOps.ps1 b/azure_devops/bootstrap/azDevOps.ps1 deleted file mode 100644 index 8e36704..0000000 --- a/azure_devops/bootstrap/azDevOps.ps1 +++ /dev/null @@ -1,235 +0,0 @@ -param ( - $project = "ValetBootstrap", - $repoName = "ValetBootstrap", - $codeFolder= "code,azure_devops/pipelines", - $rootFolder= ".", - $pipelinesRoot="azure_devops/pipelines", - [String]$orgToUse = "..", - [String]$userName=$(Throw "Azure DevOps Username required."), - [String]$daPassword=$(Throw "Password required.") - ) - -Write-Host "Start Valet Bootstrap" -Write-Host "Azure DevOps Organization to use $orgToUse" -Write-Host "Azure DevOps Project to use $project" -Write-Host "Repo Name $repoName" -Write-Host "Code Folders: $codeFolder" -Write-Host "Root Folders: $rootFolder" -Write-Host "Pipelines Folders: $pipelinesRoot" -Write-Host "Azure DevOps username to authenticate with $userName" -Write-Host "Azure DevOps PAT to authenticate with $daPassword" - -function Get-BasicAuthCreds { - param([string]$Username,[String]$Password) - $AuthString = "{0}:{1}" -f $Username,$Password - $AuthBytes = [System.Text.Encoding]::Ascii.GetBytes($AuthString) - return [Convert]::ToBase64String($AuthBytes) -} - -#Get the creds to use in all GitHub API calls. -$BasicCreds = Get-BasicAuthCreds -Username "$userName" -Password $daPassword - -########################################################################## -#CREATE THE AZURE DEVOPS PROJECT -$createtUrlToUse = [string]::Format("https://dev.azure.com/{0}/_apis/projects?api-version=6.0", $orgToUse) - -$projectToCreate = @{ - "name"= "$project" - "description"= "Project to be used for Valet Demos" - "capabilities"= @{ - "versioncontrol"= @{ - "sourceControlType"= "Git" - } - "processTemplate"= @{ - "templateTypeId"= "6b724908-ef14-45cf-84f8-768b5384da45" - } - } - } - - try{ - $projectResponse = Invoke-RestMethod -Method 'Post' -Uri $createtUrlToUse -Headers @{"Authorization"="Basic $BasicCreds"} -Body ($projectToCreate|ConvertTo-Json) -ContentType "application/json" - $projectResponse | ConvertTo-Json - - Start-Sleep -s 5 - Write-Host "Yes! Project $project was created!" - - } Catch { - Write-Host " " - Write-Host "##########################################################################" - Write-Host "ERROR during project creation: $project" - Write-Host "The API call was: $createtUrlToUse" - Write-Host " " - - if($_.ErrorDetails.Message) { - Write-Host "See error message below:" - Write-Host $_.ErrorDetails.Message - } else { - Write-Host $_ - Write-Host "It is likely that the AZURE_DEVOPS_ACCESS_TOKEN is not set correctly in the worflow OR does not have sufficent permissions" - } - Write-Host " " - Write-Host "##########################################################################" - throw "Exiting. The Project $project was NOT created in Azure DevOps" - } - -########################################################################## -# IMPORT THE REPO -Set-Location $rootFolder - -[array]$folderArray = $codeFolder.Split(",") - -$addTextFile = @{ - "refUpdates"= @( - @{ - "name"= "refs/heads/main" - "oldObjectId"= "0000000000000000000000000000000000000000" - } - ) - "commits"= @( - @{ - "comment"= "Initial commit." - "changes"= @( - foreach ($folder in $folderArray) - { - $codeRootFolder = Join-Path -Path $rootFolder -ChildPath $folder - Write-Host "codeRootFolder: $codeRootFolder" - - $itemPath = $folder.Substring($folder.lastIndexOf('/') + 1) - Write-Host "itemPath: $itemPath" - - $codeFiles = (Get-ChildItem "$codeRootFolder" -Recurse -Attributes !Directory) - foreach ($codeFile in $codeFiles ) { - $daFullName = $codeFile.FullName - $codeBody = (Get-Content "$daFullName" -Raw) - #Write-Host "codeBody: $codeBody" - #Write-Host "folder: $folder" - $relath = $daFullName | Resolve-Path -Relative - #Write-Host "relath: $relath" - $replaceSlash = $folder.Replace("/", "\") - $repoPath = $relath.Substring($relath.lastIndexOf($replaceSlash) + $replaceSlash.Length) - $wholeRepoPath = Join-Path -Path $itemPath -ChildPath $repoPath - $wholeRepoPath = $wholeRepoPath.Replace("\", "/") - #Write-Host "wholeRepoPath: $wholeRepoPath" - #Write-Host "repoPath: $repoPath" - @{ - "changeType"= "add" - "item"= @{ - "path"= "/$wholeRepoPath" - } - "newContent"= @{ - "content"= "$codeBody" - "contentType"= "rawtext" - } - } - } - } - ) - } - ) - } - -try{ - $repoUrlToUse = [string]::Format("https://dev.azure.com/{0}/{2}/_apis/git/repositories/{1}/pushes?api-version=7.1-preview.2", $orgToUse, $repoName, $project) - $pushResponse = Invoke-RestMethod -Method 'Post' -Uri $repoUrlToUse -Headers @{"Authorization"="Basic $BasicCreds"} -Body ($addTextFile|ConvertTo-Json -Depth 5) -ContentType "application/json" - $repoIds = $pushResponse.repository.id - Write-Host "Yes! Repo Was was created! The repoId is $repoIds" -} Catch { - Write-Host " " - Write-Host "##########################################################################" - Write-Host "ERROR during Repo creation:" - Write-Host "The API call was: $repoUrlToUse" - Write-Host " " - - if($_.ErrorDetails.Message) { - Write-Host "See error message below:" - Write-Host $_.ErrorDetails.Message - } else { - Write-Host $_ - } - Write-Host " " - Write-Host "##########################################################################" - throw "Exiting. The Repo was NOT created. It is likely the Project was created in Azure DevOps." -} - -########################################################################## -########################################################################## -# Create YML Pipelines -$plUrlToUse = [string]::Format("https://dev.azure.com/{0}/{1}/_apis/pipelines?api-version=6.0-preview.1", $orgToUse, "$project") - -$files = Get-ChildItem ".\$pipelinesRoot\yml\" -foreach ($f in $files) -{ - $nameOfPl = $f.BaseName - $fileName = $f.Name - Write-Host "basename: $nameOfPl filename: $fileName" - - $pipelineCreateBody = @{ - "folder"= "pipelines" - "name"= "$nameOfPl" - "configuration"= @{ - "type"= "yaml" - "path"= "/pipelines/yml/$fileName" - "repository"= @{ - "id"= "$repoIds" - "name"= "$repoName" - "type"= "azureReposGit" - } - } - } - - try{ - $repoResponse = Invoke-RestMethod -Method 'Post' -Uri $plUrlToUse -Headers @{"Authorization"="Basic $BasicCreds"} -Body ($pipelineCreateBody|ConvertTo-Json) -ContentType "application/json" - } Catch { - Write-Host " " - Write-Host "##########################################################################" - Write-Host "ERROR during Pipeline creation:" - Write-Host "The API call was: $plUrlToUse" - Write-Host " " - - if($_.ErrorDetails.Message) { - Write-Host "See error message below:" - Write-Host $_.ErrorDetails.Message - } else { - Write-Host $_ - } - Write-Host " " - Write-Host "The Pipeline $nameOfPl was NOT created." - Write-Host "##########################################################################" - } -} - -########################################################################## -#CREATE CLASSIC PIPELINEs - -$classicUrlToUse = [string]::Format("https://dev.azure.com/{0}/{1}/_apis/build/definitions?api-version=7.1-preview.7", $orgToUse, "$project") - -$files = Get-ChildItem ".\$pipelinesRoot\classic\" -foreach ($f in $files) -{ - $nameOfPl = $f.BaseName - $fileName = $f.Name - Write-Host "basename: $nameOfPl filename: $fileName" - - $pclassicreateBody = (Get-Content ./$pipelinesRoot/classic/$fileName).Replace("REPOTOREPLACE", "$repoName") - - try{ - Invoke-RestMethod -Method 'Post' -Uri $classicUrlToUse -Headers @{"Authorization"="Basic $BasicCreds"} -Body ($pclassicreateBody) -ContentType "application/json" - } Catch { - Write-Host " " - Write-Host "##########################################################################" - Write-Host "ERROR during Pipeline creation:" - Write-Host "The API call was: $classicUrlToUse" - Write-Host " " - - if($_.ErrorDetails.Message) { - Write-Host "See error message below:" - Write-Host $_.ErrorDetails.Message - } else { - Write-Host $_ - } - Write-Host " " - Write-Host "The Pipeline $nameOfPl was NOT created." - Write-Host "##########################################################################" - } -} -Write-Host "End Valet Bootstrap" diff --git a/azure_devops/readme.md b/azure_devops/readme.md index ba0c2e5..3c75df0 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -14,107 +14,55 @@ This lab bootstraps a Valet environment using GitHub Codespaces and enables you 1. Verify you are in your own Repository created from the landing page [Valet Labs](https://github.com/valet-customers/labs). -## Prerequisites -1. Azure DevOps organization. Please identify or create an Azure DevOps organization to use: [Click to create an Azure DevOps Org](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/create-organization?toc=%2Fazure%2Fdevops%2Fget-started%2Ftoc.json&bc=%2Fazure%2Fdevops%2Fget-started%2Fbreadcrumb%2Ftoc.json&view=azure-devops) - - Note and store the Azure DevOp sorganization name for later. - - Note and store the user name you use for your Azure DevOps Organization. It will be an email address. -2. Azure DevOps Project. The default project name for this lab is `ValetBootstrap` There is an Action workflow that will create and populate the Azure DevOps project. No need to create it yourself. Note: The project has to be unique in the Azure DevOps organization. If you already have a project name `ValetBootstrap` please pick a different unique project name. - - Note and store the Azure DevOps project name for later. -3. Create an Azure DevOps personal access token with the following scopes: - - To do so, navigate to Sign in to your organization `https://dev.azure.com/{yourorganization}`. - - Click your `Account management` icon - - Click `user settings` - - Click `Personal access tokens`. - - Select `+ New Token` - - Name your token, select the organization where you want to use the token, and then set your token to automatically expire after a set number of days. - - Select the following scopes (Click `Show more scopes` if you don't see all of the below): - - Agents Pool: `Read` - - Build: `Read & Execute` - - Code: `Read & Write` - - Project and Team: `Read, Write, & Manage` - - Release: `Read` - - Service Connections: `Read` - - Task Groups: `Read` - - Variable Groups: `Read` - - Click `Create` - - Copy the PAT somewhere safe and temporary. -4. Create a GitHub personal access token. - - To do so, navigate to your GitHub `Settings` - click your profile photo and then click `Settings`. - - Go to `Developer Settings` - - Go to `Personal Access Tokens` -> `Legacy tokens (if present)` - - Click `Generate new token` -> `Legacy tokens (if present)`. If required, provide your password. - - Select at least these scopes: `read packages` and `workflow`. Optionally, provide a text in the **Note** field and change the expiration. - - Click `Generate token` - - Copy the PAT somewhere safe and temporary. - -## Codespace secrets -Please add the following Codespace secrets. - -- `VALET_GHCR_PASSWORD`: Add `VALET_GHCR_PASSWORD` as the `Name` and the GitHub personal access token created above as the value. -- `AZURE_DEVOPS_ACCESS_TOKEN`: Add `AZURE_DEVOPS_ACCESS_TOKEN` as the `Name` and the Azure DevOps personal access token created above as the value. -- `AZURE_DEVOPS_ORGANIZATION`: Add `AZURE_DEVOPS_ORGANIZATION` as the `Name` and the Azure DevOps organization noted above as the value. -- `AZURE_DEVOPS_PROJECT`: Add `AZURE_DEVOPS_PROJECT` as the `Name` and the Azure DevOps project noted above as the value. - -Steps to create the Codespace secrets. Complete for secret noted above: - -- Navigate to the `Settings` tab in this repo -- Find `Secrets` and click the down arrow -- Click `Codespaces` -- Click `New Repository Secret` to create a new secret -- Name the secret as noted above -- Paste in the value noted above -- Click `Add Secret` - -## Action secrets -Please add the following Action secrets. - -- `AZURE_DEVOPS_ACCESS_TOKEN`: Add `AZURE_DEVOPS_ACCESS_TOKEN` as the `Name` and the Azure DevOps personal access token created above as the value. - -Steps to create the Actions secret. Complete for secret noted above: - -- Navigate to the `Settings` tab in this repo -- Find `Secrets` and click the down arrow -- Click `Actions` -- Click `New Repository Secret` to create a new secret -- Name the secret as noted above -- Paste in the value noted above -- Click `Add Secret` - -## Azure DevOps project creation - -Run the Actions workflow: -- CLick the `Actions` tab -- Select the `Valet Bootstrap for Azure DevOps` action -- Click `Run Workflow` -- Input the Azure DevOps Organization name identified above -- Input the Azure DevOps user name of the user that created the Azure DevOps PAT above. This will be an email address -- Accept the default Azure DevOps project name or change it to one of your preference - - NOTE: The default project name is `ValetBootstrap`. This must be unique in your Azure DevOps Organization. If not, please choose a unique name. -- Click `Run Workflow` -- Verify the workflow completed successfully. If the workflow did not run successfully you will see a detailed error message. - -### Example ### -![runaction](https://user-images.githubusercontent.com/26442605/167679930-9bdf6f4f-2e94-4145-aed3-8ee3e8e91d90.png) - - ## Use Valet with a codespace 1. Start the codespace - - Click the `Code` with button down arrow above repository on the repository's landing page. - - Click the `Codespaces` tab - - Click `Create codespaces on main` to create the codespace. If you are in another branch then the `main` branch, the codespace will button will have the current branch specified. - - Wait a couple minutes, then verify that the codespace starts up. Once it is fully booted up, the termininal should be present. -2. Verify Valet CLI is installed and working. More information on the [GitHub Valet CLI extension](https://github.com/github/gh-valet) - - Verify Valet CLI is installed and working - - Run `gh valet version` in the Visual Studio Code terminal and verify the output looks like the below image. Note the valet version will be different than below as the latest version gets pulled down. - - If `gh valet version` did not produce a similar image with a version please follow these instructions [Troubleshoot GH Valet extension](#troubleshoot-gh-valet-extension) - - Start using Valet by following along with the [Labs for Azure DevOps](#labs-for-azure-devops) - -### Example ### -![gh-valet-version](https://user-images.githubusercontent.com/26442605/170106559-e69e669f-a1f6-4c2c-8998-3f089b899704.png) + +- Click the `Code` with button down arrow above repository on the repository's landing page. +- Click the `Codespaces` tab +- Click `Create codespaces on main` to create the codespace. If you are in another branch then the `main` branch, the codespace will button will have the current branch specified. +- Wait a couple minutes, then verify that the codespace starts up. Once it is fully booted up, the termininal should be present. + +2. Verify the [extension](https://github.com/github/gh-valet) to the official GitHub CLI for Valet is installed and working. + +- Run `gh valet version` in the Visual Studio Code terminal and verify the output looks like the below image. Note the valet version will be different than below as the latest version gets pulled down. +- If `gh valet version` did not produce a similar image with a version please follow these instructions [Troubleshoot GH Valet extension](#troubleshoot-gh-valet-extension) + +----- + +## Bootstrap your Azure DevOps environment + +1. Create an Azure DevOps personal access token with the following scopes: + +- To do so, navigate to your organization `https://dev.azure.com/{organization}`. +- Click `Personal access tokens`. +- Select `+ New Token` +- Name your token, select the organization where you want to use the token, and then set your token to automatically expire after a set number of days. +- Select the following scopes (Click `Show more scopes` if you don't see all of the below): + - Agents Pool: `Read` + - Build: `Read & Execute` + - Code: `Read & Write` + - Project and Team: `Read, Write, & Manage` + - Release: `Read` + - Service Connections: `Read` + - Task Groups: `Read` + - Variable Groups: `Read` +- Click `Create` +- Copy the PAT somewhere safe and temporary. + +2. Run the Azure DevOps setup script. This script will create an Azure DevOps project and ensure it is ready to be used in the following labs. This script should only need to be run once. + +- Navigate to the terminal within your Codespace. +- Run `./azure_devops/bootstrap/setup --organization :organization --project :project --access-token :access-token` while replacing these values: + - `:organization`: the name of your existing Azure DevOps organization + - `:project`: the name of the project to be created in your Azure DevOps organization + - `:access_token`: the PAT created in step 1 above +- Once this script completes, you will see a new project in your Azure DevOps organization that is populated with some pipelines. ## Labs for Azure DevOps -Perform the following labs to test-drive Valet + +Perform the following labs to learn how to migrate Azure DevOps pipelines to GitHub Actions using Valet: + - [Audit Azure DevOps pipelines using the Valet audit command](valet-audit-lab.md) - [Dry run the migration of an Azure DevOps pipeline to GitHub Actions](valet-dry-run-lab.md) - [Migrate an Azure DevOps pipeline to GitHub Actions](valet-migrate-lab.md) @@ -122,12 +70,14 @@ Perform the following labs to test-drive Valet - [Forecast: Valet forecast lab](valet-forecast-lab.md) ## Troubleshoot GH Valet extension -Manually Install the GitHub CLI Valet extension. More information on the [GitHub Valet CLI extension](https://github.com/github/gh-valet) -- Verify you are in the Visual Studio Code terminal -- Run this command to install the GitHub Valet extension -- `gh extension install github/gh-valet` -- Verify the result of the install is: `✓ Installed extension github/gh-valet` -- If you get a similiar error to the following, click the link to authorize the token + +Manually installing the [extension](https://github.com/github/gh-valet) to the official GitHub CLI for Valet: + +- Verify you are in the Visual Studio Code terminal +- Run this command to install the GitHub Valet extension +- `gh extension install github/gh-valet` +- Verify the result of the install is: `✓ Installed extension github/gh-valet` +- If you get a similiar error to the following, click the link to authorize the token ![linktolcickauth](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) - - Restart Codespace after clicking the link -- Verify Valet CLI is installed and working + - Restart Codespace after clicking the link +- Verify the Valet CLI is installed and working by running the `gh valet version` command diff --git a/azure_devops/valet-configure-lab.md b/azure_devops/valet-configure-lab.md new file mode 100644 index 0000000..e69de29 From f863afe6d9076cbc6269b314335d955aebb03076 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 24 Aug 2022 14:49:48 -0700 Subject: [PATCH 04/69] Update azure_devops/bootstrap/setup Co-authored-by: Luke Engle <99493186+luke-engle@users.noreply.github.com> --- azure_devops/bootstrap/setup | 1 - 1 file changed, 1 deletion(-) diff --git a/azure_devops/bootstrap/setup b/azure_devops/bootstrap/setup index e225a95..e7e0533 100755 --- a/azure_devops/bootstrap/setup +++ b/azure_devops/bootstrap/setup @@ -3,7 +3,6 @@ require "json" require "net/http" require "optparse" require "pathname" -require "pry" options = { code_assets_dir: "code", From 8dcde1f13c3a8d833b0c8cf0dcb155095f21d678 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 24 Aug 2022 14:50:15 -0700 Subject: [PATCH 05/69] Update azure_devops/readme.md Co-authored-by: Luke Engle <99493186+luke-engle@users.noreply.github.com> --- azure_devops/readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/azure_devops/readme.md b/azure_devops/readme.md index 3c75df0..9b64c8f 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -35,6 +35,7 @@ This lab bootstraps a Valet environment using GitHub Codespaces and enables you 1. Create an Azure DevOps personal access token with the following scopes: - To do so, navigate to your organization `https://dev.azure.com/{organization}`. +- Click `User settings` in the top right corner of the screen. - Click `Personal access tokens`. - Select `+ New Token` - Name your token, select the organization where you want to use the token, and then set your token to automatically expire after a set number of days. From 8111e4b22380e42c49582bc250da8fe0663a4e05 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 24 Aug 2022 14:53:28 -0700 Subject: [PATCH 06/69] Update links in readme --- azure_devops/readme.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/azure_devops/readme.md b/azure_devops/readme.md index 9b64c8f..db0a822 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -3,11 +3,7 @@ This lab bootstraps a Valet environment using GitHub Codespaces and enables you to create an Azure DevOps project against which to run the Valet CI/CD migration tool. - [Use this Repo as a template](#repo-template) -- [Prerequisites](#prerequisites) -- [Codespace secrets](#codespace-secrets) -- [Action secrets](#action-secrets) -- [Azure DevOps project creation](#azure-devops-project-creation) -- [Use Valet with a codespace](#use-valet-with-a-codespace) +- [Bootstrap an Azure DevOps organization](#bootstrap-your-azure-devops-organization) - [Labs for Azure DevOps](#labs-for-azure-devops) ## Repo template @@ -30,7 +26,7 @@ This lab bootstraps a Valet environment using GitHub Codespaces and enables you ----- -## Bootstrap your Azure DevOps environment +## Bootstrap your Azure DevOps organization 1. Create an Azure DevOps personal access token with the following scopes: From 3a61e7530dd8217ec368dba8e4076f36269f1796 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Thu, 25 Aug 2022 08:34:40 -0700 Subject: [PATCH 07/69] Apply suggestions from code review Co-authored-by: Begona Guereca --- azure_devops/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure_devops/readme.md b/azure_devops/readme.md index db0a822..3c9505e 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -17,7 +17,7 @@ This lab bootstraps a Valet environment using GitHub Codespaces and enables you - Click the `Code` with button down arrow above repository on the repository's landing page. - Click the `Codespaces` tab - Click `Create codespaces on main` to create the codespace. If you are in another branch then the `main` branch, the codespace will button will have the current branch specified. -- Wait a couple minutes, then verify that the codespace starts up. Once it is fully booted up, the termininal should be present. +- Wait a couple minutes, then verify that the codespace starts up. Once it is fully booted up, the terminal should be present. 2. Verify the [extension](https://github.com/github/gh-valet) to the official GitHub CLI for Valet is installed and working. @@ -74,7 +74,7 @@ Manually installing the [extension](https://github.com/github/gh-valet) to the o - Run this command to install the GitHub Valet extension - `gh extension install github/gh-valet` - Verify the result of the install is: `✓ Installed extension github/gh-valet` -- If you get a similiar error to the following, click the link to authorize the token +- If you get a similar error to the following, click the link to authorize the token ![linktolcickauth](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) - Restart Codespace after clicking the link - Verify the Valet CLI is installed and working by running the `gh valet version` command From 9428b9cebfc8a7ebaf9b16d313fde3ccacc6808d Mon Sep 17 00:00:00 2001 From: j-dunham Date: Tue, 30 Aug 2022 14:21:29 -0400 Subject: [PATCH 08/69] Update valet-forecast-lab.md --- azure_devops/valet-forecast-lab.md | 38 ++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index fd7bb86..423cf0e 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -1,3 +1,37 @@ -# Forecast Azure DevOps to GitHub using Valet forecast command +# Forecast Azure DevOps usage using Valet's forecast command +In this lab we will use the `forecast` command to forecast potential GitHub Actions usage by computing metrics from the historical pipeline data in Azure DevOps. The metrics will be stored on disk in a markdown file and include job metrics for execution time, queue time, and concurrency. We will look at each of these metrics in more depth later in this lab. -### Coming soon +- [Prerequisites](#prerequisites) +- [Prepare for forecast](#prepare-for-forecast) +- [Perform a forecast](#perform-a-forecast) +- [Review forecast report](#review-forecast-report) +- [Forecasting multiple providers](#forecasting-multiple-providers) +- [Next steps](#next-steps) + +## Prerequisites +TBD + +## Prepare for forecast + +## Perform a forecast + +## Review forecast report + +### Metric Definitions +| Name | Description | +| ----- | ----------- | +| Median | The __middle__ value | +| P90 | 90% of the values are less than or equal to | +| Min | The lowest value | +| Max | The highest value | + +### Total Section + + +### Runner Group Sections +- The preceding sections shows the same metrics as the `Total` section, but are broken out into runner groups. A runner group is a logical grouping of one or more runners. + + +## Forecasting multiple providers + +## Next steps From 93de474938533784e6d068b435248ed23e206329 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Tue, 30 Aug 2022 16:11:27 -0400 Subject: [PATCH 09/69] Update valet-forecast-lab.md --- azure_devops/valet-forecast-lab.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index 423cf0e..def9e8d 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -12,11 +12,23 @@ In this lab we will use the `forecast` command to forecast potential GitHub Acti TBD ## Prepare for forecast +Before we can run the forecast we need to answer a few questions so we can construct the correct command. +1) What is the date we want to start forecasting from? __2022-03-02. This should be a date that will give enough data to get a good understanding of the typical usage.__ +2) Where do we want to store the results? __./tmp/forecast_reports. This can be any valid path on the system, but for simplicity it is recommend to use a directory in the root of the codespace workspace.__ + +Using these answers our command becomes: +``` +gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --start-date "2022-03-02" +``` ## Perform a forecast +Instead of using the command generated in the previous step. We will instead use a different one that will `forecast` using data previously generated. + +The reason for this is that it is very likely that the ADO project generated for the Valet labs does not have any pipelines that have ran and probably no runners available. So rather than setting up runners and triggering pipelines we will instead use the `--source-file` option of the `forecast` command. If you would like you can try the command above, it will likely return "no jobs" + ## Review forecast report - +   ### Metric Definitions | Name | Description | | ----- | ----------- | From 5844a4eb5ef9f4460f005f3ef61465251287d2af Mon Sep 17 00:00:00 2001 From: j-dunham Date: Tue, 30 Aug 2022 16:23:22 -0400 Subject: [PATCH 10/69] Create jobs_data.json --- azure_devops/bootstrap/jobs_data.json | 2792 +++++++++++++++++++++++++ 1 file changed, 2792 insertions(+) create mode 100644 azure_devops/bootstrap/jobs_data.json diff --git a/azure_devops/bootstrap/jobs_data.json b/azure_devops/bootstrap/jobs_data.json new file mode 100644 index 0000000..706d173 --- /dev/null +++ b/azure_devops/bootstrap/jobs_data.json @@ -0,0 +1,2792 @@ +[ + { + "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", + "request_id": 4278, + "build_id": 4567, + "build_number": "20220405.1", + "result": "succeeded", + "queue_time": "2022-04-05T17:43:43.73Z", + "start_time": "2022-04-05T17:43:46.2405003Z", + "finish_time": "2022-04-05T17:44:41.4733333Z", + "assign_time": "2022-04-05T17:43:43.98Z", + "definition_id": 220, + "runner_name": "MacBook", + "os_description": "Darwin", + "runner_group": "Default" + }, + { + "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", + "request_id": 4273, + "build_id": 4558, + "build_number": "20220405.2", + "result": "succeeded", + "queue_time": "2022-04-05T00:29:56.47Z", + "start_time": "2022-04-05T00:29:59.3679242Z", + "finish_time": "2022-04-05T00:30:21.0533333Z", + "assign_time": "2022-04-05T00:29:56.6966667Z", + "definition_id": 217, + "runner_name": "MacBook", + "os_description": "Darwin", + "runner_group": "Default" + }, + { + "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", + "request_id": 4272, + "build_id": 4556, + "build_number": "20220405.1", + "result": "succeeded", + "queue_time": "2022-04-05T00:26:22.6266667Z", + "start_time": "2022-04-05T00:26:25.2735844Z", + "finish_time": "2022-04-05T00:26:51.95Z", + "assign_time": "2022-04-05T00:26:22.6733333Z", + "definition_id": 217, + "runner_name": "MacBook", + "os_description": "Darwin", + "runner_group": "Default" + }, + { + "id": "ca395085-040a-526b-2ce8-bdc85f692774", + "request_id": 4954, + "build_id": 5151, + "build_number": "20220819.1", + "result": "failed", + "queue_time": "2022-08-19T16:58:13.8166667Z", + "start_time": "2022-08-19T16:58:25.0096333Z", + "finish_time": "2022-08-19T16:58:47.5866667Z", + "assign_time": "2022-08-19T16:58:14.25Z", + "definition_id": 51, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4953, + "build_id": 5150, + "build_number": "20220811.1", + "result": "succeeded", + "queue_time": "2022-08-11T03:00:36.7433333Z", + "start_time": "2022-08-11T03:00:48.3427295Z", + "finish_time": "2022-08-11T03:01:48.44Z", + "assign_time": "2022-08-11T03:00:36.98Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4952, + "build_id": 5149, + "build_number": "20220810.8", + "result": "succeeded", + "queue_time": "2022-08-10T22:24:17.5133333Z", + "start_time": "2022-08-10T22:28:41.8831876Z", + "finish_time": "2022-08-10T22:31:12.17Z", + "assign_time": "2022-08-10T22:28:28.5333333Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4951, + "build_id": 5145, + "build_number": "20220810.7", + "result": "succeeded", + "queue_time": "2022-08-10T22:24:16.2266667Z", + "start_time": "2022-08-10T22:24:32.7143159Z", + "finish_time": "2022-08-10T22:28:27.7133333Z", + "assign_time": "2022-08-10T22:24:16.2633333Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4950, + "build_id": 5144, + "build_number": "20220810.6", + "result": "failed", + "queue_time": "2022-08-10T22:16:23.8866667Z", + "start_time": "2022-08-10T22:18:53.7076646Z", + "finish_time": "2022-08-10T22:21:10.2933333Z", + "assign_time": "2022-08-10T22:18:36.9166667Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4949, + "build_id": 5143, + "build_number": "20220810.5", + "result": "failed", + "queue_time": "2022-08-10T22:10:05.1666667Z", + "start_time": "2022-08-10T22:15:12.6511213Z", + "finish_time": "2022-08-10T22:18:36.0266667Z", + "assign_time": "2022-08-10T22:14:53.49Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4948, + "build_id": 5139, + "build_number": "20220810.4", + "result": "failed", + "queue_time": "2022-08-10T22:09:36.2133333Z", + "start_time": "2022-08-10T22:11:57.7706354Z", + "finish_time": "2022-08-10T22:14:52.64Z", + "assign_time": "2022-08-10T22:11:41.84Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4947, + "build_id": 5135, + "build_number": "20220810.3", + "result": "failed", + "queue_time": "2022-08-10T22:08:11.87Z", + "start_time": "2022-08-10T22:09:49.6121805Z", + "finish_time": "2022-08-10T22:11:41.2033333Z", + "assign_time": "2022-08-10T22:09:38.72Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4946, + "build_id": 5131, + "build_number": "20220810.2", + "result": "failed", + "queue_time": "2022-08-10T22:07:03.78Z", + "start_time": "2022-08-10T22:07:24.865421Z", + "finish_time": "2022-08-10T22:09:37.6433333Z", + "assign_time": "2022-08-10T22:07:04.03Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4945, + "build_id": 5127, + "build_number": "20220810.1", + "result": "failed", + "queue_time": "2022-08-10T22:05:16.8433333Z", + "start_time": "2022-08-10T22:05:40.1526981Z", + "finish_time": "2022-08-10T22:06:51.0533333Z", + "assign_time": "2022-08-10T22:05:16.9066667Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4944, + "build_id": 5120, + "build_number": "20220810.2", + "result": "failed", + "queue_time": "2022-08-10T20:54:58.1433333Z", + "start_time": "2022-08-10T20:55:56.6551759Z", + "finish_time": "2022-08-10T20:56:27.06Z", + "assign_time": "2022-08-10T20:55:43.2933333Z", + "definition_id": 382, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4943, + "build_id": 5117, + "build_number": "20220810.1", + "result": "failed", + "queue_time": "2022-08-10T20:54:52.31Z", + "start_time": "2022-08-10T20:55:09.3477439Z", + "finish_time": "2022-08-10T20:55:42.0333333Z", + "assign_time": "2022-08-10T20:54:52.3666667Z", + "definition_id": 382, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4942, + "build_id": 5116, + "build_number": "20220809.1", + "result": "succeeded", + "queue_time": "2022-08-09T03:00:27.2066667Z", + "start_time": "2022-08-09T03:00:35.1752479Z", + "finish_time": "2022-08-09T03:01:28.3366667Z", + "assign_time": "2022-08-09T03:00:27.5633333Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4941, + "build_id": 5115, + "build_number": "20220808.1", + "result": "failed", + "queue_time": "2022-08-08T17:56:30.37Z", + "start_time": "2022-08-08T17:56:48.1800943Z", + "finish_time": "2022-08-08T17:57:29.7733333Z", + "assign_time": "2022-08-08T17:56:30.4Z", + "definition_id": 382, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4940, + "build_id": 5112, + "build_number": "5112", + "result": "succeeded", + "queue_time": "2022-08-08T17:51:29.1566667Z", + "start_time": "2022-08-08T17:51:47.1020425Z", + "finish_time": "2022-08-08T17:52:37.01Z", + "assign_time": "2022-08-08T17:51:29.22Z", + "definition_id": 389, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4939, + "build_id": 5111, + "build_number": "20220808.1", + "result": "succeeded", + "queue_time": "2022-08-08T03:00:33.19Z", + "start_time": "2022-08-08T03:00:41.4371308Z", + "finish_time": "2022-08-08T03:01:35.4266667Z", + "assign_time": "2022-08-08T03:00:33.26Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "cfa20e98-6997-523c-4233-f0a7302c929f", + "request_id": 4938, + "build_id": 5110, + "build_number": "5110", + "result": "succeeded", + "queue_time": "2022-07-28T23:37:25.4433333Z", + "start_time": "2022-07-28T23:39:01.1647409Z", + "finish_time": "2022-07-28T23:39:53.2166667Z", + "assign_time": "2022-07-28T23:38:49.5033333Z", + "definition_id": 381, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4937, + "build_id": 5110, + "build_number": "5110", + "result": "succeeded", + "queue_time": "2022-07-28T23:37:25.4233333Z", + "start_time": "2022-07-28T23:37:41.9972446Z", + "finish_time": "2022-07-28T23:38:48.7133333Z", + "assign_time": "2022-07-28T23:37:25.7066667Z", + "definition_id": 381, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4936, + "build_id": 5109, + "build_number": "20220728.1", + "result": "succeeded", + "queue_time": "2022-07-28T03:00:31.0466667Z", + "start_time": "2022-07-28T03:00:39.5725796Z", + "finish_time": "2022-07-28T03:01:28.22Z", + "assign_time": "2022-07-28T03:00:31.12Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4935, + "build_id": 5107, + "build_number": "20220726.1", + "result": "succeeded", + "queue_time": "2022-07-26T03:00:13.81Z", + "start_time": "2022-07-26T03:00:24.9304002Z", + "finish_time": "2022-07-26T03:01:20.47Z", + "assign_time": "2022-07-26T03:00:14.8566667Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "899a9724-4530-558a-15f1-375d2bccc79e", + "request_id": 4934, + "build_id": 5105, + "build_number": "20220725.2", + "result": "succeeded", + "queue_time": "2022-07-25T21:35:31.2933333Z", + "start_time": "2022-07-25T21:35:36.7385249Z", + "finish_time": "2022-07-25T21:36:30.7066667Z", + "assign_time": "2022-07-25T21:35:31.3466667Z", + "definition_id": 378, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "899a9724-4530-558a-15f1-375d2bccc79e", + "request_id": 4933, + "build_id": 5104, + "build_number": "20220725.1", + "result": "succeeded", + "queue_time": "2022-07-25T20:50:01.22Z", + "start_time": "2022-07-25T20:50:07.4147643Z", + "finish_time": "2022-07-25T20:50:54.54Z", + "assign_time": "2022-07-25T20:50:01.46Z", + "definition_id": 378, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4932, + "build_id": 5102, + "build_number": "20220719.1", + "result": "succeeded", + "queue_time": "2022-07-19T03:00:22.2666667Z", + "start_time": "2022-07-19T03:00:31.3918294Z", + "finish_time": "2022-07-19T03:01:29.17Z", + "assign_time": "2022-07-19T03:00:22.3033333Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4931, + "build_id": 5101, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-07-18T18:45:50.1866667Z", + "start_time": "2022-07-18T18:45:56.8851106Z", + "finish_time": "2022-07-18T18:46:10.4233333Z", + "assign_time": "2022-07-18T18:45:50.28Z", + "definition_id": 380, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "96c60851-4ac0-512f-ac8a-daf36b6a2b26", + "request_id": 4930, + "build_id": 5100, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-07-18T18:43:47.0133333Z", + "start_time": "2022-07-18T18:44:44.683617Z", + "finish_time": "2022-07-18T18:44:57.0366667Z", + "assign_time": "2022-07-18T18:44:23.9933333Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ca395085-040a-526b-2ce8-bdc85f692774", + "request_id": 4929, + "build_id": 5100, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-07-18T18:43:46.7466667Z", + "start_time": "2022-07-18T18:44:11.1374529Z", + "finish_time": "2022-07-18T18:44:23.3633333Z", + "assign_time": "2022-07-18T18:44:04.8533333Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "341b3d8e-0d13-57d4-859b-65d31dcbc29e", + "request_id": 4928, + "build_id": 5100, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-07-18T18:43:46.7433333Z", + "start_time": "2022-07-18T18:43:53.5495773Z", + "finish_time": "2022-07-18T18:44:03.7166667Z", + "assign_time": "2022-07-18T18:43:46.7733333Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4927, + "build_id": 5098, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-07-18T18:40:39.23Z", + "start_time": "2022-07-18T18:40:49.010239Z", + "finish_time": "2022-07-18T18:41:32.5133333Z", + "assign_time": "2022-07-18T18:40:39.2966667Z", + "definition_id": 379, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4926, + "build_id": 5097, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-07-18T03:00:20.35Z", + "start_time": "2022-07-18T03:00:29.0772621Z", + "finish_time": "2022-07-18T03:01:16.4033333Z", + "assign_time": "2022-07-18T03:00:20.4166667Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "899a9724-4530-558a-15f1-375d2bccc79e", + "request_id": 4925, + "build_id": 5096, + "build_number": "20220715.1", + "result": "succeeded", + "queue_time": "2022-07-15T15:54:11.64Z", + "start_time": "2022-07-15T15:54:17.2876517Z", + "finish_time": "2022-07-15T15:55:05.1266667Z", + "assign_time": "2022-07-15T15:54:11.7066667Z", + "definition_id": 378, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4924, + "build_id": 5092, + "build_number": "20220715.1", + "result": "succeeded", + "queue_time": "2022-07-15T03:00:19.7933333Z", + "start_time": "2022-07-15T03:00:31.8579246Z", + "finish_time": "2022-07-15T03:01:10.9533333Z", + "assign_time": "2022-07-15T03:00:19.8733333Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "899a9724-4530-558a-15f1-375d2bccc79e", + "request_id": 4923, + "build_id": 5091, + "build_number": "20220714.1", + "result": "succeeded", + "queue_time": "2022-07-14T20:44:28.6066667Z", + "start_time": "2022-07-14T20:44:37.1245218Z", + "finish_time": "2022-07-14T20:45:43.04Z", + "assign_time": "2022-07-14T20:44:28.9166667Z", + "definition_id": 378, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4922, + "build_id": 5090, + "build_number": "20220714.1", + "result": "succeeded", + "queue_time": "2022-07-14T03:00:34.1933333Z", + "start_time": "2022-07-14T03:00:41.5002481Z", + "finish_time": "2022-07-14T03:01:26.43Z", + "assign_time": "2022-07-14T03:00:34.2533333Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4921, + "build_id": 5089, + "build_number": "20220713.1", + "result": "succeeded", + "queue_time": "2022-07-13T20:25:18.7966667Z", + "start_time": "2022-07-13T20:25:28.2135186Z", + "finish_time": "2022-07-13T20:26:16.3533333Z", + "assign_time": "2022-07-13T20:25:18.9966667Z", + "definition_id": 377, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4920, + "build_id": 5084, + "build_number": "20220713.1", + "result": "succeeded", + "queue_time": "2022-07-13T13:46:02.8033333Z", + "start_time": "2022-07-13T13:47:12.5184633Z", + "finish_time": "2022-07-13T13:47:53.0966667Z", + "assign_time": "2022-07-13T13:47:03.9233333Z", + "definition_id": 373, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4919, + "build_id": 5083, + "build_number": "20220713.1", + "result": "failed", + "queue_time": "2022-07-13T13:46:01.12Z", + "start_time": "2022-07-13T13:46:13.2306562Z", + "finish_time": "2022-07-13T13:47:02.71Z", + "assign_time": "2022-07-13T13:46:01.1766667Z", + "definition_id": 372, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4918, + "build_id": 5080, + "build_number": "20220712.1", + "result": "failed", + "queue_time": "2022-07-12T17:06:15.5033333Z", + "start_time": "2022-07-12T17:06:26.1795208Z", + "finish_time": "2022-07-12T17:06:55.86Z", + "assign_time": "2022-07-12T17:06:15.74Z", + "definition_id": 376, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4917, + "build_id": 5079, + "build_number": "20220712.1", + "result": "succeeded", + "queue_time": "2022-07-12T14:48:45.8033333Z", + "start_time": "2022-07-12T14:48:52.8152685Z", + "finish_time": "2022-07-12T14:49:43.0233333Z", + "assign_time": "2022-07-12T14:48:46.3166667Z", + "definition_id": 375, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4916, + "build_id": 5078, + "build_number": "20220712.1", + "result": "succeeded", + "queue_time": "2022-07-12T03:00:11.5033333Z", + "start_time": "2022-07-12T03:00:23.9071603Z", + "finish_time": "2022-07-12T03:01:02.62Z", + "assign_time": "2022-07-12T03:00:11.7666667Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ca395085-040a-526b-2ce8-bdc85f692774", + "request_id": 4915, + "build_id": 5077, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-07-11T22:08:51.9533333Z", + "start_time": "2022-07-11T22:09:03.1483001Z", + "finish_time": "2022-07-11T22:09:24.9666667Z", + "assign_time": "2022-07-11T22:08:52.1566667Z", + "definition_id": 51, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4914, + "build_id": 5076, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-07-11T20:42:40.6Z", + "start_time": "2022-07-11T20:43:19.0923053Z", + "finish_time": "2022-07-11T20:43:30.9233333Z", + "assign_time": "2022-07-11T20:43:11.27Z", + "definition_id": 374, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "96c60851-4ac0-512f-ac8a-daf36b6a2b26", + "request_id": 4913, + "build_id": 5075, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-07-11T20:42:13.6133333Z", + "start_time": "2022-07-11T20:42:59.2918804Z", + "finish_time": "2022-07-11T20:43:10.2133333Z", + "assign_time": "2022-07-11T20:42:51.9266667Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ca395085-040a-526b-2ce8-bdc85f692774", + "request_id": 4912, + "build_id": 5075, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-07-11T20:42:13.5566667Z", + "start_time": "2022-07-11T20:42:39.2587562Z", + "finish_time": "2022-07-11T20:42:50.9533333Z", + "assign_time": "2022-07-11T20:42:30.8066667Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "341b3d8e-0d13-57d4-859b-65d31dcbc29e", + "request_id": 4911, + "build_id": 5075, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-07-11T20:42:13.5466667Z", + "start_time": "2022-07-11T20:42:20.169292Z", + "finish_time": "2022-07-11T20:42:30.1066667Z", + "assign_time": "2022-07-11T20:42:13.5933333Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4910, + "build_id": 5073, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-07-11T20:40:33.65Z", + "start_time": "2022-07-11T20:40:39.6509289Z", + "finish_time": "2022-07-11T20:41:39.77Z", + "assign_time": "2022-07-11T20:40:33.88Z", + "definition_id": 373, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4909, + "build_id": 5072, + "build_number": "20220711.1", + "result": "canceled", + "queue_time": "2022-07-11T15:02:41.43Z", + "start_time": "2022-07-11T15:02:52.8313534Z", + "finish_time": "2022-07-11T15:02:58.06Z", + "assign_time": "2022-07-11T15:02:41.4766667Z", + "definition_id": 372, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4908, + "build_id": 5071, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-07-11T14:58:14.99Z", + "start_time": "2022-07-11T14:58:21.4957133Z", + "finish_time": "2022-07-11T14:58:41.8933333Z", + "assign_time": "2022-07-11T14:58:15.0266667Z", + "definition_id": 371, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4907, + "build_id": 5070, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-07-11T14:31:09.8066667Z", + "start_time": "2022-07-11T14:31:24.8007924Z", + "finish_time": "2022-07-11T14:31:59.3633333Z", + "assign_time": "2022-07-11T14:31:09.8633333Z", + "definition_id": 370, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4906, + "build_id": 5069, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-07-11T14:28:25.6866667Z", + "start_time": "2022-07-11T14:28:32.763647Z", + "finish_time": "2022-07-11T14:28:46.5933333Z", + "assign_time": "2022-07-11T14:28:25.73Z", + "definition_id": 369, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "76ed1102-9071-5354-720f-6f09bbc9f0c0", + "request_id": 4905, + "build_id": 5068, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-07-11T14:24:10.3233333Z", + "start_time": "2022-07-11T14:25:07.2541035Z", + "finish_time": "2022-07-11T14:25:34.6333333Z", + "assign_time": "2022-07-11T14:25:00.7966667Z", + "definition_id": 368, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "00b6a206-eb91-585b-3d14-cf1a4d7b1970", + "request_id": 4904, + "build_id": 5068, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-07-11T14:24:10.15Z", + "start_time": "2022-07-11T14:24:42.1401754Z", + "finish_time": "2022-07-11T14:25:00.07Z", + "assign_time": "2022-07-11T14:24:34.3Z", + "definition_id": 368, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "19c563d8-3dcd-57d1-cd5e-9dd946b0a29b", + "request_id": 4903, + "build_id": 5068, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-07-11T14:24:10.14Z", + "start_time": "2022-07-11T14:24:16.1904439Z", + "finish_time": "2022-07-11T14:24:33.44Z", + "assign_time": "2022-07-11T14:24:10.17Z", + "definition_id": 368, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4902, + "build_id": 5067, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-07-11T14:18:10.19Z", + "start_time": "2022-07-11T14:18:18.3555844Z", + "finish_time": "2022-07-11T14:19:22.6266667Z", + "assign_time": "2022-07-11T14:18:10.3466667Z", + "definition_id": 367, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "6a659b14-a5ad-5ce8-05ff-9105f4d16f55", + "request_id": 4901, + "build_id": 107, + "build_number": "Release-1 / Stage 1", + "result": "succeeded", + "queue_time": "2022-06-30T20:15:02.33Z", + "start_time": "2022-06-30T20:15:43.3995066Z", + "finish_time": "2022-06-30T20:15:51.7133333Z", + "assign_time": "2022-06-30T20:15:32.3933333Z", + "definition_id": 14, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "3b770d45-ae29-59a7-a774-67c6a1476782", + "request_id": 4900, + "build_id": 108, + "build_number": "Release-1 / Stage 2", + "result": "succeeded", + "queue_time": "2022-06-30T20:14:52.4266667Z", + "start_time": "2022-06-30T20:15:10.1184454Z", + "finish_time": "2022-06-30T20:15:31.55Z", + "assign_time": "2022-06-30T20:14:52.7866667Z", + "definition_id": 14, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4899, + "build_id": 5066, + "build_number": "5066", + "result": "succeeded", + "queue_time": "2022-06-30T13:49:34.8366667Z", + "start_time": "2022-06-30T13:49:44.5760594Z", + "finish_time": "2022-06-30T13:52:18.75Z", + "assign_time": "2022-06-30T13:49:35.0133333Z", + "definition_id": 366, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4898, + "build_id": 5065, + "build_number": "5065", + "result": "succeeded", + "queue_time": "2022-06-30T13:20:41.41Z", + "start_time": "2022-06-30T13:20:48.1950176Z", + "finish_time": "2022-06-30T13:24:58.39Z", + "assign_time": "2022-06-30T13:20:41.4533333Z", + "definition_id": 365, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4897, + "build_id": 5064, + "build_number": "5064", + "result": "succeeded", + "queue_time": "2022-06-30T12:35:50.17Z", + "start_time": "2022-06-30T12:35:57.4102501Z", + "finish_time": "2022-06-30T12:39:10.7633333Z", + "assign_time": "2022-06-30T12:35:50.23Z", + "definition_id": 365, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4896, + "build_id": 5063, + "build_number": "20220630.1", + "result": "succeeded", + "queue_time": "2022-06-30T03:00:17.8733333Z", + "start_time": "2022-06-30T03:00:26.8409899Z", + "finish_time": "2022-06-30T03:01:50.0266667Z", + "assign_time": "2022-06-30T03:00:17.91Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4895, + "build_id": 5061, + "build_number": "20220629.2", + "result": "succeeded", + "queue_time": "2022-06-29T19:51:17.76Z", + "start_time": "2022-06-29T19:51:23.9334952Z", + "finish_time": "2022-06-29T19:52:46.86Z", + "assign_time": "2022-06-29T19:51:17.82Z", + "definition_id": 364, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4894, + "build_id": 5058, + "build_number": "20220629.1", + "result": "succeeded", + "queue_time": "2022-06-29T19:41:00.17Z", + "start_time": "2022-06-29T19:41:08.6550627Z", + "finish_time": "2022-06-29T19:44:41.7466667Z", + "assign_time": "2022-06-29T19:41:00.45Z", + "definition_id": 364, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4893, + "build_id": 5054, + "build_number": "20220629.1", + "result": "succeeded", + "queue_time": "2022-06-29T03:00:36.52Z", + "start_time": "2022-06-29T03:00:45.436629Z", + "finish_time": "2022-06-29T03:01:57.1366667Z", + "assign_time": "2022-06-29T03:00:36.56Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", + "request_id": 4892, + "build_id": 5052, + "build_number": "20220628.7", + "result": "succeeded", + "queue_time": "2022-06-28T19:11:13.5933333Z", + "start_time": "2022-06-28T19:11:21.6684563Z", + "finish_time": "2022-06-28T19:12:21.8866667Z", + "assign_time": "2022-06-28T19:11:13.6466667Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", + "request_id": 4891, + "build_id": 5051, + "build_number": "20220628.6", + "result": "succeeded", + "queue_time": "2022-06-28T16:45:46.73Z", + "start_time": "2022-06-28T16:45:56.8715565Z", + "finish_time": "2022-06-28T16:46:56.2666667Z", + "assign_time": "2022-06-28T16:45:46.7633333Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", + "request_id": 4890, + "build_id": 5050, + "build_number": "20220628.5", + "result": "failed", + "queue_time": "2022-06-28T16:42:49.2Z", + "start_time": "2022-06-28T16:42:54.4510649Z", + "finish_time": "2022-06-28T16:43:09.88Z", + "assign_time": "2022-06-28T16:42:49.2266667Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", + "request_id": 4889, + "build_id": 5049, + "build_number": "20220628.4", + "result": "failed", + "queue_time": "2022-06-28T16:38:35.2Z", + "start_time": "2022-06-28T16:38:41.1860027Z", + "finish_time": "2022-06-28T16:38:56.49Z", + "assign_time": "2022-06-28T16:38:35.2633333Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", + "request_id": 4888, + "build_id": 5048, + "build_number": "20220628.3", + "result": "succeeded", + "queue_time": "2022-06-28T16:31:50.58Z", + "start_time": "2022-06-28T16:31:56.974368Z", + "finish_time": "2022-06-28T16:32:57.4933333Z", + "assign_time": "2022-06-28T16:31:50.6066667Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", + "request_id": 4887, + "build_id": 5047, + "build_number": "20220628.2", + "result": "succeeded", + "queue_time": "2022-06-28T16:27:16.41Z", + "start_time": "2022-06-28T16:27:25.7030557Z", + "finish_time": "2022-06-28T16:28:07.04Z", + "assign_time": "2022-06-28T16:27:16.68Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", + "request_id": 4886, + "build_id": 5046, + "build_number": "20220628.1", + "result": "succeeded", + "queue_time": "2022-06-28T16:10:15.1866667Z", + "start_time": "2022-06-28T16:10:22.632602Z", + "finish_time": "2022-06-28T16:11:00.95Z", + "assign_time": "2022-06-28T16:10:15.4566667Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4885, + "build_id": 5045, + "build_number": "20220628.1", + "result": "succeeded", + "queue_time": "2022-06-28T03:00:17.8566667Z", + "start_time": "2022-06-28T03:00:30.6344983Z", + "finish_time": "2022-06-28T03:01:10.2466667Z", + "assign_time": "2022-06-28T03:00:17.8966667Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", + "request_id": 4884, + "build_id": 5043, + "build_number": "20220627.2", + "result": "succeeded", + "queue_time": "2022-06-27T17:47:08.16Z", + "start_time": "2022-06-27T17:47:15.987734Z", + "finish_time": "2022-06-27T17:50:44.12Z", + "assign_time": "2022-06-27T17:47:08.4933333Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ca395085-040a-526b-2ce8-bdc85f692774", + "request_id": 4883, + "build_id": 5042, + "build_number": "20220627.1", + "result": "canceled", + "queue_time": "2022-06-27T17:26:33.07Z", + "start_time": "2022-06-27T17:26:39.6690274Z", + "finish_time": "2022-06-27T17:26:55.87Z", + "assign_time": "2022-06-27T17:26:33.49Z", + "definition_id": 168, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4882, + "build_id": 5035, + "build_number": "20220627.1", + "result": "succeeded", + "queue_time": "2022-06-27T16:21:06.4833333Z", + "start_time": "2022-06-27T16:21:11.8349063Z", + "finish_time": "2022-06-27T16:21:58.5633333Z", + "assign_time": "2022-06-27T16:21:06.54Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4881, + "build_id": 5034, + "build_number": "20220623.1", + "result": "succeeded", + "queue_time": "2022-06-23T03:00:33.8933333Z", + "start_time": "2022-06-23T03:00:45.661288Z", + "finish_time": "2022-06-23T03:01:31.83Z", + "assign_time": "2022-06-23T03:00:34.53Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "a528ef4b-e2e0-565b-271a-65845573d880", + "request_id": 4880, + "build_id": 5033, + "build_number": "20220623.2", + "result": "succeeded", + "queue_time": "2022-06-23T00:37:06.3233333Z", + "start_time": "2022-06-23T00:37:11.8207797Z", + "finish_time": "2022-06-23T00:37:41.7266667Z", + "assign_time": "2022-06-23T00:37:06.38Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ce39968d-2aee-58c0-6354-4429990bc777", + "request_id": 4879, + "build_id": 5033, + "build_number": "20220623.2", + "result": "succeeded", + "queue_time": "2022-06-23T00:36:28.27Z", + "start_time": "2022-06-23T00:36:33.5058903Z", + "finish_time": "2022-06-23T00:37:00.7733333Z", + "assign_time": "2022-06-23T00:36:28.3266667Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7cb24041-3325-5b8a-c38d-87131110a6bf", + "request_id": 4878, + "build_id": 5033, + "build_number": "20220623.2", + "result": "succeeded", + "queue_time": "2022-06-23T00:34:08.6633333Z", + "start_time": "2022-06-23T00:35:54.9845771Z", + "finish_time": "2022-06-23T00:36:22.5Z", + "assign_time": "2022-06-23T00:34:08.6833333Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "5daf491e-fc1d-52d4-3c36-b35e31684732", + "request_id": 4877, + "build_id": 5033, + "build_number": "20220623.2", + "result": "succeeded", + "queue_time": "2022-06-23T00:32:35.8766667Z", + "start_time": "2022-06-23T00:33:28.2471615Z", + "finish_time": "2022-06-23T00:34:06.54Z", + "assign_time": "2022-06-23T00:33:18.14Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2431e782-2f38-5ac4-c2f8-af294f6d514a", + "request_id": 4876, + "build_id": 5033, + "build_number": "20220623.2", + "result": "succeeded", + "queue_time": "2022-06-23T00:31:39.97Z", + "start_time": "2022-06-23T00:32:40.1865253Z", + "finish_time": "2022-06-23T00:33:17.37Z", + "assign_time": "2022-06-23T00:32:33.9833333Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "54beca5a-7b68-5580-ddd0-8aef5b91640f", + "request_id": 4875, + "build_id": 5033, + "build_number": "20220623.2", + "result": "succeeded", + "queue_time": "2022-06-23T00:31:39.6833333Z", + "start_time": "2022-06-23T00:31:47.6971699Z", + "finish_time": "2022-06-23T00:32:33.22Z", + "assign_time": "2022-06-23T00:31:39.7033333Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "a528ef4b-e2e0-565b-271a-65845573d880", + "request_id": 4871, + "build_id": 5032, + "build_number": "20220623.1", + "result": "canceled", + "queue_time": "2022-06-23T00:30:56.79Z", + "start_time": "2022-06-23T00:31:01.9918715Z", + "finish_time": "2022-06-23T00:31:19.5833333Z", + "assign_time": "2022-06-23T00:30:56.8533333Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4870, + "build_id": 5031, + "build_number": "5031", + "result": "succeeded", + "queue_time": "2022-06-22T18:52:57.21Z", + "start_time": "2022-06-22T18:54:41.9650756Z", + "finish_time": "2022-06-22T18:55:41.29Z", + "assign_time": "2022-06-22T18:54:25.0866667Z", + "definition_id": 361, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "cfa20e98-6997-523c-4233-f0a7302c929f", + "request_id": 4869, + "build_id": 5031, + "build_number": "5031", + "result": "succeeded", + "queue_time": "2022-06-22T18:52:57.2Z", + "start_time": "2022-06-22T18:53:14.9752109Z", + "finish_time": "2022-06-22T18:54:24.2033333Z", + "assign_time": "2022-06-22T18:52:57.2233333Z", + "definition_id": 361, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4868, + "build_id": 5029, + "build_number": "5029", + "result": "succeeded", + "queue_time": "2022-06-22T13:01:36.7433333Z", + "start_time": "2022-06-22T13:03:00.7879139Z", + "finish_time": "2022-06-22T13:03:57.8833333Z", + "assign_time": "2022-06-22T13:02:40.4833333Z", + "definition_id": 360, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "cfa20e98-6997-523c-4233-f0a7302c929f", + "request_id": 4867, + "build_id": 5029, + "build_number": "5029", + "result": "succeeded", + "queue_time": "2022-06-22T13:01:36.48Z", + "start_time": "2022-06-22T13:01:51.5040284Z", + "finish_time": "2022-06-22T13:02:39.8466667Z", + "assign_time": "2022-06-22T13:01:36.9533333Z", + "definition_id": 360, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4866, + "build_id": 5028, + "build_number": "20220622.1", + "result": "succeeded", + "queue_time": "2022-06-22T03:00:34.3866667Z", + "start_time": "2022-06-22T03:00:42.8728772Z", + "finish_time": "2022-06-22T03:01:23.4566667Z", + "assign_time": "2022-06-22T03:00:34.5533333Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4865, + "build_id": 5027, + "build_number": "5027", + "result": "succeeded", + "queue_time": "2022-06-21T18:08:56.53Z", + "start_time": "2022-06-21T18:09:05.5510972Z", + "finish_time": "2022-06-21T18:09:53.5Z", + "assign_time": "2022-06-21T18:08:56.7066667Z", + "definition_id": 361, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "5daf491e-fc1d-52d4-3c36-b35e31684732", + "request_id": 4864, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-06-21T17:04:17.85Z", + "start_time": "2022-06-21T17:06:53.9745617Z", + "finish_time": "2022-06-21T17:07:25.3266667Z", + "assign_time": "2022-06-21T17:06:44.67Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ce39968d-2aee-58c0-6354-4429990bc777", + "request_id": 4863, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-06-21T17:03:33.3766667Z", + "start_time": "2022-06-21T17:06:01.1201953Z", + "finish_time": "2022-06-21T17:06:43.8966667Z", + "assign_time": "2022-06-21T17:05:54.9566667Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2431e782-2f38-5ac4-c2f8-af294f6d514a", + "request_id": 4862, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-06-21T17:02:20.06Z", + "start_time": "2022-06-21T17:05:07.8148768Z", + "finish_time": "2022-06-21T17:05:54.32Z", + "assign_time": "2022-06-21T17:05:00.4Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "a528ef4b-e2e0-565b-271a-65845573d880", + "request_id": 4861, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-06-21T17:02:19.9Z", + "start_time": "2022-06-21T17:04:22.8635006Z", + "finish_time": "2022-06-21T17:04:59.4966667Z", + "assign_time": "2022-06-21T17:04:16.2166667Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "54beca5a-7b68-5580-ddd0-8aef5b91640f", + "request_id": 4860, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-06-21T17:02:18.9633333Z", + "start_time": "2022-06-21T17:03:35.4472694Z", + "finish_time": "2022-06-21T17:04:15.2066667Z", + "assign_time": "2022-06-21T17:03:27.2Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7cb24041-3325-5b8a-c38d-87131110a6bf", + "request_id": 4859, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-06-21T17:02:17.9Z", + "start_time": "2022-06-21T17:02:51.4121619Z", + "finish_time": "2022-06-21T17:03:26.3666667Z", + "assign_time": "2022-06-21T17:02:43.3566667Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4858, + "build_id": 5025, + "build_number": "5025", + "result": "succeeded", + "queue_time": "2022-06-21T17:01:39.48Z", + "start_time": "2022-06-21T17:01:52.5755448Z", + "finish_time": "2022-06-21T17:02:42.6633333Z", + "assign_time": "2022-06-21T17:01:39.54Z", + "definition_id": 360, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", + "request_id": 4857, + "build_id": 5024, + "build_number": "20220621.1", + "result": "succeeded", + "queue_time": "2022-06-21T16:59:29.8433333Z", + "start_time": "2022-06-21T17:00:18.7374553Z", + "finish_time": "2022-06-21T17:00:47.1933333Z", + "assign_time": "2022-06-21T17:00:11.0233333Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "a528ef4b-e2e0-565b-271a-65845573d880", + "request_id": 4856, + "build_id": 5024, + "build_number": "20220621.1", + "result": "succeeded", + "queue_time": "2022-06-21T16:58:34.2633333Z", + "start_time": "2022-06-21T16:59:33.2423874Z", + "finish_time": "2022-06-21T17:00:09.8933333Z", + "assign_time": "2022-06-21T16:59:27.85Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ce39968d-2aee-58c0-6354-4429990bc777", + "request_id": 4855, + "build_id": 5024, + "build_number": "20220621.1", + "result": "succeeded", + "queue_time": "2022-06-21T16:58:33.5866667Z", + "start_time": "2022-06-21T16:58:41.9914811Z", + "finish_time": "2022-06-21T16:59:27.19Z", + "assign_time": "2022-06-21T16:58:33.8166667Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4854, + "build_id": 5022, + "build_number": "20220621.1", + "result": "succeeded", + "queue_time": "2022-06-21T14:07:44.98Z", + "start_time": "2022-06-21T14:07:50.4618729Z", + "finish_time": "2022-06-21T14:08:42.87Z", + "assign_time": "2022-06-21T14:07:45.44Z", + "definition_id": 358, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", + "request_id": 4853, + "build_id": 5020, + "build_number": "20220621.1", + "result": "succeeded", + "queue_time": "2022-06-21T13:59:04.4533333Z", + "start_time": "2022-06-21T13:59:09.9661262Z", + "finish_time": "2022-06-21T13:59:55.37Z", + "assign_time": "2022-06-21T13:59:04.6266667Z", + "definition_id": 346, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4852, + "build_id": 5019, + "build_number": "20220621.1", + "result": "succeeded", + "queue_time": "2022-06-21T03:00:13.9766667Z", + "start_time": "2022-06-21T03:00:24.5103773Z", + "finish_time": "2022-06-21T03:00:58.54Z", + "assign_time": "2022-06-21T03:00:14.03Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", + "request_id": 4851, + "build_id": 5018, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T23:10:50.84Z", + "start_time": "2022-06-20T23:11:38.4182663Z", + "finish_time": "2022-06-20T23:12:07.37Z", + "assign_time": "2022-06-20T23:11:33.4133333Z", + "definition_id": 357, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "770cf1cf-842d-514f-a534-0e40b52e5eb9", + "request_id": 4850, + "build_id": 5018, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T23:10:50.38Z", + "start_time": "2022-06-20T23:10:55.3464419Z", + "finish_time": "2022-06-20T23:11:32.6766667Z", + "assign_time": "2022-06-20T23:10:50.4366667Z", + "definition_id": 357, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "96b5718e-8351-56c3-5739-25aca4951cbb", + "request_id": 4849, + "build_id": 5018, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T23:10:05.7Z", + "start_time": "2022-06-20T23:10:13.4700282Z", + "finish_time": "2022-06-20T23:10:47.16Z", + "assign_time": "2022-06-20T23:10:05.87Z", + "definition_id": 357, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4848, + "build_id": 5017, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T23:06:00.4966667Z", + "start_time": "2022-06-20T23:06:06.1751544Z", + "finish_time": "2022-06-20T23:06:49.31Z", + "assign_time": "2022-06-20T23:06:00.55Z", + "definition_id": 356, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "770cf1cf-842d-514f-a534-0e40b52e5eb9", + "request_id": 4847, + "build_id": 5015, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T19:05:17.2066667Z", + "start_time": "2022-06-20T19:06:13.9070851Z", + "finish_time": "2022-06-20T19:07:10.79Z", + "assign_time": "2022-06-20T19:06:07.2133333Z", + "definition_id": 355, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", + "request_id": 4846, + "build_id": 5015, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T19:05:17.1133333Z", + "start_time": "2022-06-20T19:05:24.6210313Z", + "finish_time": "2022-06-20T19:06:06.49Z", + "assign_time": "2022-06-20T19:05:17.1733333Z", + "definition_id": 355, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "96b5718e-8351-56c3-5739-25aca4951cbb", + "request_id": 4845, + "build_id": 5015, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T19:04:26.5766667Z", + "start_time": "2022-06-20T19:04:33.5620123Z", + "finish_time": "2022-06-20T19:05:12.5Z", + "assign_time": "2022-06-20T19:04:26.65Z", + "definition_id": 355, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4844, + "build_id": 5014, + "build_number": "20220620.2", + "result": "succeeded", + "queue_time": "2022-06-20T18:39:11.04Z", + "start_time": "2022-06-20T18:39:16.0902085Z", + "finish_time": "2022-06-20T18:39:56.59Z", + "assign_time": "2022-06-20T18:39:11.09Z", + "definition_id": 354, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4843, + "build_id": 5013, + "build_number": "20220620.1", + "result": "failed", + "queue_time": "2022-06-20T18:35:40.1266667Z", + "start_time": "2022-06-20T18:35:47.4375926Z", + "finish_time": "2022-06-20T18:36:03.63Z", + "assign_time": "2022-06-20T18:35:40.3633333Z", + "definition_id": 354, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "0be8f30d-500c-5dcf-f5e7-65a05ef6a4e4", + "request_id": 4842, + "build_id": 5012, + "build_number": "20220620.2", + "result": "succeeded", + "queue_time": "2022-06-20T12:59:31.3166667Z", + "start_time": "2022-06-20T12:59:38.0453509Z", + "finish_time": "2022-06-20T13:00:27.7666667Z", + "assign_time": "2022-06-20T12:59:31.3733333Z", + "definition_id": 199, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "42265946-a31d-5c06-07b2-26be0eb8ee02", + "request_id": 4841, + "build_id": 5011, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T12:44:22.78Z", + "start_time": "2022-06-20T12:46:13.0374809Z", + "finish_time": "2022-06-20T12:46:49.9066667Z", + "assign_time": "2022-06-20T12:46:06.6433333Z", + "definition_id": 199, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "b8230f92-0c42-5846-82b9-bba6b3268ecc", + "request_id": 4840, + "build_id": 5011, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T12:44:22.3966667Z", + "start_time": "2022-06-20T12:45:29.6872732Z", + "finish_time": "2022-06-20T12:46:06.0333333Z", + "assign_time": "2022-06-20T12:45:23.1Z", + "definition_id": 199, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2e489720-33fb-5f96-f422-9c8575243a35", + "request_id": 4839, + "build_id": 5011, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T12:44:20.8233333Z", + "start_time": "2022-06-20T12:44:29.5241689Z", + "finish_time": "2022-06-20T12:45:22.1866667Z", + "assign_time": "2022-06-20T12:44:21.0033333Z", + "definition_id": 199, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4838, + "build_id": 5010, + "build_number": "20220620.1", + "result": "succeeded", + "queue_time": "2022-06-20T03:00:31.4Z", + "start_time": "2022-06-20T03:00:43.8800831Z", + "finish_time": "2022-06-20T03:01:31.21Z", + "assign_time": "2022-06-20T03:00:31.4266667Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "899a9724-4530-558a-15f1-375d2bccc79e", + "request_id": 4837, + "build_id": 5009, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T20:50:14.3866667Z", + "start_time": "2022-06-17T20:50:20.6370575Z", + "finish_time": "2022-06-17T20:50:58.6533333Z", + "assign_time": "2022-06-17T20:50:14.44Z", + "definition_id": 353, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4836, + "build_id": 5008, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T20:48:16.2566667Z", + "start_time": "2022-06-17T20:48:21.5528335Z", + "finish_time": "2022-06-17T20:48:53.5966667Z", + "assign_time": "2022-06-17T20:48:16.3033333Z", + "definition_id": 352, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2aeb1283-cf0c-566e-9807-aa6a26eaed8f", + "request_id": 4835, + "build_id": 5006, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T20:41:16.99Z", + "start_time": "2022-06-17T20:41:23.6520666Z", + "finish_time": "2022-06-17T20:41:53.8266667Z", + "assign_time": "2022-06-17T20:41:17.16Z", + "definition_id": 351, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4834, + "build_id": 5004, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T15:09:24.34Z", + "start_time": "2022-06-17T15:10:03.3755782Z", + "finish_time": "2022-06-17T15:10:32.15Z", + "assign_time": "2022-06-17T15:09:53.0233333Z", + "definition_id": 350, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "3c427f77-2132-5b78-efd3-e096cea98432", + "request_id": 4833, + "build_id": 5003, + "build_number": "20220617.2", + "result": "succeeded", + "queue_time": "2022-06-17T15:08:43.1066667Z", + "start_time": "2022-06-17T15:09:26.385872Z", + "finish_time": "2022-06-17T15:09:52.18Z", + "assign_time": "2022-06-17T15:09:19.4933333Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7514dec6-ee70-5243-0c9c-3aaf46f53831", + "request_id": 4832, + "build_id": 5003, + "build_number": "20220617.2", + "result": "succeeded", + "queue_time": "2022-06-17T15:08:42.56Z", + "start_time": "2022-06-17T15:08:48.822525Z", + "finish_time": "2022-06-17T15:09:18.5833333Z", + "assign_time": "2022-06-17T15:08:42.5866667Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "1d469f83-4b5f-5d14-182a-3b42ea2058c8", + "request_id": 4831, + "build_id": 5003, + "build_number": "20220617.2", + "result": "succeeded", + "queue_time": "2022-06-17T15:06:54.4933333Z", + "start_time": "2022-06-17T15:08:08.9478893Z", + "finish_time": "2022-06-17T15:08:39.61Z", + "assign_time": "2022-06-17T15:08:03.0266667Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "78e99f79-8fcc-58c3-536b-39d225dff3d3", + "request_id": 4830, + "build_id": 5003, + "build_number": "20220617.2", + "result": "succeeded", + "queue_time": "2022-06-17T15:06:54.09Z", + "start_time": "2022-06-17T15:07:33.088071Z", + "finish_time": "2022-06-17T15:08:02.4133333Z", + "assign_time": "2022-06-17T15:07:27.88Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2a9f993f-cde6-5010-8692-151c7ae6e1ea", + "request_id": 4829, + "build_id": 5003, + "build_number": "20220617.2", + "result": "succeeded", + "queue_time": "2022-06-17T15:06:52.09Z", + "start_time": "2022-06-17T15:06:57.6008412Z", + "finish_time": "2022-06-17T15:07:27.1933333Z", + "assign_time": "2022-06-17T15:06:52.3033333Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ec4b76d4-6def-5166-aee5-1a21dbfc4150", + "request_id": 4828, + "build_id": 5003, + "build_number": "20220617.2", + "result": "succeeded", + "queue_time": "2022-06-17T15:05:17.83Z", + "start_time": "2022-06-17T15:06:10.083399Z", + "finish_time": "2022-06-17T15:06:48.6333333Z", + "assign_time": "2022-06-17T15:06:04.74Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7514dec6-ee70-5243-0c9c-3aaf46f53831", + "request_id": 4827, + "build_id": 5001, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T15:04:44.2133333Z", + "start_time": "2022-06-17T15:05:36.3176632Z", + "finish_time": "2022-06-17T15:06:03.9166667Z", + "assign_time": "2022-06-17T15:05:31.46Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "3c427f77-2132-5b78-efd3-e096cea98432", + "request_id": 4826, + "build_id": 5001, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T15:04:43.9633333Z", + "start_time": "2022-06-17T15:04:51.9109973Z", + "finish_time": "2022-06-17T15:05:30.8233333Z", + "assign_time": "2022-06-17T15:04:43.9966667Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "1d469f83-4b5f-5d14-182a-3b42ea2058c8", + "request_id": 4825, + "build_id": 5001, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T15:03:58.7233333Z", + "start_time": "2022-06-17T15:04:05.9575162Z", + "finish_time": "2022-06-17T15:04:40.59Z", + "assign_time": "2022-06-17T15:03:58.8133333Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "78e99f79-8fcc-58c3-536b-39d225dff3d3", + "request_id": 4824, + "build_id": 5001, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T15:01:28.3Z", + "start_time": "2022-06-17T15:03:18.8393195Z", + "finish_time": "2022-06-17T15:03:55.9166667Z", + "assign_time": "2022-06-17T15:03:08.2766667Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2a9f993f-cde6-5010-8692-151c7ae6e1ea", + "request_id": 4823, + "build_id": 5001, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T15:01:28.12Z", + "start_time": "2022-06-17T15:02:25.0072816Z", + "finish_time": "2022-06-17T15:03:07.66Z", + "assign_time": "2022-06-17T15:02:18.3933333Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", + "request_id": 4822, + "build_id": 5002, + "build_number": "20220617.3", + "result": "succeeded", + "queue_time": "2022-06-17T15:00:33.6566667Z", + "start_time": "2022-06-17T15:01:33.1052395Z", + "finish_time": "2022-06-17T15:02:17.6666667Z", + "assign_time": "2022-06-17T15:01:25.7866667Z", + "definition_id": 348, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ec4b76d4-6def-5166-aee5-1a21dbfc4150", + "request_id": 4821, + "build_id": 5001, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T15:00:31.9166667Z", + "start_time": "2022-06-17T15:00:40.0977348Z", + "finish_time": "2022-06-17T15:01:25.0966667Z", + "assign_time": "2022-06-17T15:00:32.2333333Z", + "definition_id": 210, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4820, + "build_id": 5000, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T03:00:22.39Z", + "start_time": "2022-06-17T03:00:34.2117646Z", + "finish_time": "2022-06-17T03:01:13.27Z", + "assign_time": "2022-06-17T03:00:22.6766667Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", + "request_id": 4819, + "build_id": 4999, + "build_number": "20220617.2", + "result": "succeeded", + "queue_time": "2022-06-17T00:49:29.95Z", + "start_time": "2022-06-17T00:50:10.229734Z", + "finish_time": "2022-06-17T00:50:44.0466667Z", + "assign_time": "2022-06-17T00:50:04.11Z", + "definition_id": 348, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", + "request_id": 4818, + "build_id": 4998, + "build_number": "20220617.1", + "result": "succeeded", + "queue_time": "2022-06-17T00:49:04.0266667Z", + "start_time": "2022-06-17T00:49:14.9728262Z", + "finish_time": "2022-06-17T00:50:02.9933333Z", + "assign_time": "2022-06-17T00:49:04.0533333Z", + "definition_id": 348, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", + "request_id": 4817, + "build_id": 4997, + "build_number": "20220616.1", + "result": "succeeded", + "queue_time": "2022-06-16T20:13:38.3966667Z", + "start_time": "2022-06-16T20:13:47.831322Z", + "finish_time": "2022-06-16T20:14:31.7233333Z", + "assign_time": "2022-06-16T20:13:38.4533333Z", + "definition_id": 346, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "770cf1cf-842d-514f-a534-0e40b52e5eb9", + "request_id": 4816, + "build_id": 4993, + "build_number": "20220616.1", + "result": "succeeded", + "queue_time": "2022-06-16T17:31:28.9366667Z", + "start_time": "2022-06-16T17:31:34.6761637Z", + "finish_time": "2022-06-16T17:32:09.1466667Z", + "assign_time": "2022-06-16T17:31:28.96Z", + "definition_id": 349, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", + "request_id": 4815, + "build_id": 4993, + "build_number": "20220616.1", + "result": "succeeded", + "queue_time": "2022-06-16T17:30:46.1966667Z", + "start_time": "2022-06-16T17:30:51.973212Z", + "finish_time": "2022-06-16T17:31:26.4666667Z", + "assign_time": "2022-06-16T17:30:46.25Z", + "definition_id": 349, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "96b5718e-8351-56c3-5739-25aca4951cbb", + "request_id": 4814, + "build_id": 4993, + "build_number": "20220616.1", + "result": "succeeded", + "queue_time": "2022-06-16T17:29:37.07Z", + "start_time": "2022-06-16T17:29:46.7068551Z", + "finish_time": "2022-06-16T17:30:42.82Z", + "assign_time": "2022-06-16T17:29:37.6266667Z", + "definition_id": 349, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", + "request_id": 4813, + "build_id": 4992, + "build_number": "20220616.4", + "result": "succeeded", + "queue_time": "2022-06-16T16:43:34.51Z", + "start_time": "2022-06-16T16:43:44.2748286Z", + "finish_time": "2022-06-16T16:44:20.6766667Z", + "assign_time": "2022-06-16T16:43:34.5766667Z", + "definition_id": 348, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", + "request_id": 4812, + "build_id": 4991, + "build_number": "20220616.3", + "result": "succeeded", + "queue_time": "2022-06-16T16:41:35.46Z", + "start_time": "2022-06-16T16:42:28.9734587Z", + "finish_time": "2022-06-16T16:43:04.1133333Z", + "assign_time": "2022-06-16T16:42:18.79Z", + "definition_id": 348, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", + "request_id": 4811, + "build_id": 4990, + "build_number": "20220616.2", + "result": "succeeded", + "queue_time": "2022-06-16T16:41:33.01Z", + "start_time": "2022-06-16T16:41:39.1022633Z", + "finish_time": "2022-06-16T16:42:17.6266667Z", + "assign_time": "2022-06-16T16:41:33.0466667Z", + "definition_id": 348, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", + "request_id": 4810, + "build_id": 4989, + "build_number": "20220616.1", + "result": "succeeded", + "queue_time": "2022-06-16T16:38:23.73Z", + "start_time": "2022-06-16T16:38:31.5526794Z", + "finish_time": "2022-06-16T16:39:24.4466667Z", + "assign_time": "2022-06-16T16:38:23.78Z", + "definition_id": 348, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", + "request_id": 4809, + "build_id": 4988, + "build_number": "20220616.1", + "result": "succeeded", + "queue_time": "2022-06-16T13:32:49.8Z", + "start_time": "2022-06-16T13:32:58.4026886Z", + "finish_time": "2022-06-16T13:33:55.92Z", + "assign_time": "2022-06-16T13:32:49.83Z", + "definition_id": 347, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4808, + "build_id": 4987, + "build_number": "20220616.1", + "result": "succeeded", + "queue_time": "2022-06-16T03:00:11.1766667Z", + "start_time": "2022-06-16T03:00:22.5372283Z", + "finish_time": "2022-06-16T03:01:24.5266667Z", + "assign_time": "2022-06-16T03:00:11.2266667Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4807, + "build_id": 4986, + "build_number": "20220615.1", + "result": "succeeded", + "queue_time": "2022-06-15T03:00:33.8166667Z", + "start_time": "2022-06-15T03:00:42.3085777Z", + "finish_time": "2022-06-15T03:01:22.8966667Z", + "assign_time": "2022-06-15T03:00:33.99Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", + "request_id": 4806, + "build_id": 4985, + "build_number": "20220615.5", + "result": "succeeded", + "queue_time": "2022-06-15T01:11:01.9033333Z", + "start_time": "2022-06-15T01:11:08.7368515Z", + "finish_time": "2022-06-15T01:11:40.52Z", + "assign_time": "2022-06-15T01:11:01.9533333Z", + "definition_id": 346, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", + "request_id": 4805, + "build_id": 4984, + "build_number": "20220615.4", + "result": "succeeded", + "queue_time": "2022-06-15T01:09:41.66Z", + "start_time": "2022-06-15T01:09:46.540907Z", + "finish_time": "2022-06-15T01:10:24.7733333Z", + "assign_time": "2022-06-15T01:09:41.7166667Z", + "definition_id": 346, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", + "request_id": 4804, + "build_id": 4983, + "build_number": "20220615.3", + "result": "succeeded", + "queue_time": "2022-06-15T01:07:34.76Z", + "start_time": "2022-06-15T01:07:42.5661407Z", + "finish_time": "2022-06-15T01:08:31.1566667Z", + "assign_time": "2022-06-15T01:07:34.7933333Z", + "definition_id": 346, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", + "request_id": 4803, + "build_id": 4982, + "build_number": "20220615.2", + "result": "succeeded", + "queue_time": "2022-06-15T01:06:08.8633333Z", + "start_time": "2022-06-15T01:06:16.1659728Z", + "finish_time": "2022-06-15T01:06:59.35Z", + "assign_time": "2022-06-15T01:06:08.91Z", + "definition_id": 346, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", + "request_id": 4802, + "build_id": 4981, + "build_number": "20220615.1", + "result": "succeeded", + "queue_time": "2022-06-15T01:03:01.6533333Z", + "start_time": "2022-06-15T01:03:18.0155366Z", + "finish_time": "2022-06-15T01:04:11.4933333Z", + "assign_time": "2022-06-15T01:03:01.7066667Z", + "definition_id": 346, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4801, + "build_id": 4979, + "build_number": "20220614.5", + "result": "succeeded", + "queue_time": "2022-06-14T18:05:06.36Z", + "start_time": "2022-06-14T18:05:12.623661Z", + "finish_time": "2022-06-14T18:05:52.0133333Z", + "assign_time": "2022-06-14T18:05:06.39Z", + "definition_id": 345, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4800, + "build_id": 4978, + "build_number": "20220614.4", + "result": "succeeded", + "queue_time": "2022-06-14T18:03:18.52Z", + "start_time": "2022-06-14T18:03:54.1440633Z", + "finish_time": "2022-06-14T18:04:31.9466667Z", + "assign_time": "2022-06-14T18:03:46.45Z", + "definition_id": 345, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4799, + "build_id": 4977, + "build_number": "20220614.3", + "result": "succeeded", + "queue_time": "2022-06-14T18:01:52.21Z", + "start_time": "2022-06-14T18:01:58.7453879Z", + "finish_time": "2022-06-14T18:03:45.4833333Z", + "assign_time": "2022-06-14T18:01:52.26Z", + "definition_id": 345, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4798, + "build_id": 4976, + "build_number": "20220614.2", + "result": "succeeded", + "queue_time": "2022-06-14T15:28:25.7533333Z", + "start_time": "2022-06-14T15:28:32.6992104Z", + "finish_time": "2022-06-14T15:29:21.45Z", + "assign_time": "2022-06-14T15:28:25.8066667Z", + "definition_id": 345, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4797, + "build_id": 4975, + "build_number": "20220614.1", + "result": "succeeded", + "queue_time": "2022-06-14T12:17:08.95Z", + "start_time": "2022-06-14T12:17:18.8926318Z", + "finish_time": "2022-06-14T12:18:13.7033333Z", + "assign_time": "2022-06-14T12:17:09.0133333Z", + "definition_id": 345, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4796, + "build_id": 4974, + "build_number": "20220614.1", + "result": "succeeded", + "queue_time": "2022-06-14T03:00:34.5066667Z", + "start_time": "2022-06-14T03:00:45.4038234Z", + "finish_time": "2022-06-14T03:01:35.7433333Z", + "assign_time": "2022-06-14T03:00:34.7366667Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", + "request_id": 4795, + "build_id": 4973, + "build_number": "20220613.1", + "result": "succeeded", + "queue_time": "2022-06-13T20:54:28.49Z", + "start_time": "2022-06-13T20:54:33.7837792Z", + "finish_time": "2022-06-13T20:55:03.16Z", + "assign_time": "2022-06-13T20:54:28.5433333Z", + "definition_id": 344, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "96b5718e-8351-56c3-5739-25aca4951cbb", + "request_id": 4794, + "build_id": 4973, + "build_number": "20220613.1", + "result": "succeeded", + "queue_time": "2022-06-13T20:52:47.0566667Z", + "start_time": "2022-06-13T20:53:49.595481Z", + "finish_time": "2022-06-13T20:54:25.71Z", + "assign_time": "2022-06-13T20:53:43.38Z", + "definition_id": 344, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "770cf1cf-842d-514f-a534-0e40b52e5eb9", + "request_id": 4793, + "build_id": 4973, + "build_number": "20220613.1", + "result": "succeeded", + "queue_time": "2022-06-13T20:52:46.5766667Z", + "start_time": "2022-06-13T20:52:53.3206427Z", + "finish_time": "2022-06-13T20:53:42.0866667Z", + "assign_time": "2022-06-13T20:52:47Z", + "definition_id": 344, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4792, + "build_id": 4971, + "build_number": "20220613.2", + "result": "succeeded", + "queue_time": "2022-06-13T19:15:21.3633333Z", + "start_time": "2022-06-13T19:15:26.8391575Z", + "finish_time": "2022-06-13T19:16:32.4766667Z", + "assign_time": "2022-06-13T19:15:21.3933333Z", + "definition_id": 343, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4791, + "build_id": 4970, + "build_number": "20220613.1", + "result": "canceled", + "queue_time": "2022-06-13T14:52:48.89Z", + "start_time": "2022-06-13T14:52:55.6525849Z", + "finish_time": "2022-06-13T14:53:15.6Z", + "assign_time": "2022-06-13T14:52:48.93Z", + "definition_id": 343, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4790, + "build_id": 4969, + "build_number": "20220610.1", + "result": "succeeded", + "queue_time": "2022-06-10T03:00:39.9766667Z", + "start_time": "2022-06-10T03:00:48.1022982Z", + "finish_time": "2022-06-10T03:01:28.16Z", + "assign_time": "2022-06-10T03:00:40.02Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "96b5718e-8351-56c3-5739-25aca4951cbb", + "request_id": 4789, + "build_id": 4968, + "build_number": "20220609.4", + "result": "succeeded", + "queue_time": "2022-06-09T23:15:14.8966667Z", + "start_time": "2022-06-09T23:15:32.1992015Z", + "finish_time": "2022-06-09T23:16:44.14Z", + "assign_time": "2022-06-09T23:15:14.9433333Z", + "definition_id": 342, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "96b5718e-8351-56c3-5739-25aca4951cbb", + "request_id": 4788, + "build_id": 4967, + "build_number": "20220609.3", + "result": "succeeded", + "queue_time": "2022-06-09T23:11:44.77Z", + "start_time": "2022-06-09T23:12:41.7997033Z", + "finish_time": "2022-06-09T23:13:42.6766667Z", + "assign_time": "2022-06-09T23:12:20.54Z", + "definition_id": 342, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "e7cc8934-bff9-5085-a925-135ef9f38bb7", + "request_id": 4787, + "build_id": 4966, + "build_number": "20220609.2", + "result": "succeeded", + "queue_time": "2022-06-09T23:10:55.9133333Z", + "start_time": "2022-06-09T23:11:12.9041217Z", + "finish_time": "2022-06-09T23:12:19.8766667Z", + "assign_time": "2022-06-09T23:10:55.96Z", + "definition_id": 342, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4786, + "build_id": 4964, + "build_number": "20220608.1", + "result": "failed", + "queue_time": "2022-06-08T13:14:29.9966667Z", + "start_time": "2022-06-08T13:14:40.142744Z", + "finish_time": "2022-06-08T13:15:07.98Z", + "assign_time": "2022-06-08T13:14:30.0733333Z", + "definition_id": 341, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4785, + "build_id": 4963, + "build_number": "20220608.1", + "result": "succeeded", + "queue_time": "2022-06-08T03:00:27.1933333Z", + "start_time": "2022-06-08T03:00:37.7326633Z", + "finish_time": "2022-06-08T03:01:23.57Z", + "assign_time": "2022-06-08T03:00:27.3433333Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", + "request_id": 4784, + "build_id": 4962, + "build_number": "20220608.1", + "result": "succeeded", + "queue_time": "2022-06-08T00:05:33.2366667Z", + "start_time": "2022-06-08T00:06:58.6753145Z", + "finish_time": "2022-06-08T00:07:36.6933333Z", + "assign_time": "2022-06-08T00:06:52.6433333Z", + "definition_id": 340, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7f33e5bd-7764-5d8a-ba2e-506e078b9c3f", + "request_id": 4783, + "build_id": 4962, + "build_number": "20220608.1", + "result": "succeeded", + "queue_time": "2022-06-08T00:05:33.1066667Z", + "start_time": "2022-06-08T00:06:20.4867796Z", + "finish_time": "2022-06-08T00:06:51.75Z", + "assign_time": "2022-06-08T00:06:14.52Z", + "definition_id": 340, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "8ae2eb52-5c5e-5cc0-86a8-c8e3a47323bc", + "request_id": 4782, + "build_id": 4961, + "build_number": "20220608.1", + "result": "succeeded", + "queue_time": "2022-06-08T00:05:33.0733333Z", + "start_time": "2022-06-08T00:05:38.4492051Z", + "finish_time": "2022-06-08T00:06:13.44Z", + "assign_time": "2022-06-08T00:05:33.1266667Z", + "definition_id": 325, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "84b38d06-9c04-5368-793c-b23b09eae486", + "request_id": 4781, + "build_id": 4961, + "build_number": "20220608.1", + "result": "succeeded", + "queue_time": "2022-06-08T00:04:38.9433333Z", + "start_time": "2022-06-08T00:04:48.0362066Z", + "finish_time": "2022-06-08T00:05:30.4266667Z", + "assign_time": "2022-06-08T00:04:38.9966667Z", + "definition_id": 325, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4780, + "build_id": 4959, + "build_number": "20220607.1", + "result": "succeeded", + "queue_time": "2022-06-07T23:59:23.0066667Z", + "start_time": "2022-06-07T23:59:28.9296371Z", + "finish_time": "2022-06-08T00:00:11.3666667Z", + "assign_time": "2022-06-07T23:59:23.0533333Z", + "definition_id": 339, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f6a5a278-544f-5c37-fc65-8137ad8b190a", + "request_id": 4779, + "build_id": 4957, + "build_number": "20220607.2", + "result": "succeeded", + "queue_time": "2022-06-07T16:45:15.15Z", + "start_time": "2022-06-07T16:45:24.8864484Z", + "finish_time": "2022-06-07T16:46:14.3466667Z", + "assign_time": "2022-06-07T16:45:15.2266667Z", + "definition_id": 338, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4778, + "build_id": 4956, + "build_number": "20220607.1", + "result": "succeeded", + "queue_time": "2022-06-07T14:08:10.37Z", + "start_time": "2022-06-07T14:08:17.318738Z", + "finish_time": "2022-06-07T14:08:54.2133333Z", + "assign_time": "2022-06-07T14:08:10.59Z", + "definition_id": 338, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4777, + "build_id": 4955, + "build_number": "20220607.1", + "result": "succeeded", + "queue_time": "2022-06-07T03:00:15.6166667Z", + "start_time": "2022-06-07T03:00:25.9756802Z", + "finish_time": "2022-06-07T03:00:58.9866667Z", + "assign_time": "2022-06-07T03:00:15.65Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ee56171e-484e-5be7-66f8-b1e9ffecbd76", + "request_id": 4776, + "build_id": 4954, + "build_number": "20220606.2", + "result": "succeeded", + "queue_time": "2022-06-06T20:48:25.1133333Z", + "start_time": "2022-06-06T20:48:32.5939862Z", + "finish_time": "2022-06-06T20:49:06.02Z", + "assign_time": "2022-06-06T20:48:25.1733333Z", + "definition_id": 337, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "a7354074-cd99-5827-f297-ae1ad048aa7f", + "request_id": 4775, + "build_id": 4954, + "build_number": "20220606.2", + "result": "succeeded", + "queue_time": "2022-06-06T20:47:43.7966667Z", + "start_time": "2022-06-06T20:47:49.9218478Z", + "finish_time": "2022-06-06T20:48:22.8966667Z", + "assign_time": "2022-06-06T20:47:43.8266667Z", + "definition_id": 337, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "a61b6905-783f-5911-c1fc-26d53e150a46", + "request_id": 4774, + "build_id": 4954, + "build_number": "20220606.2", + "result": "succeeded", + "queue_time": "2022-06-06T20:46:57.98Z", + "start_time": "2022-06-06T20:47:03.5047383Z", + "finish_time": "2022-06-06T20:47:41.34Z", + "assign_time": "2022-06-06T20:46:58.0266667Z", + "definition_id": 337, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "84b38d06-9c04-5368-793c-b23b09eae486", + "request_id": 4773, + "build_id": 4954, + "build_number": "20220606.2", + "result": "succeeded", + "queue_time": "2022-06-06T20:46:04.26Z", + "start_time": "2022-06-06T20:46:10.3570751Z", + "finish_time": "2022-06-06T20:46:55.7033333Z", + "assign_time": "2022-06-06T20:46:04.2933333Z", + "definition_id": 337, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4772, + "build_id": 4952, + "build_number": "20220606.1", + "result": "succeeded", + "queue_time": "2022-06-06T20:21:55.8866667Z", + "start_time": "2022-06-06T20:22:01.0872778Z", + "finish_time": "2022-06-06T20:22:42.65Z", + "assign_time": "2022-06-06T20:21:56.0366667Z", + "definition_id": 336, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4771, + "build_id": 4950, + "build_number": "20220606.1", + "result": "succeeded", + "queue_time": "2022-06-06T14:15:27.4933333Z", + "start_time": "2022-06-06T14:15:37.1719797Z", + "finish_time": "2022-06-06T14:16:17.2433333Z", + "assign_time": "2022-06-06T14:15:27.99Z", + "definition_id": 334, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4770, + "build_id": 4948, + "build_number": "20220606.8", + "result": "succeeded", + "queue_time": "2022-06-06T13:18:05.21Z", + "start_time": "2022-06-06T13:18:10.923692Z", + "finish_time": "2022-06-06T13:18:51.6533333Z", + "assign_time": "2022-06-06T13:18:05.2366667Z", + "definition_id": 333, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4769, + "build_id": 4947, + "build_number": "20220606.7", + "result": "succeeded", + "queue_time": "2022-06-06T13:02:06.3566667Z", + "start_time": "2022-06-06T13:02:12.72664Z", + "finish_time": "2022-06-06T13:02:39.5933333Z", + "assign_time": "2022-06-06T13:02:06.39Z", + "definition_id": 333, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + } +] From 748a79ca0bc1347496442129957e95207cbdb022 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Tue, 30 Aug 2022 16:26:41 -0400 Subject: [PATCH 11/69] Rename azure_devops/bootstrap/jobs_data.json to azure_devops/jobs_data.json --- azure_devops/{bootstrap => }/jobs_data.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename azure_devops/{bootstrap => }/jobs_data.json (100%) diff --git a/azure_devops/bootstrap/jobs_data.json b/azure_devops/jobs_data.json similarity index 100% rename from azure_devops/bootstrap/jobs_data.json rename to azure_devops/jobs_data.json From 93727f665dddce4cff9783146a99aec6d723d6e1 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 09:52:36 -0400 Subject: [PATCH 12/69] Update valet-forecast-lab.md --- azure_devops/valet-forecast-lab.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index def9e8d..c463bc1 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -15,17 +15,22 @@ TBD Before we can run the forecast we need to answer a few questions so we can construct the correct command. 1) What is the date we want to start forecasting from? __2022-03-02. This should be a date that will give enough data to get a good understanding of the typical usage.__ 2) Where do we want to store the results? __./tmp/forecast_reports. This can be any valid path on the system, but for simplicity it is recommend to use a directory in the root of the codespace workspace.__ +3) What project do we want to run the forecast for? __ValetBootStrap. This is the default project name for the labs, if you choose a different name then use that instead.__ Using these answers our command becomes: ``` -gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --start-date "2022-03-02" +gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devops-project YOUR_PROJECT_NAME_HERE --start-date "2022-03-02" ``` ## Perform a forecast -Instead of using the command generated in the previous step. We will instead use a different one that will `forecast` using data previously generated. - -The reason for this is that it is very likely that the ADO project generated for the Valet labs does not have any pipelines that have ran and probably no runners available. So rather than setting up runners and triggering pipelines we will instead use the `--source-file` option of the `forecast` command. If you would like you can try the command above, it will likely return "no jobs" - +- Run the command generated in the previous step in the terminal. +- It will likely return "No Jobs" because we have no pipelines that ran during the timeframe we picked. Actually our demo project has never had any pipelines run so any date we pick will return no jobs. +![no-jobs](https://user-images.githubusercontent.com/18723510/187690315-6312088d-9888-4c55-9bbf-c6f2687fa547.png) +- lets use the `--source-file` option of the forecast command to generate a report that we can review. This option is normally used to create reports using data from multiple CI/CD providers, but in this case we can use it to create a report from sample Azure DevOps data. We can view the `forecast` command options by using the help flag `gh valet forecast --help` +![help-menu](https://user-images.githubusercontent.com/18723510/187692843-623d4bdc-8970-4348-a632-73c8b00a40f8.png) +- Run `gh valet forecast azure-devops -o ./tmp/sample_report --source-file-path azure_devops/jobs_data.json` +- A report should be generated from the sample data! +![sample-report](https://user-images.githubusercontent.com/18723510/187694590-9121b997-0c89-4984-bbf2-84f3df2ed882.png) ## Review forecast report   From 4def1e04ee652e542cc2880863a321e9d3304920 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 10:34:44 -0400 Subject: [PATCH 13/69] Update valet-forecast-lab.md --- azure_devops/valet-forecast-lab.md | 132 ++++++++++++++++++++++++++++- 1 file changed, 131 insertions(+), 1 deletion(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index c463bc1..e9dcc8b 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -33,7 +33,110 @@ gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devop ![sample-report](https://user-images.githubusercontent.com/18723510/187694590-9121b997-0c89-4984-bbf2-84f3df2ed882.png) ## Review forecast report -   +Open the forecast report and review the calculated metrics. +- From the codespace explorer pane find `./tmp/sample_report/forecast_report.md` and right-click, and select __Open Preview__. +![explorer-report](https://user-images.githubusercontent.com/18723510/187696893-6d503d8d-b512-427a-af42-bbf053fa4df4.png) +- The file should be similar to this. +
+ example forecast_report.md + + # Forecast report for [Azure DevOps](https://dev.azure.com/jd-testing-org/ValetBootstrap/_build) + + - Valet version: **0.1.0.13529(efcc91120eaf5ecb40df6af034c64580cbcfd2e8)** + - Performed at: **8/31/22 at 13:46** + - Date range: **4/5/22 - 8/19/22** + + ## Total + + - Job count: **186** + - Pipeline count: **60** + + - Execution time + + - Total: **153 minutes** + - Median: **0 minutes** + - P90: **1 minutes** + - Min: **0 minutes** + - Max: **4 minutes** + + - Queue time + + - Median: **0 minutes** + - P90: **1 minutes** + - Min: **0 minutes** + - Max: **5 minutes** + + - Concurrent jobs + + - Median: **0** + - P90: **0** + - Min: **0** + - Max: **4** + + --- + + ## Azure Pipelines + + - Job count: **183** + - Pipeline count: **58** + - Total consumption: **99%** + + - Execution time + + - Total: **151 minutes** + - Median: **0 minutes** + - P90: **1 minutes** + - Min: **0 minutes** + - Max: **4 minutes** + + - Queue time + + - Median: **0 minutes** + - P90: **1 minutes** + - Min: **0 minutes** + - Max: **5 minutes** + + - Concurrent jobs + + - Median: **0** + - P90: **0** + - Min: **0** + - Max: **4** + + --- + + ## Default + + - Job count: **3** + - Pipeline count: **2** + - Total consumption: **1%** + + - Execution time + + - Total: **1 minutes** + - Median: **0 minutes** + - P90: **0 minutes** + - Min: **0 minutes** + - Max: **0 minutes** + + - Queue time + + - Median: **0 minutes** + - P90: **0 minutes** + - Min: **0 minutes** + - Max: **0 minutes** + + - Concurrent jobs + + - Median: **0** + - P90: **0** + - Min: **0** + - Max: **1** + + > Note: Concurrent jobs are calculated by using a sliding window of 1m 0s. + +
+ ### Metric Definitions | Name | Description | | ----- | ----------- | @@ -43,7 +146,34 @@ gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devop | Max | The highest value | ### Total Section +- This section shows the metrics for all of the jobs run in our sample data. + ## Total + - Job count: **186** + - Pipeline count: **60** + --- + We can see there were 60 pipelines that ran and they contained 186 jobs. The number of jobs is expected to be equal or larger than pipelines because a pipeline is typically a collection of jobs. + +- `Execution time` shows the metrics for the time a job __took to run__. Looking closer we can see during our forecast timeframe the total job run time was 153 minutes, with 90% of the jobs finishing under 1 minute, and the longest job taking 4 minutes. The `Min` and `Median` are 0 because they were less than a minute and was rounded down to 0. + - Execution time + - Total: **153 minutes** + - Median: **0 minutes** + - P90: **1 minutes** + - Min: **0 minutes** + - Max: **4 minutes** + +- `Queue time` shows the metrics for how long jobs __waited__ for a runner to be available. + - Queue time + - Median: **0 minutes** + - P90: **1 minutes** + - Min: **0 minutes** + - Max: **5 minutes** +- `Concurrent jobs` show the metrics for how many jobs were run at the __same time__. + - Concurrent jobs + - Median: **0** + - P90: **0** + - Min: **0** + - Max: **4** ### Runner Group Sections - The preceding sections shows the same metrics as the `Total` section, but are broken out into runner groups. A runner group is a logical grouping of one or more runners. From 508116662f5d59408f479bb5742434913435d020 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 10:39:14 -0400 Subject: [PATCH 14/69] Update valet-forecast-lab.md --- azure_devops/valet-forecast-lab.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index e9dcc8b..4220e24 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -9,7 +9,8 @@ In this lab we will use the `forecast` command to forecast potential GitHub Acti - [Next steps](#next-steps) ## Prerequisites -TBD +1. Follow all steps [here](../azure_devops#readme) to set up your environment +2. Create or start a codespace in this repository (if not started) ## Prepare for forecast Before we can run the forecast we need to answer a few questions so we can construct the correct command. From c561fbd9daa3dbbb6ab2c7ff3bd4478a893c80d3 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 10:48:59 -0400 Subject: [PATCH 15/69] Update valet-forecast-lab.md --- azure_devops/valet-forecast-lab.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index 4220e24..c969f76 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -5,7 +5,6 @@ In this lab we will use the `forecast` command to forecast potential GitHub Acti - [Prepare for forecast](#prepare-for-forecast) - [Perform a forecast](#perform-a-forecast) - [Review forecast report](#review-forecast-report) -- [Forecasting multiple providers](#forecasting-multiple-providers) - [Next steps](#next-steps) ## Prerequisites @@ -177,9 +176,7 @@ Open the forecast report and review the calculated metrics. - Max: **4** ### Runner Group Sections -- The preceding sections shows the same metrics as the `Total` section, but are broken out into runner groups. A runner group is a logical grouping of one or more runners. - - -## Forecasting multiple providers +- The preceding sections shows the same metrics as the `Total` section, but are broken out into runner groups. A runner group is a logical grouping of one or more runners. In our case we have `Azure Pipelines` and `Default`. These sections can be used to identify runner types that needed to be increased or decreased when moving to GitHub Actions. Looking at the report the `Default` group was only used for 3 jobs and a ran for a total of 1 minute. This might be a group of runners we do not need to migrate to Actions. ## Next steps +This concludes the Valet labs for Azure Devops, if you are interested exploring the power of Valet more. You can leverage the lab setup and modify and add new pipelines that more closely match your needs and try out the commands again! From 04ffb2d6eec2e9408b7921ec0e77b3e55076cdb2 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 13:25:39 -0400 Subject: [PATCH 16/69] Update valet-forecast-lab.md --- azure_devops/valet-forecast-lab.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index c969f76..7a20d02 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -15,7 +15,7 @@ In this lab we will use the `forecast` command to forecast potential GitHub Acti Before we can run the forecast we need to answer a few questions so we can construct the correct command. 1) What is the date we want to start forecasting from? __2022-03-02. This should be a date that will give enough data to get a good understanding of the typical usage.__ 2) Where do we want to store the results? __./tmp/forecast_reports. This can be any valid path on the system, but for simplicity it is recommend to use a directory in the root of the codespace workspace.__ -3) What project do we want to run the forecast for? __ValetBootStrap. This is the default project name for the labs, if you choose a different name then use that instead.__ +3) What project do we want to run the forecast for? __ValetBootStrap. This is the default project name for the labs, if you choose a different name when setting up the lab environment you should use that.__ Using these answers our command becomes: ``` @@ -24,11 +24,14 @@ gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devop ## Perform a forecast - Run the command generated in the previous step in the terminal. -- It will likely return "No Jobs" because we have no pipelines that ran during the timeframe we picked. Actually our demo project has never had any pipelines run so any date we pick will return no jobs. +- You should get "No jobs found" because we have no pipelines that ran during the timeframe we picked. Actually, our demo project has never had any pipelines run so any date we pick will return no jobs. ![no-jobs](https://user-images.githubusercontent.com/18723510/187690315-6312088d-9888-4c55-9bbf-c6f2687fa547.png) -- lets use the `--source-file` option of the forecast command to generate a report that we can review. This option is normally used to create reports using data from multiple CI/CD providers, but in this case we can use it to create a report from sample Azure DevOps data. We can view the `forecast` command options by using the help flag `gh valet forecast --help` +- lets use the `--source-file` option of the forecast command to generate a report that we can review. This option is normally used to create reports using data from multiple CI/CD providers, but in this case we can use it to create a report from sample Azure DevOps data. We can view the `forecast` command options by using the help flag `gh valet forecast --help`. ![help-menu](https://user-images.githubusercontent.com/18723510/187692843-623d4bdc-8970-4348-a632-73c8b00a40f8.png) -- Run `gh valet forecast azure-devops -o ./tmp/sample_report --source-file-path azure_devops/jobs_data.json` +- Run the `forecast` command using the sample data. + ``` + gh valet forecast azure-devops -o ./tmp/sample_report --source-file-path azure_devops/jobs_data.json + ``` - A report should be generated from the sample data! ![sample-report](https://user-images.githubusercontent.com/18723510/187694590-9121b997-0c89-4984-bbf2-84f3df2ed882.png) @@ -141,7 +144,7 @@ Open the forecast report and review the calculated metrics. | Name | Description | | ----- | ----------- | | Median | The __middle__ value | -| P90 | 90% of the values are less than or equal to | +| P90 | 90% of the values are less than or equal to this | | Min | The lowest value | | Max | The highest value | @@ -154,7 +157,7 @@ Open the forecast report and review the calculated metrics. --- We can see there were 60 pipelines that ran and they contained 186 jobs. The number of jobs is expected to be equal or larger than pipelines because a pipeline is typically a collection of jobs. -- `Execution time` shows the metrics for the time a job __took to run__. Looking closer we can see during our forecast timeframe the total job run time was 153 minutes, with 90% of the jobs finishing under 1 minute, and the longest job taking 4 minutes. The `Min` and `Median` are 0 because they were less than a minute and was rounded down to 0. +- `Execution time` shows the metrics for the time a job __took to run__. Looking closer we can see during our forecast timeframe the total job run time was 153 minutes, with 90% of the jobs finishing in or under 1 minute, and the longest job taking 4 minutes. The `Min` and `Median` are 0 because they were less than a minute and were rounded down to 0. - Execution time - Total: **153 minutes** - Median: **0 minutes** @@ -176,7 +179,7 @@ Open the forecast report and review the calculated metrics. - Max: **4** ### Runner Group Sections -- The preceding sections shows the same metrics as the `Total` section, but are broken out into runner groups. A runner group is a logical grouping of one or more runners. In our case we have `Azure Pipelines` and `Default`. These sections can be used to identify runner types that needed to be increased or decreased when moving to GitHub Actions. Looking at the report the `Default` group was only used for 3 jobs and a ran for a total of 1 minute. This might be a group of runners we do not need to migrate to Actions. +- The preceding sections shows the same metrics as the `Total` section, but are broken out into runner groups. A runner group is a logical grouping in Azure DevOps of one or more runners. In our case we have groups named `Azure Pipelines` and `Default`. These sections can be used to identify runner types that needed to be increased or decreased when moving to GitHub Actions. Looking at the report the `Default` group was only used for 3 jobs and a ran for a total of 1 minute. This might be a group of runners we do not need to migrate to Actions. ## Next steps -This concludes the Valet labs for Azure Devops, if you are interested exploring the power of Valet more. You can leverage the lab setup and modify and add new pipelines that more closely match your needs and try out the commands again! +This concludes the Valet labs for Azure Devops, if you are interested exploring the power of Valet more. You can leverage the lab environment and modify and add new pipelines that more closely match your needs and try out the commands again! From b868afa5a107b91e0a1097b2b7c907472718a05c Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 14:07:01 -0400 Subject: [PATCH 17/69] Update azure_devops/valet-forecast-lab.md Co-authored-by: Liam Neville --- azure_devops/valet-forecast-lab.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index 7a20d02..a079465 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -1,5 +1,5 @@ # Forecast Azure DevOps usage using Valet's forecast command -In this lab we will use the `forecast` command to forecast potential GitHub Actions usage by computing metrics from the historical pipeline data in Azure DevOps. The metrics will be stored on disk in a markdown file and include job metrics for execution time, queue time, and concurrency. We will look at each of these metrics in more depth later in this lab. +In this lab we will use the `forecast` command to forecast potential GitHub Actions usage by computing metrics from the historical pipeline data in Azure DevOps. The metrics will be stored on disk in a markdown file and include job metrics for execution time, queue time, and concurrency. We will look at each of these metrics in more depth later in this lab. - [Prerequisites](#prerequisites) - [Prepare for forecast](#prepare-for-forecast) From 0cde23eb45fe9ef34e40c7106b8b31985b159787 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 14:07:15 -0400 Subject: [PATCH 18/69] Update azure_devops/valet-forecast-lab.md Co-authored-by: Liam Neville --- azure_devops/valet-forecast-lab.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index a079465..dbccbe1 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -15,7 +15,7 @@ In this lab we will use the `forecast` command to forecast potential GitHub Acti Before we can run the forecast we need to answer a few questions so we can construct the correct command. 1) What is the date we want to start forecasting from? __2022-03-02. This should be a date that will give enough data to get a good understanding of the typical usage.__ 2) Where do we want to store the results? __./tmp/forecast_reports. This can be any valid path on the system, but for simplicity it is recommend to use a directory in the root of the codespace workspace.__ -3) What project do we want to run the forecast for? __ValetBootStrap. This is the default project name for the labs, if you choose a different name when setting up the lab environment you should use that.__ +3) What project do we want to run the forecast for? __ValetBootStrap. This is the default project name for the labs, if you choose a different name when setting up the lab environment you should use that.__ Using these answers our command becomes: ``` From 2479024aeef2c0d99dd48bf1074679bd085b522f Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 14:12:50 -0400 Subject: [PATCH 19/69] Update azure_devops/valet-forecast-lab.md Co-authored-by: Liam Neville --- azure_devops/valet-forecast-lab.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index dbccbe1..1749d12 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -40,7 +40,7 @@ Open the forecast report and review the calculated metrics. - From the codespace explorer pane find `./tmp/sample_report/forecast_report.md` and right-click, and select __Open Preview__. ![explorer-report](https://user-images.githubusercontent.com/18723510/187696893-6d503d8d-b512-427a-af42-bbf053fa4df4.png) - The file should be similar to this. -
+
example forecast_report.md # Forecast report for [Azure DevOps](https://dev.azure.com/jd-testing-org/ValetBootstrap/_build) From 8bbe3ba8debc27e11d91980c53d4f37af9ec3452 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 14:21:22 -0400 Subject: [PATCH 20/69] Update valet-forecast-lab.md --- azure_devops/valet-forecast-lab.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index 1749d12..8c1b39f 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -38,7 +38,9 @@ gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devop ## Review forecast report Open the forecast report and review the calculated metrics. - From the codespace explorer pane find `./tmp/sample_report/forecast_report.md` and right-click, and select __Open Preview__. -![explorer-report](https://user-images.githubusercontent.com/18723510/187696893-6d503d8d-b512-427a-af42-bbf053fa4df4.png) + + ![explorer-report](https://user-images.githubusercontent.com/18723510/187696893-6d503d8d-b512-427a-af42-bbf053fa4df4.png) + - The file should be similar to this.
example forecast_report.md @@ -171,7 +173,7 @@ Open the forecast report and review the calculated metrics. - P90: **1 minutes** - Min: **0 minutes** - Max: **5 minutes** -- `Concurrent jobs` show the metrics for how many jobs were run at the __same time__. +- `Concurrent jobs` show the metrics for how many jobs started or ended within the same 60 second time slice. The time slice window can be changed using the `--time-slice` option. - Concurrent jobs - Median: **0** - P90: **0** From 125116be68dfdefc71cc7a0e52c7d00c47a93163 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 15:23:57 -0400 Subject: [PATCH 21/69] Update azure_devops/valet-forecast-lab.md Co-authored-by: Ethan Dennis --- azure_devops/valet-forecast-lab.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index 8c1b39f..276911c 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -12,10 +12,19 @@ In this lab we will use the `forecast` command to forecast potential GitHub Acti 2. Create or start a codespace in this repository (if not started) ## Prepare for forecast -Before we can run the forecast we need to answer a few questions so we can construct the correct command. -1) What is the date we want to start forecasting from? __2022-03-02. This should be a date that will give enough data to get a good understanding of the typical usage.__ -2) Where do we want to store the results? __./tmp/forecast_reports. This can be any valid path on the system, but for simplicity it is recommend to use a directory in the root of the codespace workspace.__ -3) What project do we want to run the forecast for? __ValetBootStrap. This is the default project name for the labs, if you choose a different name when setting up the lab environment you should use that.__ +Before we can run the forecast we need to answer a few questions so we can construct the correct command: + +1. What is the date we want to start forecasting from? + +- __2022-03-02__. This should be a date that will give enough data to get a good understanding of the typical usage. + +2. Where do we want to store the results? + +- __./tmp/forecast_reports__. This can be any valid path on the system but for simplicity it is recommend to use a directory in the root of the Codespace workspace. + +3. What project do we want to run the forecast for? + +- __ValetBootstrap__. This is the default project name for the labs, however, if you chose a different name when setting up the lab environment you should use that. Using these answers our command becomes: ``` From 8377f848f1482c612e805e1f5bb75d4edef84857 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 16:00:28 -0400 Subject: [PATCH 22/69] Update valet-configure-lab.md --- azure_devops/valet-configure-lab.md | 51 +++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/azure_devops/valet-configure-lab.md b/azure_devops/valet-configure-lab.md index e69de29..9c5ef4e 100644 --- a/azure_devops/valet-configure-lab.md +++ b/azure_devops/valet-configure-lab.md @@ -0,0 +1,51 @@ +# Configure Valet to work with GitLab +In this lab, you will use the Valet `configure` command to set up the required information to communicate with the Azure DevOps and GitHub instances. The `configure` command can be used for all of the supported providers, in this lab we will be focusing on Azure DevOps. +- [Prerequisites](#prerequisites) +- [Configuring Valet](#configuring-valet) +- [Verify Valet Works](#verify-valet-works) +- [Next Lab](#next-lab) + +## Prerequisites +1. Followed [steps](../azure_devops#readme) to set up your codespace environment. + +## Configuring Valet +1. Create a GitHub personal access token (PAT). + - Navigate to your GitHub `Settings` - click your profile photo and then click `Settings`. + - Go to `Developer Settings` + - Go to `Personal Access Tokens` -> `Legacy tokens (if present)` + - Click `Generate new token` -> `Legacy tokens (if present)`. If required, provide your password. + - Select at least these scopes: `read packages` and `workflow`. Optionally, provide a text in the **Note** field and change the expiration. + - Click `Generate token` + - Copy the token somewhere safe and temporary. +2. Skip this step if you still have the Azure DevOp personal access token created during step 1 in the lab setup [steps](../azure_devops#bootstrap-your-azure-devops-organization), if not create another and save to a temporary location. +3. Run Valet configure command. + - In the codespace terminal run `gh valet configure` + - Use the down arrow key to highlight `Azure DevOps`, press the spacebar to select, then hit enter to accept. + - At the prompt enter your GitHub Username and press enter. + - At the GitHub Container Registry prompt enter the GitHub PAT generated in step 1 and press enter + - At the GitHub PAT prompt enter the GitHub PAT generated in step 1 and press enter. + - At the GitHub url prompt enter the GitHub instance url or hit enter to accept the default, if you are using github.com then the default is the right choice. + - At the Azure DevOps token prompt enter the access token from step 2. + - At the Azure DevOps url prompt enter your Azure DevOps url or hit enter to accept the default. + - At the prompt enter your Azure Devops organization name. + - At the prompt enter your Azure Devops project name. +4. If all went well you should see a similar output in your terminal and a new file (.env.local) should have been created in the root of the project. + ADD_SCREEN_SHOT + +## Verify Valet Works +To verify Valet works we are going to run a `update`, `version` and `dry-run` command. We will go further into details about the `dry-run` command in a later lab, but for now we want to get the latest version of Valet and confirm that Valet can perform a dry-run with no errors. + +1. In the codespace terminal update Valet by running `gh valet update` +2. In the terminal you should see a confirmation that it logged into the GitHub Container Registry and pulled the latest version. +3. To verify Valet is updated and installed correctly run `gh valet version` and confirm the command outputs a similar response + ADD_SCREEN_SHOT +4. Next, lets run the dry-run command in the codespaces terminal, to verify we can talk to Azure DevOps + ``` + gh valet dry-run azure-devops pipeline -o tmp/configure_test --pipeline-id 1 + ``` +5. In the terminal you should see the command was successful, if not it is a good time to practice the configure command again and make sure the access tokens values are correct and generated with the correct permissions. + ADD_SCREEN_SHOT + +### Next Lab +[Audit Azure DevOps using the Valet audit command](../azure_devops/valet-audit-lab.md) + From 3af4a36eaba357a2f842854eb0d7f30f7fc24258 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 16:16:09 -0400 Subject: [PATCH 23/69] Update valet-configure-lab.md --- azure_devops/valet-configure-lab.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/azure_devops/valet-configure-lab.md b/azure_devops/valet-configure-lab.md index 9c5ef4e..80fb97d 100644 --- a/azure_devops/valet-configure-lab.md +++ b/azure_devops/valet-configure-lab.md @@ -30,7 +30,9 @@ In this lab, you will use the Valet `configure` command to set up the required i - At the prompt enter your Azure Devops organization name. - At the prompt enter your Azure Devops project name. 4. If all went well you should see a similar output in your terminal and a new file (.env.local) should have been created in the root of the project. - ADD_SCREEN_SHOT + + ![configure-result](https://user-images.githubusercontent.com/18723510/187771230-27c97889-d98a-48f7-af01-c1a9f8df6423.png) + ## Verify Valet Works To verify Valet works we are going to run a `update`, `version` and `dry-run` command. We will go further into details about the `dry-run` command in a later lab, but for now we want to get the latest version of Valet and confirm that Valet can perform a dry-run with no errors. @@ -38,13 +40,17 @@ To verify Valet works we are going to run a `update`, `version` and `dry-run` co 1. In the codespace terminal update Valet by running `gh valet update` 2. In the terminal you should see a confirmation that it logged into the GitHub Container Registry and pulled the latest version. 3. To verify Valet is updated and installed correctly run `gh valet version` and confirm the command outputs a similar response - ADD_SCREEN_SHOT + + ![valet-version](https://user-images.githubusercontent.com/18723510/187771571-83c0ede3-0b5d-49d5-9cf8-9ff2774ef114.png) + 4. Next, lets run the dry-run command in the codespaces terminal, to verify we can talk to Azure DevOps ``` - gh valet dry-run azure-devops pipeline -o tmp/configure_test --pipeline-id 1 + gh valet dry-run azure-devops pipeline -o tmp/configure_test --pipeline-id 7 ``` 5. In the terminal you should see the command was successful, if not it is a good time to practice the configure command again and make sure the access tokens values are correct and generated with the correct permissions. - ADD_SCREEN_SHOT + + ![dry-run](https://user-images.githubusercontent.com/18723510/187773568-5b4ef731-958f-4e5a-8f50-ea4e8a9e75d4.png) + ### Next Lab [Audit Azure DevOps using the Valet audit command](../azure_devops/valet-audit-lab.md) From 279abafd518c8c621e755c7278ea74b957c6f087 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Wed, 31 Aug 2022 16:20:27 -0400 Subject: [PATCH 24/69] Update valet-configure-lab.md --- azure_devops/valet-configure-lab.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/valet-configure-lab.md b/azure_devops/valet-configure-lab.md index 80fb97d..a5f6837 100644 --- a/azure_devops/valet-configure-lab.md +++ b/azure_devops/valet-configure-lab.md @@ -14,7 +14,7 @@ In this lab, you will use the Valet `configure` command to set up the required i - Go to `Developer Settings` - Go to `Personal Access Tokens` -> `Legacy tokens (if present)` - Click `Generate new token` -> `Legacy tokens (if present)`. If required, provide your password. - - Select at least these scopes: `read packages` and `workflow`. Optionally, provide a text in the **Note** field and change the expiration. + - Select at least these scopes: `read packages` and `workflow`. Optionally, provide text in the **Note** field and change the expiration. - Click `Generate token` - Copy the token somewhere safe and temporary. 2. Skip this step if you still have the Azure DevOp personal access token created during step 1 in the lab setup [steps](../azure_devops#bootstrap-your-azure-devops-organization), if not create another and save to a temporary location. From 8efd9a34a126bf51885e5064f80abafc567386be Mon Sep 17 00:00:00 2001 From: j-dunham Date: Thu, 1 Sep 2022 08:43:35 -0400 Subject: [PATCH 25/69] Update valet-configure-lab.md --- azure_devops/valet-configure-lab.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/azure_devops/valet-configure-lab.md b/azure_devops/valet-configure-lab.md index a5f6837..5d6048f 100644 --- a/azure_devops/valet-configure-lab.md +++ b/azure_devops/valet-configure-lab.md @@ -1,5 +1,5 @@ # Configure Valet to work with GitLab -In this lab, you will use the Valet `configure` command to set up the required information to communicate with the Azure DevOps and GitHub instances. The `configure` command can be used for all of the supported providers, in this lab we will be focusing on Azure DevOps. +In this lab, we will use the Valet `configure` command to set up the required information to communicate with Azure DevOps and GitHub. The `configure` command can be used for all of the supported providers, but in this lab we will be focusing on Azure DevOps. - [Prerequisites](#prerequisites) - [Configuring Valet](#configuring-valet) - [Verify Valet Works](#verify-valet-works) @@ -17,19 +17,19 @@ In this lab, you will use the Valet `configure` command to set up the required i - Select at least these scopes: `read packages` and `workflow`. Optionally, provide text in the **Note** field and change the expiration. - Click `Generate token` - Copy the token somewhere safe and temporary. -2. Skip this step if you still have the Azure DevOp personal access token created during step 1 in the lab setup [steps](../azure_devops#bootstrap-your-azure-devops-organization), if not create another and save to a temporary location. +2. Skip this step if you still have the Azure DevOp personal access token created during step 1 in the lab setup [steps](../azure_devops#bootstrap-your-azure-devops-organization), if not create another and save to a save and temporary location. 3. Run Valet configure command. - In the codespace terminal run `gh valet configure` - Use the down arrow key to highlight `Azure DevOps`, press the spacebar to select, then hit enter to accept. - - At the prompt enter your GitHub Username and press enter. - - At the GitHub Container Registry prompt enter the GitHub PAT generated in step 1 and press enter + - At the prompt enter your GitHub username and press enter. + - At the GitHub Container Registry prompt enter the GitHub PAT generated in step 1 and press enter. - At the GitHub PAT prompt enter the GitHub PAT generated in step 1 and press enter. - - At the GitHub url prompt enter the GitHub instance url or hit enter to accept the default, if you are using github.com then the default is the right choice. - - At the Azure DevOps token prompt enter the access token from step 2. + - At the GitHub url prompt enter the GitHub instance url or hit enter to accept the default. + - At the Azure DevOps token prompt enter the access token from step 2 and press enter. - At the Azure DevOps url prompt enter your Azure DevOps url or hit enter to accept the default. - - At the prompt enter your Azure Devops organization name. - - At the prompt enter your Azure Devops project name. -4. If all went well you should see a similar output in your terminal and a new file (.env.local) should have been created in the root of the project. + - At the prompt enter your Azure Devops Organization name. + - At the prompt enter your Azure Devops Project name. +4. If all went well you should see a similar output in your terminal and a new file (.env.local) should have been created in the root of the project. The .env.local file contains the tokens used during the configure command and should be keep secret. ![configure-result](https://user-images.githubusercontent.com/18723510/187771230-27c97889-d98a-48f7-af01-c1a9f8df6423.png) From 09dd05a0024bfc463bef8c5c900a939b9b5814ea Mon Sep 17 00:00:00 2001 From: j-dunham Date: Thu, 1 Sep 2022 08:46:15 -0400 Subject: [PATCH 26/69] Update valet-configure-lab.md --- azure_devops/valet-configure-lab.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/valet-configure-lab.md b/azure_devops/valet-configure-lab.md index 5d6048f..faf7319 100644 --- a/azure_devops/valet-configure-lab.md +++ b/azure_devops/valet-configure-lab.md @@ -1,4 +1,4 @@ -# Configure Valet to work with GitLab +# Configure Valet to work with Azure DevOps In this lab, we will use the Valet `configure` command to set up the required information to communicate with Azure DevOps and GitHub. The `configure` command can be used for all of the supported providers, but in this lab we will be focusing on Azure DevOps. - [Prerequisites](#prerequisites) - [Configuring Valet](#configuring-valet) From 0a218e49859e9470c9fc7bf099830bc813fd4d52 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Thu, 1 Sep 2022 09:00:22 -0400 Subject: [PATCH 27/69] Update valet-configure-lab.md --- azure_devops/valet-configure-lab.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/valet-configure-lab.md b/azure_devops/valet-configure-lab.md index faf7319..b50a150 100644 --- a/azure_devops/valet-configure-lab.md +++ b/azure_devops/valet-configure-lab.md @@ -1,4 +1,4 @@ -# Configure Valet to work with Azure DevOps +# Configure credentials for Valet In this lab, we will use the Valet `configure` command to set up the required information to communicate with Azure DevOps and GitHub. The `configure` command can be used for all of the supported providers, but in this lab we will be focusing on Azure DevOps. - [Prerequisites](#prerequisites) - [Configuring Valet](#configuring-valet) From 7061b52e8d874aef1b5f1aa16ea00bd25d858ba2 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Thu, 1 Sep 2022 09:01:36 -0400 Subject: [PATCH 28/69] Update readme.md --- azure_devops/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/readme.md b/azure_devops/readme.md index 3c9505e..b77f362 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -59,7 +59,7 @@ This lab bootstraps a Valet environment using GitHub Codespaces and enables you ## Labs for Azure DevOps Perform the following labs to learn how to migrate Azure DevOps pipelines to GitHub Actions using Valet: - +- [Configure credentials for Valet](valet-configure-lab.md) - [Audit Azure DevOps pipelines using the Valet audit command](valet-audit-lab.md) - [Dry run the migration of an Azure DevOps pipeline to GitHub Actions](valet-dry-run-lab.md) - [Migrate an Azure DevOps pipeline to GitHub Actions](valet-migrate-lab.md) From e9fd8525b0e2a1788bd162baa071c542d3bac13c Mon Sep 17 00:00:00 2001 From: j-dunham Date: Thu, 1 Sep 2022 15:12:10 -0400 Subject: [PATCH 29/69] Update jobs_data.json --- azure_devops/jobs_data.json | 4052 +++++++++++------------------------ 1 file changed, 1261 insertions(+), 2791 deletions(-) diff --git a/azure_devops/jobs_data.json b/azure_devops/jobs_data.json index 706d173..c44cdaf 100644 --- a/azure_devops/jobs_data.json +++ b/azure_devops/jobs_data.json @@ -1,2792 +1,1262 @@ [ - { - "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", - "request_id": 4278, - "build_id": 4567, - "build_number": "20220405.1", - "result": "succeeded", - "queue_time": "2022-04-05T17:43:43.73Z", - "start_time": "2022-04-05T17:43:46.2405003Z", - "finish_time": "2022-04-05T17:44:41.4733333Z", - "assign_time": "2022-04-05T17:43:43.98Z", - "definition_id": 220, - "runner_name": "MacBook", - "os_description": "Darwin", - "runner_group": "Default" - }, - { - "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", - "request_id": 4273, - "build_id": 4558, - "build_number": "20220405.2", - "result": "succeeded", - "queue_time": "2022-04-05T00:29:56.47Z", - "start_time": "2022-04-05T00:29:59.3679242Z", - "finish_time": "2022-04-05T00:30:21.0533333Z", - "assign_time": "2022-04-05T00:29:56.6966667Z", - "definition_id": 217, - "runner_name": "MacBook", - "os_description": "Darwin", - "runner_group": "Default" - }, - { - "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", - "request_id": 4272, - "build_id": 4556, - "build_number": "20220405.1", - "result": "succeeded", - "queue_time": "2022-04-05T00:26:22.6266667Z", - "start_time": "2022-04-05T00:26:25.2735844Z", - "finish_time": "2022-04-05T00:26:51.95Z", - "assign_time": "2022-04-05T00:26:22.6733333Z", - "definition_id": 217, - "runner_name": "MacBook", - "os_description": "Darwin", - "runner_group": "Default" - }, - { - "id": "ca395085-040a-526b-2ce8-bdc85f692774", - "request_id": 4954, - "build_id": 5151, - "build_number": "20220819.1", - "result": "failed", - "queue_time": "2022-08-19T16:58:13.8166667Z", - "start_time": "2022-08-19T16:58:25.0096333Z", - "finish_time": "2022-08-19T16:58:47.5866667Z", - "assign_time": "2022-08-19T16:58:14.25Z", - "definition_id": 51, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4953, - "build_id": 5150, - "build_number": "20220811.1", - "result": "succeeded", - "queue_time": "2022-08-11T03:00:36.7433333Z", - "start_time": "2022-08-11T03:00:48.3427295Z", - "finish_time": "2022-08-11T03:01:48.44Z", - "assign_time": "2022-08-11T03:00:36.98Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4952, - "build_id": 5149, - "build_number": "20220810.8", - "result": "succeeded", - "queue_time": "2022-08-10T22:24:17.5133333Z", - "start_time": "2022-08-10T22:28:41.8831876Z", - "finish_time": "2022-08-10T22:31:12.17Z", - "assign_time": "2022-08-10T22:28:28.5333333Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4951, - "build_id": 5145, - "build_number": "20220810.7", - "result": "succeeded", - "queue_time": "2022-08-10T22:24:16.2266667Z", - "start_time": "2022-08-10T22:24:32.7143159Z", - "finish_time": "2022-08-10T22:28:27.7133333Z", - "assign_time": "2022-08-10T22:24:16.2633333Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4950, - "build_id": 5144, - "build_number": "20220810.6", - "result": "failed", - "queue_time": "2022-08-10T22:16:23.8866667Z", - "start_time": "2022-08-10T22:18:53.7076646Z", - "finish_time": "2022-08-10T22:21:10.2933333Z", - "assign_time": "2022-08-10T22:18:36.9166667Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4949, - "build_id": 5143, - "build_number": "20220810.5", - "result": "failed", - "queue_time": "2022-08-10T22:10:05.1666667Z", - "start_time": "2022-08-10T22:15:12.6511213Z", - "finish_time": "2022-08-10T22:18:36.0266667Z", - "assign_time": "2022-08-10T22:14:53.49Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4948, - "build_id": 5139, - "build_number": "20220810.4", - "result": "failed", - "queue_time": "2022-08-10T22:09:36.2133333Z", - "start_time": "2022-08-10T22:11:57.7706354Z", - "finish_time": "2022-08-10T22:14:52.64Z", - "assign_time": "2022-08-10T22:11:41.84Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4947, - "build_id": 5135, - "build_number": "20220810.3", - "result": "failed", - "queue_time": "2022-08-10T22:08:11.87Z", - "start_time": "2022-08-10T22:09:49.6121805Z", - "finish_time": "2022-08-10T22:11:41.2033333Z", - "assign_time": "2022-08-10T22:09:38.72Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4946, - "build_id": 5131, - "build_number": "20220810.2", - "result": "failed", - "queue_time": "2022-08-10T22:07:03.78Z", - "start_time": "2022-08-10T22:07:24.865421Z", - "finish_time": "2022-08-10T22:09:37.6433333Z", - "assign_time": "2022-08-10T22:07:04.03Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4945, - "build_id": 5127, - "build_number": "20220810.1", - "result": "failed", - "queue_time": "2022-08-10T22:05:16.8433333Z", - "start_time": "2022-08-10T22:05:40.1526981Z", - "finish_time": "2022-08-10T22:06:51.0533333Z", - "assign_time": "2022-08-10T22:05:16.9066667Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4944, - "build_id": 5120, - "build_number": "20220810.2", - "result": "failed", - "queue_time": "2022-08-10T20:54:58.1433333Z", - "start_time": "2022-08-10T20:55:56.6551759Z", - "finish_time": "2022-08-10T20:56:27.06Z", - "assign_time": "2022-08-10T20:55:43.2933333Z", - "definition_id": 382, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4943, - "build_id": 5117, - "build_number": "20220810.1", - "result": "failed", - "queue_time": "2022-08-10T20:54:52.31Z", - "start_time": "2022-08-10T20:55:09.3477439Z", - "finish_time": "2022-08-10T20:55:42.0333333Z", - "assign_time": "2022-08-10T20:54:52.3666667Z", - "definition_id": 382, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4942, - "build_id": 5116, - "build_number": "20220809.1", - "result": "succeeded", - "queue_time": "2022-08-09T03:00:27.2066667Z", - "start_time": "2022-08-09T03:00:35.1752479Z", - "finish_time": "2022-08-09T03:01:28.3366667Z", - "assign_time": "2022-08-09T03:00:27.5633333Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4941, - "build_id": 5115, - "build_number": "20220808.1", - "result": "failed", - "queue_time": "2022-08-08T17:56:30.37Z", - "start_time": "2022-08-08T17:56:48.1800943Z", - "finish_time": "2022-08-08T17:57:29.7733333Z", - "assign_time": "2022-08-08T17:56:30.4Z", - "definition_id": 382, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4940, - "build_id": 5112, - "build_number": "5112", - "result": "succeeded", - "queue_time": "2022-08-08T17:51:29.1566667Z", - "start_time": "2022-08-08T17:51:47.1020425Z", - "finish_time": "2022-08-08T17:52:37.01Z", - "assign_time": "2022-08-08T17:51:29.22Z", - "definition_id": 389, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4939, - "build_id": 5111, - "build_number": "20220808.1", - "result": "succeeded", - "queue_time": "2022-08-08T03:00:33.19Z", - "start_time": "2022-08-08T03:00:41.4371308Z", - "finish_time": "2022-08-08T03:01:35.4266667Z", - "assign_time": "2022-08-08T03:00:33.26Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "cfa20e98-6997-523c-4233-f0a7302c929f", - "request_id": 4938, - "build_id": 5110, - "build_number": "5110", - "result": "succeeded", - "queue_time": "2022-07-28T23:37:25.4433333Z", - "start_time": "2022-07-28T23:39:01.1647409Z", - "finish_time": "2022-07-28T23:39:53.2166667Z", - "assign_time": "2022-07-28T23:38:49.5033333Z", - "definition_id": 381, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4937, - "build_id": 5110, - "build_number": "5110", - "result": "succeeded", - "queue_time": "2022-07-28T23:37:25.4233333Z", - "start_time": "2022-07-28T23:37:41.9972446Z", - "finish_time": "2022-07-28T23:38:48.7133333Z", - "assign_time": "2022-07-28T23:37:25.7066667Z", - "definition_id": 381, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4936, - "build_id": 5109, - "build_number": "20220728.1", - "result": "succeeded", - "queue_time": "2022-07-28T03:00:31.0466667Z", - "start_time": "2022-07-28T03:00:39.5725796Z", - "finish_time": "2022-07-28T03:01:28.22Z", - "assign_time": "2022-07-28T03:00:31.12Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4935, - "build_id": 5107, - "build_number": "20220726.1", - "result": "succeeded", - "queue_time": "2022-07-26T03:00:13.81Z", - "start_time": "2022-07-26T03:00:24.9304002Z", - "finish_time": "2022-07-26T03:01:20.47Z", - "assign_time": "2022-07-26T03:00:14.8566667Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "899a9724-4530-558a-15f1-375d2bccc79e", - "request_id": 4934, - "build_id": 5105, - "build_number": "20220725.2", - "result": "succeeded", - "queue_time": "2022-07-25T21:35:31.2933333Z", - "start_time": "2022-07-25T21:35:36.7385249Z", - "finish_time": "2022-07-25T21:36:30.7066667Z", - "assign_time": "2022-07-25T21:35:31.3466667Z", - "definition_id": 378, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "899a9724-4530-558a-15f1-375d2bccc79e", - "request_id": 4933, - "build_id": 5104, - "build_number": "20220725.1", - "result": "succeeded", - "queue_time": "2022-07-25T20:50:01.22Z", - "start_time": "2022-07-25T20:50:07.4147643Z", - "finish_time": "2022-07-25T20:50:54.54Z", - "assign_time": "2022-07-25T20:50:01.46Z", - "definition_id": 378, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4932, - "build_id": 5102, - "build_number": "20220719.1", - "result": "succeeded", - "queue_time": "2022-07-19T03:00:22.2666667Z", - "start_time": "2022-07-19T03:00:31.3918294Z", - "finish_time": "2022-07-19T03:01:29.17Z", - "assign_time": "2022-07-19T03:00:22.3033333Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4931, - "build_id": 5101, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-07-18T18:45:50.1866667Z", - "start_time": "2022-07-18T18:45:56.8851106Z", - "finish_time": "2022-07-18T18:46:10.4233333Z", - "assign_time": "2022-07-18T18:45:50.28Z", - "definition_id": 380, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "96c60851-4ac0-512f-ac8a-daf36b6a2b26", - "request_id": 4930, - "build_id": 5100, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-07-18T18:43:47.0133333Z", - "start_time": "2022-07-18T18:44:44.683617Z", - "finish_time": "2022-07-18T18:44:57.0366667Z", - "assign_time": "2022-07-18T18:44:23.9933333Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ca395085-040a-526b-2ce8-bdc85f692774", - "request_id": 4929, - "build_id": 5100, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-07-18T18:43:46.7466667Z", - "start_time": "2022-07-18T18:44:11.1374529Z", - "finish_time": "2022-07-18T18:44:23.3633333Z", - "assign_time": "2022-07-18T18:44:04.8533333Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "341b3d8e-0d13-57d4-859b-65d31dcbc29e", - "request_id": 4928, - "build_id": 5100, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-07-18T18:43:46.7433333Z", - "start_time": "2022-07-18T18:43:53.5495773Z", - "finish_time": "2022-07-18T18:44:03.7166667Z", - "assign_time": "2022-07-18T18:43:46.7733333Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4927, - "build_id": 5098, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-07-18T18:40:39.23Z", - "start_time": "2022-07-18T18:40:49.010239Z", - "finish_time": "2022-07-18T18:41:32.5133333Z", - "assign_time": "2022-07-18T18:40:39.2966667Z", - "definition_id": 379, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4926, - "build_id": 5097, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-07-18T03:00:20.35Z", - "start_time": "2022-07-18T03:00:29.0772621Z", - "finish_time": "2022-07-18T03:01:16.4033333Z", - "assign_time": "2022-07-18T03:00:20.4166667Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "899a9724-4530-558a-15f1-375d2bccc79e", - "request_id": 4925, - "build_id": 5096, - "build_number": "20220715.1", - "result": "succeeded", - "queue_time": "2022-07-15T15:54:11.64Z", - "start_time": "2022-07-15T15:54:17.2876517Z", - "finish_time": "2022-07-15T15:55:05.1266667Z", - "assign_time": "2022-07-15T15:54:11.7066667Z", - "definition_id": 378, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4924, - "build_id": 5092, - "build_number": "20220715.1", - "result": "succeeded", - "queue_time": "2022-07-15T03:00:19.7933333Z", - "start_time": "2022-07-15T03:00:31.8579246Z", - "finish_time": "2022-07-15T03:01:10.9533333Z", - "assign_time": "2022-07-15T03:00:19.8733333Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "899a9724-4530-558a-15f1-375d2bccc79e", - "request_id": 4923, - "build_id": 5091, - "build_number": "20220714.1", - "result": "succeeded", - "queue_time": "2022-07-14T20:44:28.6066667Z", - "start_time": "2022-07-14T20:44:37.1245218Z", - "finish_time": "2022-07-14T20:45:43.04Z", - "assign_time": "2022-07-14T20:44:28.9166667Z", - "definition_id": 378, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4922, - "build_id": 5090, - "build_number": "20220714.1", - "result": "succeeded", - "queue_time": "2022-07-14T03:00:34.1933333Z", - "start_time": "2022-07-14T03:00:41.5002481Z", - "finish_time": "2022-07-14T03:01:26.43Z", - "assign_time": "2022-07-14T03:00:34.2533333Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4921, - "build_id": 5089, - "build_number": "20220713.1", - "result": "succeeded", - "queue_time": "2022-07-13T20:25:18.7966667Z", - "start_time": "2022-07-13T20:25:28.2135186Z", - "finish_time": "2022-07-13T20:26:16.3533333Z", - "assign_time": "2022-07-13T20:25:18.9966667Z", - "definition_id": 377, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4920, - "build_id": 5084, - "build_number": "20220713.1", - "result": "succeeded", - "queue_time": "2022-07-13T13:46:02.8033333Z", - "start_time": "2022-07-13T13:47:12.5184633Z", - "finish_time": "2022-07-13T13:47:53.0966667Z", - "assign_time": "2022-07-13T13:47:03.9233333Z", - "definition_id": 373, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4919, - "build_id": 5083, - "build_number": "20220713.1", - "result": "failed", - "queue_time": "2022-07-13T13:46:01.12Z", - "start_time": "2022-07-13T13:46:13.2306562Z", - "finish_time": "2022-07-13T13:47:02.71Z", - "assign_time": "2022-07-13T13:46:01.1766667Z", - "definition_id": 372, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4918, - "build_id": 5080, - "build_number": "20220712.1", - "result": "failed", - "queue_time": "2022-07-12T17:06:15.5033333Z", - "start_time": "2022-07-12T17:06:26.1795208Z", - "finish_time": "2022-07-12T17:06:55.86Z", - "assign_time": "2022-07-12T17:06:15.74Z", - "definition_id": 376, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4917, - "build_id": 5079, - "build_number": "20220712.1", - "result": "succeeded", - "queue_time": "2022-07-12T14:48:45.8033333Z", - "start_time": "2022-07-12T14:48:52.8152685Z", - "finish_time": "2022-07-12T14:49:43.0233333Z", - "assign_time": "2022-07-12T14:48:46.3166667Z", - "definition_id": 375, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4916, - "build_id": 5078, - "build_number": "20220712.1", - "result": "succeeded", - "queue_time": "2022-07-12T03:00:11.5033333Z", - "start_time": "2022-07-12T03:00:23.9071603Z", - "finish_time": "2022-07-12T03:01:02.62Z", - "assign_time": "2022-07-12T03:00:11.7666667Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ca395085-040a-526b-2ce8-bdc85f692774", - "request_id": 4915, - "build_id": 5077, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-07-11T22:08:51.9533333Z", - "start_time": "2022-07-11T22:09:03.1483001Z", - "finish_time": "2022-07-11T22:09:24.9666667Z", - "assign_time": "2022-07-11T22:08:52.1566667Z", - "definition_id": 51, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4914, - "build_id": 5076, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-07-11T20:42:40.6Z", - "start_time": "2022-07-11T20:43:19.0923053Z", - "finish_time": "2022-07-11T20:43:30.9233333Z", - "assign_time": "2022-07-11T20:43:11.27Z", - "definition_id": 374, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "96c60851-4ac0-512f-ac8a-daf36b6a2b26", - "request_id": 4913, - "build_id": 5075, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-07-11T20:42:13.6133333Z", - "start_time": "2022-07-11T20:42:59.2918804Z", - "finish_time": "2022-07-11T20:43:10.2133333Z", - "assign_time": "2022-07-11T20:42:51.9266667Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ca395085-040a-526b-2ce8-bdc85f692774", - "request_id": 4912, - "build_id": 5075, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-07-11T20:42:13.5566667Z", - "start_time": "2022-07-11T20:42:39.2587562Z", - "finish_time": "2022-07-11T20:42:50.9533333Z", - "assign_time": "2022-07-11T20:42:30.8066667Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "341b3d8e-0d13-57d4-859b-65d31dcbc29e", - "request_id": 4911, - "build_id": 5075, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-07-11T20:42:13.5466667Z", - "start_time": "2022-07-11T20:42:20.169292Z", - "finish_time": "2022-07-11T20:42:30.1066667Z", - "assign_time": "2022-07-11T20:42:13.5933333Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4910, - "build_id": 5073, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-07-11T20:40:33.65Z", - "start_time": "2022-07-11T20:40:39.6509289Z", - "finish_time": "2022-07-11T20:41:39.77Z", - "assign_time": "2022-07-11T20:40:33.88Z", - "definition_id": 373, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4909, - "build_id": 5072, - "build_number": "20220711.1", - "result": "canceled", - "queue_time": "2022-07-11T15:02:41.43Z", - "start_time": "2022-07-11T15:02:52.8313534Z", - "finish_time": "2022-07-11T15:02:58.06Z", - "assign_time": "2022-07-11T15:02:41.4766667Z", - "definition_id": 372, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4908, - "build_id": 5071, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-07-11T14:58:14.99Z", - "start_time": "2022-07-11T14:58:21.4957133Z", - "finish_time": "2022-07-11T14:58:41.8933333Z", - "assign_time": "2022-07-11T14:58:15.0266667Z", - "definition_id": 371, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4907, - "build_id": 5070, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-07-11T14:31:09.8066667Z", - "start_time": "2022-07-11T14:31:24.8007924Z", - "finish_time": "2022-07-11T14:31:59.3633333Z", - "assign_time": "2022-07-11T14:31:09.8633333Z", - "definition_id": 370, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4906, - "build_id": 5069, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-07-11T14:28:25.6866667Z", - "start_time": "2022-07-11T14:28:32.763647Z", - "finish_time": "2022-07-11T14:28:46.5933333Z", - "assign_time": "2022-07-11T14:28:25.73Z", - "definition_id": 369, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "76ed1102-9071-5354-720f-6f09bbc9f0c0", - "request_id": 4905, - "build_id": 5068, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-07-11T14:24:10.3233333Z", - "start_time": "2022-07-11T14:25:07.2541035Z", - "finish_time": "2022-07-11T14:25:34.6333333Z", - "assign_time": "2022-07-11T14:25:00.7966667Z", - "definition_id": 368, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "00b6a206-eb91-585b-3d14-cf1a4d7b1970", - "request_id": 4904, - "build_id": 5068, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-07-11T14:24:10.15Z", - "start_time": "2022-07-11T14:24:42.1401754Z", - "finish_time": "2022-07-11T14:25:00.07Z", - "assign_time": "2022-07-11T14:24:34.3Z", - "definition_id": 368, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "19c563d8-3dcd-57d1-cd5e-9dd946b0a29b", - "request_id": 4903, - "build_id": 5068, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-07-11T14:24:10.14Z", - "start_time": "2022-07-11T14:24:16.1904439Z", - "finish_time": "2022-07-11T14:24:33.44Z", - "assign_time": "2022-07-11T14:24:10.17Z", - "definition_id": 368, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4902, - "build_id": 5067, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-07-11T14:18:10.19Z", - "start_time": "2022-07-11T14:18:18.3555844Z", - "finish_time": "2022-07-11T14:19:22.6266667Z", - "assign_time": "2022-07-11T14:18:10.3466667Z", - "definition_id": 367, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "6a659b14-a5ad-5ce8-05ff-9105f4d16f55", - "request_id": 4901, - "build_id": 107, - "build_number": "Release-1 / Stage 1", - "result": "succeeded", - "queue_time": "2022-06-30T20:15:02.33Z", - "start_time": "2022-06-30T20:15:43.3995066Z", - "finish_time": "2022-06-30T20:15:51.7133333Z", - "assign_time": "2022-06-30T20:15:32.3933333Z", - "definition_id": 14, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "3b770d45-ae29-59a7-a774-67c6a1476782", - "request_id": 4900, - "build_id": 108, - "build_number": "Release-1 / Stage 2", - "result": "succeeded", - "queue_time": "2022-06-30T20:14:52.4266667Z", - "start_time": "2022-06-30T20:15:10.1184454Z", - "finish_time": "2022-06-30T20:15:31.55Z", - "assign_time": "2022-06-30T20:14:52.7866667Z", - "definition_id": 14, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4899, - "build_id": 5066, - "build_number": "5066", - "result": "succeeded", - "queue_time": "2022-06-30T13:49:34.8366667Z", - "start_time": "2022-06-30T13:49:44.5760594Z", - "finish_time": "2022-06-30T13:52:18.75Z", - "assign_time": "2022-06-30T13:49:35.0133333Z", - "definition_id": 366, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4898, - "build_id": 5065, - "build_number": "5065", - "result": "succeeded", - "queue_time": "2022-06-30T13:20:41.41Z", - "start_time": "2022-06-30T13:20:48.1950176Z", - "finish_time": "2022-06-30T13:24:58.39Z", - "assign_time": "2022-06-30T13:20:41.4533333Z", - "definition_id": 365, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4897, - "build_id": 5064, - "build_number": "5064", - "result": "succeeded", - "queue_time": "2022-06-30T12:35:50.17Z", - "start_time": "2022-06-30T12:35:57.4102501Z", - "finish_time": "2022-06-30T12:39:10.7633333Z", - "assign_time": "2022-06-30T12:35:50.23Z", - "definition_id": 365, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4896, - "build_id": 5063, - "build_number": "20220630.1", - "result": "succeeded", - "queue_time": "2022-06-30T03:00:17.8733333Z", - "start_time": "2022-06-30T03:00:26.8409899Z", - "finish_time": "2022-06-30T03:01:50.0266667Z", - "assign_time": "2022-06-30T03:00:17.91Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4895, - "build_id": 5061, - "build_number": "20220629.2", - "result": "succeeded", - "queue_time": "2022-06-29T19:51:17.76Z", - "start_time": "2022-06-29T19:51:23.9334952Z", - "finish_time": "2022-06-29T19:52:46.86Z", - "assign_time": "2022-06-29T19:51:17.82Z", - "definition_id": 364, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4894, - "build_id": 5058, - "build_number": "20220629.1", - "result": "succeeded", - "queue_time": "2022-06-29T19:41:00.17Z", - "start_time": "2022-06-29T19:41:08.6550627Z", - "finish_time": "2022-06-29T19:44:41.7466667Z", - "assign_time": "2022-06-29T19:41:00.45Z", - "definition_id": 364, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4893, - "build_id": 5054, - "build_number": "20220629.1", - "result": "succeeded", - "queue_time": "2022-06-29T03:00:36.52Z", - "start_time": "2022-06-29T03:00:45.436629Z", - "finish_time": "2022-06-29T03:01:57.1366667Z", - "assign_time": "2022-06-29T03:00:36.56Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", - "request_id": 4892, - "build_id": 5052, - "build_number": "20220628.7", - "result": "succeeded", - "queue_time": "2022-06-28T19:11:13.5933333Z", - "start_time": "2022-06-28T19:11:21.6684563Z", - "finish_time": "2022-06-28T19:12:21.8866667Z", - "assign_time": "2022-06-28T19:11:13.6466667Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", - "request_id": 4891, - "build_id": 5051, - "build_number": "20220628.6", - "result": "succeeded", - "queue_time": "2022-06-28T16:45:46.73Z", - "start_time": "2022-06-28T16:45:56.8715565Z", - "finish_time": "2022-06-28T16:46:56.2666667Z", - "assign_time": "2022-06-28T16:45:46.7633333Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", - "request_id": 4890, - "build_id": 5050, - "build_number": "20220628.5", - "result": "failed", - "queue_time": "2022-06-28T16:42:49.2Z", - "start_time": "2022-06-28T16:42:54.4510649Z", - "finish_time": "2022-06-28T16:43:09.88Z", - "assign_time": "2022-06-28T16:42:49.2266667Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", - "request_id": 4889, - "build_id": 5049, - "build_number": "20220628.4", - "result": "failed", - "queue_time": "2022-06-28T16:38:35.2Z", - "start_time": "2022-06-28T16:38:41.1860027Z", - "finish_time": "2022-06-28T16:38:56.49Z", - "assign_time": "2022-06-28T16:38:35.2633333Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", - "request_id": 4888, - "build_id": 5048, - "build_number": "20220628.3", - "result": "succeeded", - "queue_time": "2022-06-28T16:31:50.58Z", - "start_time": "2022-06-28T16:31:56.974368Z", - "finish_time": "2022-06-28T16:32:57.4933333Z", - "assign_time": "2022-06-28T16:31:50.6066667Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", - "request_id": 4887, - "build_id": 5047, - "build_number": "20220628.2", - "result": "succeeded", - "queue_time": "2022-06-28T16:27:16.41Z", - "start_time": "2022-06-28T16:27:25.7030557Z", - "finish_time": "2022-06-28T16:28:07.04Z", - "assign_time": "2022-06-28T16:27:16.68Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", - "request_id": 4886, - "build_id": 5046, - "build_number": "20220628.1", - "result": "succeeded", - "queue_time": "2022-06-28T16:10:15.1866667Z", - "start_time": "2022-06-28T16:10:22.632602Z", - "finish_time": "2022-06-28T16:11:00.95Z", - "assign_time": "2022-06-28T16:10:15.4566667Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4885, - "build_id": 5045, - "build_number": "20220628.1", - "result": "succeeded", - "queue_time": "2022-06-28T03:00:17.8566667Z", - "start_time": "2022-06-28T03:00:30.6344983Z", - "finish_time": "2022-06-28T03:01:10.2466667Z", - "assign_time": "2022-06-28T03:00:17.8966667Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", - "request_id": 4884, - "build_id": 5043, - "build_number": "20220627.2", - "result": "succeeded", - "queue_time": "2022-06-27T17:47:08.16Z", - "start_time": "2022-06-27T17:47:15.987734Z", - "finish_time": "2022-06-27T17:50:44.12Z", - "assign_time": "2022-06-27T17:47:08.4933333Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ca395085-040a-526b-2ce8-bdc85f692774", - "request_id": 4883, - "build_id": 5042, - "build_number": "20220627.1", - "result": "canceled", - "queue_time": "2022-06-27T17:26:33.07Z", - "start_time": "2022-06-27T17:26:39.6690274Z", - "finish_time": "2022-06-27T17:26:55.87Z", - "assign_time": "2022-06-27T17:26:33.49Z", - "definition_id": 168, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4882, - "build_id": 5035, - "build_number": "20220627.1", - "result": "succeeded", - "queue_time": "2022-06-27T16:21:06.4833333Z", - "start_time": "2022-06-27T16:21:11.8349063Z", - "finish_time": "2022-06-27T16:21:58.5633333Z", - "assign_time": "2022-06-27T16:21:06.54Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4881, - "build_id": 5034, - "build_number": "20220623.1", - "result": "succeeded", - "queue_time": "2022-06-23T03:00:33.8933333Z", - "start_time": "2022-06-23T03:00:45.661288Z", - "finish_time": "2022-06-23T03:01:31.83Z", - "assign_time": "2022-06-23T03:00:34.53Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "a528ef4b-e2e0-565b-271a-65845573d880", - "request_id": 4880, - "build_id": 5033, - "build_number": "20220623.2", - "result": "succeeded", - "queue_time": "2022-06-23T00:37:06.3233333Z", - "start_time": "2022-06-23T00:37:11.8207797Z", - "finish_time": "2022-06-23T00:37:41.7266667Z", - "assign_time": "2022-06-23T00:37:06.38Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ce39968d-2aee-58c0-6354-4429990bc777", - "request_id": 4879, - "build_id": 5033, - "build_number": "20220623.2", - "result": "succeeded", - "queue_time": "2022-06-23T00:36:28.27Z", - "start_time": "2022-06-23T00:36:33.5058903Z", - "finish_time": "2022-06-23T00:37:00.7733333Z", - "assign_time": "2022-06-23T00:36:28.3266667Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7cb24041-3325-5b8a-c38d-87131110a6bf", - "request_id": 4878, - "build_id": 5033, - "build_number": "20220623.2", - "result": "succeeded", - "queue_time": "2022-06-23T00:34:08.6633333Z", - "start_time": "2022-06-23T00:35:54.9845771Z", - "finish_time": "2022-06-23T00:36:22.5Z", - "assign_time": "2022-06-23T00:34:08.6833333Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "5daf491e-fc1d-52d4-3c36-b35e31684732", - "request_id": 4877, - "build_id": 5033, - "build_number": "20220623.2", - "result": "succeeded", - "queue_time": "2022-06-23T00:32:35.8766667Z", - "start_time": "2022-06-23T00:33:28.2471615Z", - "finish_time": "2022-06-23T00:34:06.54Z", - "assign_time": "2022-06-23T00:33:18.14Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2431e782-2f38-5ac4-c2f8-af294f6d514a", - "request_id": 4876, - "build_id": 5033, - "build_number": "20220623.2", - "result": "succeeded", - "queue_time": "2022-06-23T00:31:39.97Z", - "start_time": "2022-06-23T00:32:40.1865253Z", - "finish_time": "2022-06-23T00:33:17.37Z", - "assign_time": "2022-06-23T00:32:33.9833333Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "54beca5a-7b68-5580-ddd0-8aef5b91640f", - "request_id": 4875, - "build_id": 5033, - "build_number": "20220623.2", - "result": "succeeded", - "queue_time": "2022-06-23T00:31:39.6833333Z", - "start_time": "2022-06-23T00:31:47.6971699Z", - "finish_time": "2022-06-23T00:32:33.22Z", - "assign_time": "2022-06-23T00:31:39.7033333Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "a528ef4b-e2e0-565b-271a-65845573d880", - "request_id": 4871, - "build_id": 5032, - "build_number": "20220623.1", - "result": "canceled", - "queue_time": "2022-06-23T00:30:56.79Z", - "start_time": "2022-06-23T00:31:01.9918715Z", - "finish_time": "2022-06-23T00:31:19.5833333Z", - "assign_time": "2022-06-23T00:30:56.8533333Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4870, - "build_id": 5031, - "build_number": "5031", - "result": "succeeded", - "queue_time": "2022-06-22T18:52:57.21Z", - "start_time": "2022-06-22T18:54:41.9650756Z", - "finish_time": "2022-06-22T18:55:41.29Z", - "assign_time": "2022-06-22T18:54:25.0866667Z", - "definition_id": 361, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "cfa20e98-6997-523c-4233-f0a7302c929f", - "request_id": 4869, - "build_id": 5031, - "build_number": "5031", - "result": "succeeded", - "queue_time": "2022-06-22T18:52:57.2Z", - "start_time": "2022-06-22T18:53:14.9752109Z", - "finish_time": "2022-06-22T18:54:24.2033333Z", - "assign_time": "2022-06-22T18:52:57.2233333Z", - "definition_id": 361, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4868, - "build_id": 5029, - "build_number": "5029", - "result": "succeeded", - "queue_time": "2022-06-22T13:01:36.7433333Z", - "start_time": "2022-06-22T13:03:00.7879139Z", - "finish_time": "2022-06-22T13:03:57.8833333Z", - "assign_time": "2022-06-22T13:02:40.4833333Z", - "definition_id": 360, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "cfa20e98-6997-523c-4233-f0a7302c929f", - "request_id": 4867, - "build_id": 5029, - "build_number": "5029", - "result": "succeeded", - "queue_time": "2022-06-22T13:01:36.48Z", - "start_time": "2022-06-22T13:01:51.5040284Z", - "finish_time": "2022-06-22T13:02:39.8466667Z", - "assign_time": "2022-06-22T13:01:36.9533333Z", - "definition_id": 360, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4866, - "build_id": 5028, - "build_number": "20220622.1", - "result": "succeeded", - "queue_time": "2022-06-22T03:00:34.3866667Z", - "start_time": "2022-06-22T03:00:42.8728772Z", - "finish_time": "2022-06-22T03:01:23.4566667Z", - "assign_time": "2022-06-22T03:00:34.5533333Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4865, - "build_id": 5027, - "build_number": "5027", - "result": "succeeded", - "queue_time": "2022-06-21T18:08:56.53Z", - "start_time": "2022-06-21T18:09:05.5510972Z", - "finish_time": "2022-06-21T18:09:53.5Z", - "assign_time": "2022-06-21T18:08:56.7066667Z", - "definition_id": 361, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "5daf491e-fc1d-52d4-3c36-b35e31684732", - "request_id": 4864, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-06-21T17:04:17.85Z", - "start_time": "2022-06-21T17:06:53.9745617Z", - "finish_time": "2022-06-21T17:07:25.3266667Z", - "assign_time": "2022-06-21T17:06:44.67Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ce39968d-2aee-58c0-6354-4429990bc777", - "request_id": 4863, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-06-21T17:03:33.3766667Z", - "start_time": "2022-06-21T17:06:01.1201953Z", - "finish_time": "2022-06-21T17:06:43.8966667Z", - "assign_time": "2022-06-21T17:05:54.9566667Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2431e782-2f38-5ac4-c2f8-af294f6d514a", - "request_id": 4862, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-06-21T17:02:20.06Z", - "start_time": "2022-06-21T17:05:07.8148768Z", - "finish_time": "2022-06-21T17:05:54.32Z", - "assign_time": "2022-06-21T17:05:00.4Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "a528ef4b-e2e0-565b-271a-65845573d880", - "request_id": 4861, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-06-21T17:02:19.9Z", - "start_time": "2022-06-21T17:04:22.8635006Z", - "finish_time": "2022-06-21T17:04:59.4966667Z", - "assign_time": "2022-06-21T17:04:16.2166667Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "54beca5a-7b68-5580-ddd0-8aef5b91640f", - "request_id": 4860, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-06-21T17:02:18.9633333Z", - "start_time": "2022-06-21T17:03:35.4472694Z", - "finish_time": "2022-06-21T17:04:15.2066667Z", - "assign_time": "2022-06-21T17:03:27.2Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7cb24041-3325-5b8a-c38d-87131110a6bf", - "request_id": 4859, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-06-21T17:02:17.9Z", - "start_time": "2022-06-21T17:02:51.4121619Z", - "finish_time": "2022-06-21T17:03:26.3666667Z", - "assign_time": "2022-06-21T17:02:43.3566667Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4858, - "build_id": 5025, - "build_number": "5025", - "result": "succeeded", - "queue_time": "2022-06-21T17:01:39.48Z", - "start_time": "2022-06-21T17:01:52.5755448Z", - "finish_time": "2022-06-21T17:02:42.6633333Z", - "assign_time": "2022-06-21T17:01:39.54Z", - "definition_id": 360, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", - "request_id": 4857, - "build_id": 5024, - "build_number": "20220621.1", - "result": "succeeded", - "queue_time": "2022-06-21T16:59:29.8433333Z", - "start_time": "2022-06-21T17:00:18.7374553Z", - "finish_time": "2022-06-21T17:00:47.1933333Z", - "assign_time": "2022-06-21T17:00:11.0233333Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "a528ef4b-e2e0-565b-271a-65845573d880", - "request_id": 4856, - "build_id": 5024, - "build_number": "20220621.1", - "result": "succeeded", - "queue_time": "2022-06-21T16:58:34.2633333Z", - "start_time": "2022-06-21T16:59:33.2423874Z", - "finish_time": "2022-06-21T17:00:09.8933333Z", - "assign_time": "2022-06-21T16:59:27.85Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ce39968d-2aee-58c0-6354-4429990bc777", - "request_id": 4855, - "build_id": 5024, - "build_number": "20220621.1", - "result": "succeeded", - "queue_time": "2022-06-21T16:58:33.5866667Z", - "start_time": "2022-06-21T16:58:41.9914811Z", - "finish_time": "2022-06-21T16:59:27.19Z", - "assign_time": "2022-06-21T16:58:33.8166667Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4854, - "build_id": 5022, - "build_number": "20220621.1", - "result": "succeeded", - "queue_time": "2022-06-21T14:07:44.98Z", - "start_time": "2022-06-21T14:07:50.4618729Z", - "finish_time": "2022-06-21T14:08:42.87Z", - "assign_time": "2022-06-21T14:07:45.44Z", - "definition_id": 358, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", - "request_id": 4853, - "build_id": 5020, - "build_number": "20220621.1", - "result": "succeeded", - "queue_time": "2022-06-21T13:59:04.4533333Z", - "start_time": "2022-06-21T13:59:09.9661262Z", - "finish_time": "2022-06-21T13:59:55.37Z", - "assign_time": "2022-06-21T13:59:04.6266667Z", - "definition_id": 346, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4852, - "build_id": 5019, - "build_number": "20220621.1", - "result": "succeeded", - "queue_time": "2022-06-21T03:00:13.9766667Z", - "start_time": "2022-06-21T03:00:24.5103773Z", - "finish_time": "2022-06-21T03:00:58.54Z", - "assign_time": "2022-06-21T03:00:14.03Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", - "request_id": 4851, - "build_id": 5018, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T23:10:50.84Z", - "start_time": "2022-06-20T23:11:38.4182663Z", - "finish_time": "2022-06-20T23:12:07.37Z", - "assign_time": "2022-06-20T23:11:33.4133333Z", - "definition_id": 357, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "770cf1cf-842d-514f-a534-0e40b52e5eb9", - "request_id": 4850, - "build_id": 5018, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T23:10:50.38Z", - "start_time": "2022-06-20T23:10:55.3464419Z", - "finish_time": "2022-06-20T23:11:32.6766667Z", - "assign_time": "2022-06-20T23:10:50.4366667Z", - "definition_id": 357, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "96b5718e-8351-56c3-5739-25aca4951cbb", - "request_id": 4849, - "build_id": 5018, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T23:10:05.7Z", - "start_time": "2022-06-20T23:10:13.4700282Z", - "finish_time": "2022-06-20T23:10:47.16Z", - "assign_time": "2022-06-20T23:10:05.87Z", - "definition_id": 357, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4848, - "build_id": 5017, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T23:06:00.4966667Z", - "start_time": "2022-06-20T23:06:06.1751544Z", - "finish_time": "2022-06-20T23:06:49.31Z", - "assign_time": "2022-06-20T23:06:00.55Z", - "definition_id": 356, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "770cf1cf-842d-514f-a534-0e40b52e5eb9", - "request_id": 4847, - "build_id": 5015, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T19:05:17.2066667Z", - "start_time": "2022-06-20T19:06:13.9070851Z", - "finish_time": "2022-06-20T19:07:10.79Z", - "assign_time": "2022-06-20T19:06:07.2133333Z", - "definition_id": 355, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", - "request_id": 4846, - "build_id": 5015, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T19:05:17.1133333Z", - "start_time": "2022-06-20T19:05:24.6210313Z", - "finish_time": "2022-06-20T19:06:06.49Z", - "assign_time": "2022-06-20T19:05:17.1733333Z", - "definition_id": 355, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "96b5718e-8351-56c3-5739-25aca4951cbb", - "request_id": 4845, - "build_id": 5015, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T19:04:26.5766667Z", - "start_time": "2022-06-20T19:04:33.5620123Z", - "finish_time": "2022-06-20T19:05:12.5Z", - "assign_time": "2022-06-20T19:04:26.65Z", - "definition_id": 355, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4844, - "build_id": 5014, - "build_number": "20220620.2", - "result": "succeeded", - "queue_time": "2022-06-20T18:39:11.04Z", - "start_time": "2022-06-20T18:39:16.0902085Z", - "finish_time": "2022-06-20T18:39:56.59Z", - "assign_time": "2022-06-20T18:39:11.09Z", - "definition_id": 354, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4843, - "build_id": 5013, - "build_number": "20220620.1", - "result": "failed", - "queue_time": "2022-06-20T18:35:40.1266667Z", - "start_time": "2022-06-20T18:35:47.4375926Z", - "finish_time": "2022-06-20T18:36:03.63Z", - "assign_time": "2022-06-20T18:35:40.3633333Z", - "definition_id": 354, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "0be8f30d-500c-5dcf-f5e7-65a05ef6a4e4", - "request_id": 4842, - "build_id": 5012, - "build_number": "20220620.2", - "result": "succeeded", - "queue_time": "2022-06-20T12:59:31.3166667Z", - "start_time": "2022-06-20T12:59:38.0453509Z", - "finish_time": "2022-06-20T13:00:27.7666667Z", - "assign_time": "2022-06-20T12:59:31.3733333Z", - "definition_id": 199, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "42265946-a31d-5c06-07b2-26be0eb8ee02", - "request_id": 4841, - "build_id": 5011, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T12:44:22.78Z", - "start_time": "2022-06-20T12:46:13.0374809Z", - "finish_time": "2022-06-20T12:46:49.9066667Z", - "assign_time": "2022-06-20T12:46:06.6433333Z", - "definition_id": 199, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "b8230f92-0c42-5846-82b9-bba6b3268ecc", - "request_id": 4840, - "build_id": 5011, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T12:44:22.3966667Z", - "start_time": "2022-06-20T12:45:29.6872732Z", - "finish_time": "2022-06-20T12:46:06.0333333Z", - "assign_time": "2022-06-20T12:45:23.1Z", - "definition_id": 199, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2e489720-33fb-5f96-f422-9c8575243a35", - "request_id": 4839, - "build_id": 5011, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T12:44:20.8233333Z", - "start_time": "2022-06-20T12:44:29.5241689Z", - "finish_time": "2022-06-20T12:45:22.1866667Z", - "assign_time": "2022-06-20T12:44:21.0033333Z", - "definition_id": 199, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4838, - "build_id": 5010, - "build_number": "20220620.1", - "result": "succeeded", - "queue_time": "2022-06-20T03:00:31.4Z", - "start_time": "2022-06-20T03:00:43.8800831Z", - "finish_time": "2022-06-20T03:01:31.21Z", - "assign_time": "2022-06-20T03:00:31.4266667Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "899a9724-4530-558a-15f1-375d2bccc79e", - "request_id": 4837, - "build_id": 5009, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T20:50:14.3866667Z", - "start_time": "2022-06-17T20:50:20.6370575Z", - "finish_time": "2022-06-17T20:50:58.6533333Z", - "assign_time": "2022-06-17T20:50:14.44Z", - "definition_id": 353, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4836, - "build_id": 5008, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T20:48:16.2566667Z", - "start_time": "2022-06-17T20:48:21.5528335Z", - "finish_time": "2022-06-17T20:48:53.5966667Z", - "assign_time": "2022-06-17T20:48:16.3033333Z", - "definition_id": 352, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2aeb1283-cf0c-566e-9807-aa6a26eaed8f", - "request_id": 4835, - "build_id": 5006, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T20:41:16.99Z", - "start_time": "2022-06-17T20:41:23.6520666Z", - "finish_time": "2022-06-17T20:41:53.8266667Z", - "assign_time": "2022-06-17T20:41:17.16Z", - "definition_id": 351, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4834, - "build_id": 5004, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T15:09:24.34Z", - "start_time": "2022-06-17T15:10:03.3755782Z", - "finish_time": "2022-06-17T15:10:32.15Z", - "assign_time": "2022-06-17T15:09:53.0233333Z", - "definition_id": 350, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "3c427f77-2132-5b78-efd3-e096cea98432", - "request_id": 4833, - "build_id": 5003, - "build_number": "20220617.2", - "result": "succeeded", - "queue_time": "2022-06-17T15:08:43.1066667Z", - "start_time": "2022-06-17T15:09:26.385872Z", - "finish_time": "2022-06-17T15:09:52.18Z", - "assign_time": "2022-06-17T15:09:19.4933333Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7514dec6-ee70-5243-0c9c-3aaf46f53831", - "request_id": 4832, - "build_id": 5003, - "build_number": "20220617.2", - "result": "succeeded", - "queue_time": "2022-06-17T15:08:42.56Z", - "start_time": "2022-06-17T15:08:48.822525Z", - "finish_time": "2022-06-17T15:09:18.5833333Z", - "assign_time": "2022-06-17T15:08:42.5866667Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "1d469f83-4b5f-5d14-182a-3b42ea2058c8", - "request_id": 4831, - "build_id": 5003, - "build_number": "20220617.2", - "result": "succeeded", - "queue_time": "2022-06-17T15:06:54.4933333Z", - "start_time": "2022-06-17T15:08:08.9478893Z", - "finish_time": "2022-06-17T15:08:39.61Z", - "assign_time": "2022-06-17T15:08:03.0266667Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "78e99f79-8fcc-58c3-536b-39d225dff3d3", - "request_id": 4830, - "build_id": 5003, - "build_number": "20220617.2", - "result": "succeeded", - "queue_time": "2022-06-17T15:06:54.09Z", - "start_time": "2022-06-17T15:07:33.088071Z", - "finish_time": "2022-06-17T15:08:02.4133333Z", - "assign_time": "2022-06-17T15:07:27.88Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2a9f993f-cde6-5010-8692-151c7ae6e1ea", - "request_id": 4829, - "build_id": 5003, - "build_number": "20220617.2", - "result": "succeeded", - "queue_time": "2022-06-17T15:06:52.09Z", - "start_time": "2022-06-17T15:06:57.6008412Z", - "finish_time": "2022-06-17T15:07:27.1933333Z", - "assign_time": "2022-06-17T15:06:52.3033333Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ec4b76d4-6def-5166-aee5-1a21dbfc4150", - "request_id": 4828, - "build_id": 5003, - "build_number": "20220617.2", - "result": "succeeded", - "queue_time": "2022-06-17T15:05:17.83Z", - "start_time": "2022-06-17T15:06:10.083399Z", - "finish_time": "2022-06-17T15:06:48.6333333Z", - "assign_time": "2022-06-17T15:06:04.74Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7514dec6-ee70-5243-0c9c-3aaf46f53831", - "request_id": 4827, - "build_id": 5001, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T15:04:44.2133333Z", - "start_time": "2022-06-17T15:05:36.3176632Z", - "finish_time": "2022-06-17T15:06:03.9166667Z", - "assign_time": "2022-06-17T15:05:31.46Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "3c427f77-2132-5b78-efd3-e096cea98432", - "request_id": 4826, - "build_id": 5001, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T15:04:43.9633333Z", - "start_time": "2022-06-17T15:04:51.9109973Z", - "finish_time": "2022-06-17T15:05:30.8233333Z", - "assign_time": "2022-06-17T15:04:43.9966667Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "1d469f83-4b5f-5d14-182a-3b42ea2058c8", - "request_id": 4825, - "build_id": 5001, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T15:03:58.7233333Z", - "start_time": "2022-06-17T15:04:05.9575162Z", - "finish_time": "2022-06-17T15:04:40.59Z", - "assign_time": "2022-06-17T15:03:58.8133333Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "78e99f79-8fcc-58c3-536b-39d225dff3d3", - "request_id": 4824, - "build_id": 5001, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T15:01:28.3Z", - "start_time": "2022-06-17T15:03:18.8393195Z", - "finish_time": "2022-06-17T15:03:55.9166667Z", - "assign_time": "2022-06-17T15:03:08.2766667Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2a9f993f-cde6-5010-8692-151c7ae6e1ea", - "request_id": 4823, - "build_id": 5001, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T15:01:28.12Z", - "start_time": "2022-06-17T15:02:25.0072816Z", - "finish_time": "2022-06-17T15:03:07.66Z", - "assign_time": "2022-06-17T15:02:18.3933333Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", - "request_id": 4822, - "build_id": 5002, - "build_number": "20220617.3", - "result": "succeeded", - "queue_time": "2022-06-17T15:00:33.6566667Z", - "start_time": "2022-06-17T15:01:33.1052395Z", - "finish_time": "2022-06-17T15:02:17.6666667Z", - "assign_time": "2022-06-17T15:01:25.7866667Z", - "definition_id": 348, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ec4b76d4-6def-5166-aee5-1a21dbfc4150", - "request_id": 4821, - "build_id": 5001, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T15:00:31.9166667Z", - "start_time": "2022-06-17T15:00:40.0977348Z", - "finish_time": "2022-06-17T15:01:25.0966667Z", - "assign_time": "2022-06-17T15:00:32.2333333Z", - "definition_id": 210, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4820, - "build_id": 5000, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T03:00:22.39Z", - "start_time": "2022-06-17T03:00:34.2117646Z", - "finish_time": "2022-06-17T03:01:13.27Z", - "assign_time": "2022-06-17T03:00:22.6766667Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", - "request_id": 4819, - "build_id": 4999, - "build_number": "20220617.2", - "result": "succeeded", - "queue_time": "2022-06-17T00:49:29.95Z", - "start_time": "2022-06-17T00:50:10.229734Z", - "finish_time": "2022-06-17T00:50:44.0466667Z", - "assign_time": "2022-06-17T00:50:04.11Z", - "definition_id": 348, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", - "request_id": 4818, - "build_id": 4998, - "build_number": "20220617.1", - "result": "succeeded", - "queue_time": "2022-06-17T00:49:04.0266667Z", - "start_time": "2022-06-17T00:49:14.9728262Z", - "finish_time": "2022-06-17T00:50:02.9933333Z", - "assign_time": "2022-06-17T00:49:04.0533333Z", - "definition_id": 348, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", - "request_id": 4817, - "build_id": 4997, - "build_number": "20220616.1", - "result": "succeeded", - "queue_time": "2022-06-16T20:13:38.3966667Z", - "start_time": "2022-06-16T20:13:47.831322Z", - "finish_time": "2022-06-16T20:14:31.7233333Z", - "assign_time": "2022-06-16T20:13:38.4533333Z", - "definition_id": 346, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "770cf1cf-842d-514f-a534-0e40b52e5eb9", - "request_id": 4816, - "build_id": 4993, - "build_number": "20220616.1", - "result": "succeeded", - "queue_time": "2022-06-16T17:31:28.9366667Z", - "start_time": "2022-06-16T17:31:34.6761637Z", - "finish_time": "2022-06-16T17:32:09.1466667Z", - "assign_time": "2022-06-16T17:31:28.96Z", - "definition_id": 349, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", - "request_id": 4815, - "build_id": 4993, - "build_number": "20220616.1", - "result": "succeeded", - "queue_time": "2022-06-16T17:30:46.1966667Z", - "start_time": "2022-06-16T17:30:51.973212Z", - "finish_time": "2022-06-16T17:31:26.4666667Z", - "assign_time": "2022-06-16T17:30:46.25Z", - "definition_id": 349, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "96b5718e-8351-56c3-5739-25aca4951cbb", - "request_id": 4814, - "build_id": 4993, - "build_number": "20220616.1", - "result": "succeeded", - "queue_time": "2022-06-16T17:29:37.07Z", - "start_time": "2022-06-16T17:29:46.7068551Z", - "finish_time": "2022-06-16T17:30:42.82Z", - "assign_time": "2022-06-16T17:29:37.6266667Z", - "definition_id": 349, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", - "request_id": 4813, - "build_id": 4992, - "build_number": "20220616.4", - "result": "succeeded", - "queue_time": "2022-06-16T16:43:34.51Z", - "start_time": "2022-06-16T16:43:44.2748286Z", - "finish_time": "2022-06-16T16:44:20.6766667Z", - "assign_time": "2022-06-16T16:43:34.5766667Z", - "definition_id": 348, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", - "request_id": 4812, - "build_id": 4991, - "build_number": "20220616.3", - "result": "succeeded", - "queue_time": "2022-06-16T16:41:35.46Z", - "start_time": "2022-06-16T16:42:28.9734587Z", - "finish_time": "2022-06-16T16:43:04.1133333Z", - "assign_time": "2022-06-16T16:42:18.79Z", - "definition_id": 348, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", - "request_id": 4811, - "build_id": 4990, - "build_number": "20220616.2", - "result": "succeeded", - "queue_time": "2022-06-16T16:41:33.01Z", - "start_time": "2022-06-16T16:41:39.1022633Z", - "finish_time": "2022-06-16T16:42:17.6266667Z", - "assign_time": "2022-06-16T16:41:33.0466667Z", - "definition_id": 348, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", - "request_id": 4810, - "build_id": 4989, - "build_number": "20220616.1", - "result": "succeeded", - "queue_time": "2022-06-16T16:38:23.73Z", - "start_time": "2022-06-16T16:38:31.5526794Z", - "finish_time": "2022-06-16T16:39:24.4466667Z", - "assign_time": "2022-06-16T16:38:23.78Z", - "definition_id": 348, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f49a274c-3ad8-577d-4e12-e1d1064f5acd", - "request_id": 4809, - "build_id": 4988, - "build_number": "20220616.1", - "result": "succeeded", - "queue_time": "2022-06-16T13:32:49.8Z", - "start_time": "2022-06-16T13:32:58.4026886Z", - "finish_time": "2022-06-16T13:33:55.92Z", - "assign_time": "2022-06-16T13:32:49.83Z", - "definition_id": 347, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4808, - "build_id": 4987, - "build_number": "20220616.1", - "result": "succeeded", - "queue_time": "2022-06-16T03:00:11.1766667Z", - "start_time": "2022-06-16T03:00:22.5372283Z", - "finish_time": "2022-06-16T03:01:24.5266667Z", - "assign_time": "2022-06-16T03:00:11.2266667Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4807, - "build_id": 4986, - "build_number": "20220615.1", - "result": "succeeded", - "queue_time": "2022-06-15T03:00:33.8166667Z", - "start_time": "2022-06-15T03:00:42.3085777Z", - "finish_time": "2022-06-15T03:01:22.8966667Z", - "assign_time": "2022-06-15T03:00:33.99Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", - "request_id": 4806, - "build_id": 4985, - "build_number": "20220615.5", - "result": "succeeded", - "queue_time": "2022-06-15T01:11:01.9033333Z", - "start_time": "2022-06-15T01:11:08.7368515Z", - "finish_time": "2022-06-15T01:11:40.52Z", - "assign_time": "2022-06-15T01:11:01.9533333Z", - "definition_id": 346, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", - "request_id": 4805, - "build_id": 4984, - "build_number": "20220615.4", - "result": "succeeded", - "queue_time": "2022-06-15T01:09:41.66Z", - "start_time": "2022-06-15T01:09:46.540907Z", - "finish_time": "2022-06-15T01:10:24.7733333Z", - "assign_time": "2022-06-15T01:09:41.7166667Z", - "definition_id": 346, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", - "request_id": 4804, - "build_id": 4983, - "build_number": "20220615.3", - "result": "succeeded", - "queue_time": "2022-06-15T01:07:34.76Z", - "start_time": "2022-06-15T01:07:42.5661407Z", - "finish_time": "2022-06-15T01:08:31.1566667Z", - "assign_time": "2022-06-15T01:07:34.7933333Z", - "definition_id": 346, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", - "request_id": 4803, - "build_id": 4982, - "build_number": "20220615.2", - "result": "succeeded", - "queue_time": "2022-06-15T01:06:08.8633333Z", - "start_time": "2022-06-15T01:06:16.1659728Z", - "finish_time": "2022-06-15T01:06:59.35Z", - "assign_time": "2022-06-15T01:06:08.91Z", - "definition_id": 346, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "8a08b103-7f3c-5f4b-1889-6a795acbb007", - "request_id": 4802, - "build_id": 4981, - "build_number": "20220615.1", - "result": "succeeded", - "queue_time": "2022-06-15T01:03:01.6533333Z", - "start_time": "2022-06-15T01:03:18.0155366Z", - "finish_time": "2022-06-15T01:04:11.4933333Z", - "assign_time": "2022-06-15T01:03:01.7066667Z", - "definition_id": 346, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4801, - "build_id": 4979, - "build_number": "20220614.5", - "result": "succeeded", - "queue_time": "2022-06-14T18:05:06.36Z", - "start_time": "2022-06-14T18:05:12.623661Z", - "finish_time": "2022-06-14T18:05:52.0133333Z", - "assign_time": "2022-06-14T18:05:06.39Z", - "definition_id": 345, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4800, - "build_id": 4978, - "build_number": "20220614.4", - "result": "succeeded", - "queue_time": "2022-06-14T18:03:18.52Z", - "start_time": "2022-06-14T18:03:54.1440633Z", - "finish_time": "2022-06-14T18:04:31.9466667Z", - "assign_time": "2022-06-14T18:03:46.45Z", - "definition_id": 345, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4799, - "build_id": 4977, - "build_number": "20220614.3", - "result": "succeeded", - "queue_time": "2022-06-14T18:01:52.21Z", - "start_time": "2022-06-14T18:01:58.7453879Z", - "finish_time": "2022-06-14T18:03:45.4833333Z", - "assign_time": "2022-06-14T18:01:52.26Z", - "definition_id": 345, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4798, - "build_id": 4976, - "build_number": "20220614.2", - "result": "succeeded", - "queue_time": "2022-06-14T15:28:25.7533333Z", - "start_time": "2022-06-14T15:28:32.6992104Z", - "finish_time": "2022-06-14T15:29:21.45Z", - "assign_time": "2022-06-14T15:28:25.8066667Z", - "definition_id": 345, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4797, - "build_id": 4975, - "build_number": "20220614.1", - "result": "succeeded", - "queue_time": "2022-06-14T12:17:08.95Z", - "start_time": "2022-06-14T12:17:18.8926318Z", - "finish_time": "2022-06-14T12:18:13.7033333Z", - "assign_time": "2022-06-14T12:17:09.0133333Z", - "definition_id": 345, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4796, - "build_id": 4974, - "build_number": "20220614.1", - "result": "succeeded", - "queue_time": "2022-06-14T03:00:34.5066667Z", - "start_time": "2022-06-14T03:00:45.4038234Z", - "finish_time": "2022-06-14T03:01:35.7433333Z", - "assign_time": "2022-06-14T03:00:34.7366667Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", - "request_id": 4795, - "build_id": 4973, - "build_number": "20220613.1", - "result": "succeeded", - "queue_time": "2022-06-13T20:54:28.49Z", - "start_time": "2022-06-13T20:54:33.7837792Z", - "finish_time": "2022-06-13T20:55:03.16Z", - "assign_time": "2022-06-13T20:54:28.5433333Z", - "definition_id": 344, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "96b5718e-8351-56c3-5739-25aca4951cbb", - "request_id": 4794, - "build_id": 4973, - "build_number": "20220613.1", - "result": "succeeded", - "queue_time": "2022-06-13T20:52:47.0566667Z", - "start_time": "2022-06-13T20:53:49.595481Z", - "finish_time": "2022-06-13T20:54:25.71Z", - "assign_time": "2022-06-13T20:53:43.38Z", - "definition_id": 344, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "770cf1cf-842d-514f-a534-0e40b52e5eb9", - "request_id": 4793, - "build_id": 4973, - "build_number": "20220613.1", - "result": "succeeded", - "queue_time": "2022-06-13T20:52:46.5766667Z", - "start_time": "2022-06-13T20:52:53.3206427Z", - "finish_time": "2022-06-13T20:53:42.0866667Z", - "assign_time": "2022-06-13T20:52:47Z", - "definition_id": 344, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4792, - "build_id": 4971, - "build_number": "20220613.2", - "result": "succeeded", - "queue_time": "2022-06-13T19:15:21.3633333Z", - "start_time": "2022-06-13T19:15:26.8391575Z", - "finish_time": "2022-06-13T19:16:32.4766667Z", - "assign_time": "2022-06-13T19:15:21.3933333Z", - "definition_id": 343, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4791, - "build_id": 4970, - "build_number": "20220613.1", - "result": "canceled", - "queue_time": "2022-06-13T14:52:48.89Z", - "start_time": "2022-06-13T14:52:55.6525849Z", - "finish_time": "2022-06-13T14:53:15.6Z", - "assign_time": "2022-06-13T14:52:48.93Z", - "definition_id": 343, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4790, - "build_id": 4969, - "build_number": "20220610.1", - "result": "succeeded", - "queue_time": "2022-06-10T03:00:39.9766667Z", - "start_time": "2022-06-10T03:00:48.1022982Z", - "finish_time": "2022-06-10T03:01:28.16Z", - "assign_time": "2022-06-10T03:00:40.02Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "96b5718e-8351-56c3-5739-25aca4951cbb", - "request_id": 4789, - "build_id": 4968, - "build_number": "20220609.4", - "result": "succeeded", - "queue_time": "2022-06-09T23:15:14.8966667Z", - "start_time": "2022-06-09T23:15:32.1992015Z", - "finish_time": "2022-06-09T23:16:44.14Z", - "assign_time": "2022-06-09T23:15:14.9433333Z", - "definition_id": 342, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "96b5718e-8351-56c3-5739-25aca4951cbb", - "request_id": 4788, - "build_id": 4967, - "build_number": "20220609.3", - "result": "succeeded", - "queue_time": "2022-06-09T23:11:44.77Z", - "start_time": "2022-06-09T23:12:41.7997033Z", - "finish_time": "2022-06-09T23:13:42.6766667Z", - "assign_time": "2022-06-09T23:12:20.54Z", - "definition_id": 342, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "e7cc8934-bff9-5085-a925-135ef9f38bb7", - "request_id": 4787, - "build_id": 4966, - "build_number": "20220609.2", - "result": "succeeded", - "queue_time": "2022-06-09T23:10:55.9133333Z", - "start_time": "2022-06-09T23:11:12.9041217Z", - "finish_time": "2022-06-09T23:12:19.8766667Z", - "assign_time": "2022-06-09T23:10:55.96Z", - "definition_id": 342, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4786, - "build_id": 4964, - "build_number": "20220608.1", - "result": "failed", - "queue_time": "2022-06-08T13:14:29.9966667Z", - "start_time": "2022-06-08T13:14:40.142744Z", - "finish_time": "2022-06-08T13:15:07.98Z", - "assign_time": "2022-06-08T13:14:30.0733333Z", - "definition_id": 341, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4785, - "build_id": 4963, - "build_number": "20220608.1", - "result": "succeeded", - "queue_time": "2022-06-08T03:00:27.1933333Z", - "start_time": "2022-06-08T03:00:37.7326633Z", - "finish_time": "2022-06-08T03:01:23.57Z", - "assign_time": "2022-06-08T03:00:27.3433333Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", - "request_id": 4784, - "build_id": 4962, - "build_number": "20220608.1", - "result": "succeeded", - "queue_time": "2022-06-08T00:05:33.2366667Z", - "start_time": "2022-06-08T00:06:58.6753145Z", - "finish_time": "2022-06-08T00:07:36.6933333Z", - "assign_time": "2022-06-08T00:06:52.6433333Z", - "definition_id": 340, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7f33e5bd-7764-5d8a-ba2e-506e078b9c3f", - "request_id": 4783, - "build_id": 4962, - "build_number": "20220608.1", - "result": "succeeded", - "queue_time": "2022-06-08T00:05:33.1066667Z", - "start_time": "2022-06-08T00:06:20.4867796Z", - "finish_time": "2022-06-08T00:06:51.75Z", - "assign_time": "2022-06-08T00:06:14.52Z", - "definition_id": 340, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "8ae2eb52-5c5e-5cc0-86a8-c8e3a47323bc", - "request_id": 4782, - "build_id": 4961, - "build_number": "20220608.1", - "result": "succeeded", - "queue_time": "2022-06-08T00:05:33.0733333Z", - "start_time": "2022-06-08T00:05:38.4492051Z", - "finish_time": "2022-06-08T00:06:13.44Z", - "assign_time": "2022-06-08T00:05:33.1266667Z", - "definition_id": 325, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "84b38d06-9c04-5368-793c-b23b09eae486", - "request_id": 4781, - "build_id": 4961, - "build_number": "20220608.1", - "result": "succeeded", - "queue_time": "2022-06-08T00:04:38.9433333Z", - "start_time": "2022-06-08T00:04:48.0362066Z", - "finish_time": "2022-06-08T00:05:30.4266667Z", - "assign_time": "2022-06-08T00:04:38.9966667Z", - "definition_id": 325, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4780, - "build_id": 4959, - "build_number": "20220607.1", - "result": "succeeded", - "queue_time": "2022-06-07T23:59:23.0066667Z", - "start_time": "2022-06-07T23:59:28.9296371Z", - "finish_time": "2022-06-08T00:00:11.3666667Z", - "assign_time": "2022-06-07T23:59:23.0533333Z", - "definition_id": 339, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f6a5a278-544f-5c37-fc65-8137ad8b190a", - "request_id": 4779, - "build_id": 4957, - "build_number": "20220607.2", - "result": "succeeded", - "queue_time": "2022-06-07T16:45:15.15Z", - "start_time": "2022-06-07T16:45:24.8864484Z", - "finish_time": "2022-06-07T16:46:14.3466667Z", - "assign_time": "2022-06-07T16:45:15.2266667Z", - "definition_id": 338, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4778, - "build_id": 4956, - "build_number": "20220607.1", - "result": "succeeded", - "queue_time": "2022-06-07T14:08:10.37Z", - "start_time": "2022-06-07T14:08:17.318738Z", - "finish_time": "2022-06-07T14:08:54.2133333Z", - "assign_time": "2022-06-07T14:08:10.59Z", - "definition_id": 338, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4777, - "build_id": 4955, - "build_number": "20220607.1", - "result": "succeeded", - "queue_time": "2022-06-07T03:00:15.6166667Z", - "start_time": "2022-06-07T03:00:25.9756802Z", - "finish_time": "2022-06-07T03:00:58.9866667Z", - "assign_time": "2022-06-07T03:00:15.65Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ee56171e-484e-5be7-66f8-b1e9ffecbd76", - "request_id": 4776, - "build_id": 4954, - "build_number": "20220606.2", - "result": "succeeded", - "queue_time": "2022-06-06T20:48:25.1133333Z", - "start_time": "2022-06-06T20:48:32.5939862Z", - "finish_time": "2022-06-06T20:49:06.02Z", - "assign_time": "2022-06-06T20:48:25.1733333Z", - "definition_id": 337, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "a7354074-cd99-5827-f297-ae1ad048aa7f", - "request_id": 4775, - "build_id": 4954, - "build_number": "20220606.2", - "result": "succeeded", - "queue_time": "2022-06-06T20:47:43.7966667Z", - "start_time": "2022-06-06T20:47:49.9218478Z", - "finish_time": "2022-06-06T20:48:22.8966667Z", - "assign_time": "2022-06-06T20:47:43.8266667Z", - "definition_id": 337, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "a61b6905-783f-5911-c1fc-26d53e150a46", - "request_id": 4774, - "build_id": 4954, - "build_number": "20220606.2", - "result": "succeeded", - "queue_time": "2022-06-06T20:46:57.98Z", - "start_time": "2022-06-06T20:47:03.5047383Z", - "finish_time": "2022-06-06T20:47:41.34Z", - "assign_time": "2022-06-06T20:46:58.0266667Z", - "definition_id": 337, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "84b38d06-9c04-5368-793c-b23b09eae486", - "request_id": 4773, - "build_id": 4954, - "build_number": "20220606.2", - "result": "succeeded", - "queue_time": "2022-06-06T20:46:04.26Z", - "start_time": "2022-06-06T20:46:10.3570751Z", - "finish_time": "2022-06-06T20:46:55.7033333Z", - "assign_time": "2022-06-06T20:46:04.2933333Z", - "definition_id": 337, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4772, - "build_id": 4952, - "build_number": "20220606.1", - "result": "succeeded", - "queue_time": "2022-06-06T20:21:55.8866667Z", - "start_time": "2022-06-06T20:22:01.0872778Z", - "finish_time": "2022-06-06T20:22:42.65Z", - "assign_time": "2022-06-06T20:21:56.0366667Z", - "definition_id": 336, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4771, - "build_id": 4950, - "build_number": "20220606.1", - "result": "succeeded", - "queue_time": "2022-06-06T14:15:27.4933333Z", - "start_time": "2022-06-06T14:15:37.1719797Z", - "finish_time": "2022-06-06T14:16:17.2433333Z", - "assign_time": "2022-06-06T14:15:27.99Z", - "definition_id": 334, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4770, - "build_id": 4948, - "build_number": "20220606.8", - "result": "succeeded", - "queue_time": "2022-06-06T13:18:05.21Z", - "start_time": "2022-06-06T13:18:10.923692Z", - "finish_time": "2022-06-06T13:18:51.6533333Z", - "assign_time": "2022-06-06T13:18:05.2366667Z", - "definition_id": 333, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4769, - "build_id": 4947, - "build_number": "20220606.7", - "result": "succeeded", - "queue_time": "2022-06-06T13:02:06.3566667Z", - "start_time": "2022-06-06T13:02:12.72664Z", - "finish_time": "2022-06-06T13:02:39.5933333Z", - "assign_time": "2022-06-06T13:02:06.39Z", - "definition_id": 333, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - } -] + { + "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", + "request_id": 4278, + "build_id": 4567, + "build_number": "20220405.1", + "result": "succeeded", + "queue_time": "2022-09-01T17:43:43.73Z", + "start_time": "2022-09-01T17:43:46.2405003Z", + "finish_time": "2022-09-01T17:44:41.4733333Z", + "assign_time": "2022-09-01T17:43:43.98Z", + "definition_id": 220, + "runner_name": "MacBook", + "os_description": "Darwin", + "runner_group": "Default" + }, + { + "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", + "request_id": 4273, + "build_id": 4558, + "build_number": "20220405.2", + "result": "succeeded", + "queue_time": "2022-09-01T00:29:56.47Z", + "start_time": "2022-09-01T00:29:59.3679242Z", + "finish_time": "2022-09-01T00:30:21.0533333Z", + "assign_time": "2022-09-01T00:29:56.6966667Z", + "definition_id": 217, + "runner_name": "MacBook", + "os_description": "Darwin", + "runner_group": "Default" + }, + { + "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", + "request_id": 4272, + "build_id": 4556, + "build_number": "20220405.1", + "result": "succeeded", + "queue_time": "2022-09-01T00:26:22.6266667Z", + "start_time": "2022-09-01T00:26:25.2735844Z", + "finish_time": "2022-09-01T00:26:51.95Z", + "assign_time": "2022-09-01T00:26:22.6733333Z", + "definition_id": 217, + "runner_name": "MacBook", + "os_description": "Darwin", + "runner_group": "Default" + }, + { + "id": "ca395085-040a-526b-2ce8-bdc85f692774", + "request_id": 4954, + "build_id": 5151, + "build_number": "20220819.1", + "result": "failed", + "queue_time": "2022-09-01T16:58:13.8166667Z", + "start_time": "2022-09-01T16:58:25.0096333Z", + "finish_time": "2022-09-01T16:58:47.5866667Z", + "assign_time": "2022-09-01T16:58:14.25Z", + "definition_id": 51, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4953, + "build_id": 5150, + "build_number": "20220811.1", + "result": "succeeded", + "queue_time": "2022-09-01T03:00:36.7433333Z", + "start_time": "2022-09-01T03:00:48.3427295Z", + "finish_time": "2022-09-01T03:01:48.44Z", + "assign_time": "2022-09-01T03:00:36.98Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4952, + "build_id": 5149, + "build_number": "20220810.8", + "result": "succeeded", + "queue_time": "2022-09-01T22:24:17.5133333Z", + "start_time": "2022-09-01T22:28:41.8831876Z", + "finish_time": "2022-09-01T22:31:12.17Z", + "assign_time": "2022-09-01T22:28:28.5333333Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4951, + "build_id": 5145, + "build_number": "20220810.7", + "result": "succeeded", + "queue_time": "2022-09-01T22:24:16.2266667Z", + "start_time": "2022-09-01T22:24:32.7143159Z", + "finish_time": "2022-09-01T22:28:27.7133333Z", + "assign_time": "2022-09-01T22:24:16.2633333Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4950, + "build_id": 5144, + "build_number": "20220810.6", + "result": "failed", + "queue_time": "2022-09-01T22:16:23.8866667Z", + "start_time": "2022-09-01T22:18:53.7076646Z", + "finish_time": "2022-09-01T22:21:10.2933333Z", + "assign_time": "2022-09-01T22:18:36.9166667Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4949, + "build_id": 5143, + "build_number": "20220810.5", + "result": "failed", + "queue_time": "2022-09-01T22:10:05.1666667Z", + "start_time": "2022-09-01T22:15:12.6511213Z", + "finish_time": "2022-09-01T22:18:36.0266667Z", + "assign_time": "2022-09-01T22:14:53.49Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4948, + "build_id": 5139, + "build_number": "20220810.4", + "result": "failed", + "queue_time": "2022-09-01T23:09:36.2133333Z", + "start_time": "2022-09-01T23:11:57.7706354Z", + "finish_time": "2022-09-01T23:14:52.64Z", + "assign_time": "2022-09-01T23:11:41.84Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4947, + "build_id": 5135, + "build_number": "20220810.3", + "result": "failed", + "queue_time": "2022-09-01T23:08:11.87Z", + "start_time": "2022-09-01T23:09:49.6121805Z", + "finish_time": "2022-09-01T23:11:41.2033333Z", + "assign_time": "2022-09-01T22:09:38.72Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4946, + "build_id": 5131, + "build_number": "20220810.2", + "result": "failed", + "queue_time": "2022-09-01T22:07:03.78Z", + "start_time": "2022-09-01T22:07:24.865421Z", + "finish_time": "2022-09-01T22:09:37.6433333Z", + "assign_time": "2022-09-01T22:07:04.03Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4945, + "build_id": 5127, + "build_number": "20220810.1", + "result": "failed", + "queue_time": "2022-09-01T22:05:16.8433333Z", + "start_time": "2022-09-01T22:05:40.1526981Z", + "finish_time": "2022-09-01T22:06:51.0533333Z", + "assign_time": "2022-09-01T22:05:16.9066667Z", + "definition_id": 391, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4944, + "build_id": 5120, + "build_number": "20220810.2", + "result": "failed", + "queue_time": "2022-09-01T20:54:58.1433333Z", + "start_time": "2022-09-01T20:55:56.6551759Z", + "finish_time": "2022-09-01T20:56:27.06Z", + "assign_time": "2022-09-01T20:55:43.2933333Z", + "definition_id": 382, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4943, + "build_id": 5117, + "build_number": "20220810.1", + "result": "failed", + "queue_time": "2022-09-01T20:54:52.31Z", + "start_time": "2022-09-01T20:55:09.3477439Z", + "finish_time": "2022-09-01T20:55:42.0333333Z", + "assign_time": "2022-09-01T20:54:52.3666667Z", + "definition_id": 382, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4941, + "build_id": 5115, + "build_number": "20220808.1", + "result": "failed", + "queue_time": "2022-09-01T17:56:30.37Z", + "start_time": "2022-09-01T17:56:48.1800943Z", + "finish_time": "2022-09-01T17:57:29.7733333Z", + "assign_time": "2022-09-01T17:56:30.4Z", + "definition_id": 382, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4940, + "build_id": 5112, + "build_number": "5112", + "result": "succeeded", + "queue_time": "2022-09-01T17:51:29.1566667Z", + "start_time": "2022-09-01T17:51:47.1020425Z", + "finish_time": "2022-09-01T17:52:37.01Z", + "assign_time": "2022-09-01T17:51:29.22Z", + "definition_id": 389, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "cfa20e98-6997-523c-4233-f0a7302c929f", + "request_id": 4938, + "build_id": 5110, + "build_number": "5110", + "result": "succeeded", + "queue_time": "2022-09-01T23:37:25.4433333Z", + "start_time": "2022-09-01T23:39:01.1647409Z", + "finish_time": "2022-09-01T23:39:53.2166667Z", + "assign_time": "2022-09-01T23:38:49.5033333Z", + "definition_id": 381, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4937, + "build_id": 5110, + "build_number": "5110", + "result": "succeeded", + "queue_time": "2022-09-01T23:37:25.4233333Z", + "start_time": "2022-09-01T23:37:41.9972446Z", + "finish_time": "2022-09-01T23:38:48.7133333Z", + "assign_time": "2022-09-01T23:37:25.7066667Z", + "definition_id": 381, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "899a9724-4530-558a-15f1-375d2bccc79e", + "request_id": 4934, + "build_id": 5105, + "build_number": "20220725.2", + "result": "succeeded", + "queue_time": "2022-09-01T21:35:31.2933333Z", + "start_time": "2022-09-01T21:35:36.7385249Z", + "finish_time": "2022-09-01T21:36:30.7066667Z", + "assign_time": "2022-09-01T21:35:31.3466667Z", + "definition_id": 378, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "899a9724-4530-558a-15f1-375d2bccc79e", + "request_id": 4933, + "build_id": 5104, + "build_number": "20220725.1", + "result": "succeeded", + "queue_time": "2022-09-01T20:50:01.22Z", + "start_time": "2022-09-01T20:50:07.4147643Z", + "finish_time": "2022-09-01T20:50:54.54Z", + "assign_time": "2022-09-01T20:50:01.46Z", + "definition_id": 378, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4931, + "build_id": 5101, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-09-01T18:45:50.1866667Z", + "start_time": "2022-09-01T18:45:56.8851106Z", + "finish_time": "2022-09-01T18:46:10.4233333Z", + "assign_time": "2022-09-01T18:45:50.28Z", + "definition_id": 380, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "96c60851-4ac0-512f-ac8a-daf36b6a2b26", + "request_id": 4930, + "build_id": 5100, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-09-01T18:43:47.0133333Z", + "start_time": "2022-09-01T18:44:44.683617Z", + "finish_time": "2022-09-01T18:44:57.0366667Z", + "assign_time": "2022-09-01T18:44:23.9933333Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ca395085-040a-526b-2ce8-bdc85f692774", + "request_id": 4929, + "build_id": 5100, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-09-01T18:43:46.7466667Z", + "start_time": "2022-09-01T18:44:11.1374529Z", + "finish_time": "2022-09-01T18:44:23.3633333Z", + "assign_time": "2022-09-01T18:44:04.8533333Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "341b3d8e-0d13-57d4-859b-65d31dcbc29e", + "request_id": 4928, + "build_id": 5100, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-09-01T18:43:46.7433333Z", + "start_time": "2022-09-01T18:43:53.5495773Z", + "finish_time": "2022-09-01T18:44:03.7166667Z", + "assign_time": "2022-09-01T18:43:46.7733333Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4927, + "build_id": 5098, + "build_number": "20220718.1", + "result": "succeeded", + "queue_time": "2022-09-01T18:40:39.23Z", + "start_time": "2022-09-01T18:40:49.010239Z", + "finish_time": "2022-09-01T18:41:32.5133333Z", + "assign_time": "2022-09-01T18:40:39.2966667Z", + "definition_id": 379, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "899a9724-4530-558a-15f1-375d2bccc79e", + "request_id": 4925, + "build_id": 5096, + "build_number": "20220715.1", + "result": "succeeded", + "queue_time": "2022-09-01T15:54:11.64Z", + "start_time": "2022-09-01T15:54:17.2876517Z", + "finish_time": "2022-09-01T15:55:05.1266667Z", + "assign_time": "2022-09-01T15:54:11.7066667Z", + "definition_id": 378, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "899a9724-4530-558a-15f1-375d2bccc79e", + "request_id": 4923, + "build_id": 5091, + "build_number": "20220714.1", + "result": "succeeded", + "queue_time": "2022-09-01T20:44:28.6066667Z", + "start_time": "2022-09-01T20:44:37.1245218Z", + "finish_time": "2022-09-01T20:45:43.04Z", + "assign_time": "2022-09-01T20:44:28.9166667Z", + "definition_id": 378, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4921, + "build_id": 5089, + "build_number": "20220713.1", + "result": "succeeded", + "queue_time": "2022-09-01T20:25:18.7966667Z", + "start_time": "2022-09-01T20:25:28.2135186Z", + "finish_time": "2022-09-01T20:26:16.3533333Z", + "assign_time": "2022-09-01T20:25:18.9966667Z", + "definition_id": 377, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4920, + "build_id": 5084, + "build_number": "20220713.1", + "result": "succeeded", + "queue_time": "2022-09-01T13:46:02.8033333Z", + "start_time": "2022-09-01T13:47:12.5184633Z", + "finish_time": "2022-09-01T13:47:53.0966667Z", + "assign_time": "2022-09-01T13:47:03.9233333Z", + "definition_id": 373, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4919, + "build_id": 5083, + "build_number": "20220713.1", + "result": "failed", + "queue_time": "2022-09-01T13:46:01.12Z", + "start_time": "2022-09-01T13:46:13.2306562Z", + "finish_time": "2022-09-01T13:47:02.71Z", + "assign_time": "2022-09-01T13:46:01.1766667Z", + "definition_id": 372, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4918, + "build_id": 5080, + "build_number": "20220712.1", + "result": "failed", + "queue_time": "2022-09-01T17:06:15.5033333Z", + "start_time": "2022-09-01T17:06:26.1795208Z", + "finish_time": "2022-09-01T17:06:55.86Z", + "assign_time": "2022-09-01T17:06:15.74Z", + "definition_id": 376, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4917, + "build_id": 5079, + "build_number": "20220712.1", + "result": "succeeded", + "queue_time": "2022-09-01T14:48:45.8033333Z", + "start_time": "2022-09-01T14:48:52.8152685Z", + "finish_time": "2022-09-01T14:49:43.0233333Z", + "assign_time": "2022-09-01T14:48:46.3166667Z", + "definition_id": 375, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ca395085-040a-526b-2ce8-bdc85f692774", + "request_id": 4915, + "build_id": 5077, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-09-01T22:08:51.9533333Z", + "start_time": "2022-09-01T22:09:03.1483001Z", + "finish_time": "2022-09-01T22:09:24.9666667Z", + "assign_time": "2022-09-01T22:08:52.1566667Z", + "definition_id": 51, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4914, + "build_id": 5076, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-09-01T20:42:40.6Z", + "start_time": "2022-09-01T20:43:19.0923053Z", + "finish_time": "2022-09-01T20:43:30.9233333Z", + "assign_time": "2022-09-01T20:43:11.27Z", + "definition_id": 374, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "96c60851-4ac0-512f-ac8a-daf36b6a2b26", + "request_id": 4913, + "build_id": 5075, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-09-01T20:42:13.6133333Z", + "start_time": "2022-09-01T20:42:59.2918804Z", + "finish_time": "2022-09-01T20:43:10.2133333Z", + "assign_time": "2022-09-01T20:42:51.9266667Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ca395085-040a-526b-2ce8-bdc85f692774", + "request_id": 4912, + "build_id": 5075, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-09-01T20:42:13.5566667Z", + "start_time": "2022-09-01T20:42:39.2587562Z", + "finish_time": "2022-09-01T20:42:50.9533333Z", + "assign_time": "2022-09-01T20:42:30.8066667Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "341b3d8e-0d13-57d4-859b-65d31dcbc29e", + "request_id": 4911, + "build_id": 5075, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-09-01T20:42:13.5466667Z", + "start_time": "2022-09-01T20:42:20.169292Z", + "finish_time": "2022-09-01T20:42:30.1066667Z", + "assign_time": "2022-09-01T20:42:13.5933333Z", + "definition_id": 197, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4910, + "build_id": 5073, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-09-01T20:40:33.65Z", + "start_time": "2022-09-01T20:40:39.6509289Z", + "finish_time": "2022-09-01T20:41:39.77Z", + "assign_time": "2022-09-01T20:40:33.88Z", + "definition_id": 373, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4909, + "build_id": 5072, + "build_number": "20220711.1", + "result": "canceled", + "queue_time": "2022-09-01T15:02:41.43Z", + "start_time": "2022-09-01T15:02:52.8313534Z", + "finish_time": "2022-09-01T15:02:58.06Z", + "assign_time": "2022-09-01T15:02:41.4766667Z", + "definition_id": 372, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4908, + "build_id": 5071, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-09-01T14:58:14.99Z", + "start_time": "2022-09-01T14:58:21.4957133Z", + "finish_time": "2022-09-01T14:58:41.8933333Z", + "assign_time": "2022-09-01T14:58:15.0266667Z", + "definition_id": 371, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4907, + "build_id": 5070, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-09-01T14:31:09.8066667Z", + "start_time": "2022-09-01T14:31:24.8007924Z", + "finish_time": "2022-09-01T14:31:59.3633333Z", + "assign_time": "2022-09-01T14:31:09.8633333Z", + "definition_id": 370, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4906, + "build_id": 5069, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-09-01T14:28:25.6866667Z", + "start_time": "2022-09-01T14:28:32.763647Z", + "finish_time": "2022-09-01T14:28:46.5933333Z", + "assign_time": "2022-09-01T14:28:25.73Z", + "definition_id": 369, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "76ed1102-9071-5354-720f-6f09bbc9f0c0", + "request_id": 4905, + "build_id": 5068, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-09-01T14:24:10.3233333Z", + "start_time": "2022-09-01T14:25:07.2541035Z", + "finish_time": "2022-09-01T14:25:34.6333333Z", + "assign_time": "2022-09-01T14:25:00.7966667Z", + "definition_id": 368, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "00b6a206-eb91-585b-3d14-cf1a4d7b1970", + "request_id": 4904, + "build_id": 5068, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-09-01T14:24:10.15Z", + "start_time": "2022-09-01T14:24:42.1401754Z", + "finish_time": "2022-09-01T14:25:00.07Z", + "assign_time": "2022-09-01T14:24:34.3Z", + "definition_id": 368, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "19c563d8-3dcd-57d1-cd5e-9dd946b0a29b", + "request_id": 4903, + "build_id": 5068, + "build_number": "20220711.1", + "result": "failed", + "queue_time": "2022-09-01T14:24:10.14Z", + "start_time": "2022-09-01T14:24:16.1904439Z", + "finish_time": "2022-09-01T14:24:33.44Z", + "assign_time": "2022-09-01T14:24:10.17Z", + "definition_id": 368, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4902, + "build_id": 5067, + "build_number": "20220711.1", + "result": "succeeded", + "queue_time": "2022-09-01T14:18:10.19Z", + "start_time": "2022-09-01T14:18:18.3555844Z", + "finish_time": "2022-09-01T14:19:22.6266667Z", + "assign_time": "2022-09-01T14:18:10.3466667Z", + "definition_id": 367, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "6a659b14-a5ad-5ce8-05ff-9105f4d16f55", + "request_id": 4901, + "build_id": 107, + "build_number": "Release-1 / Stage 1", + "result": "succeeded", + "queue_time": "2022-09-01T20:15:02.33Z", + "start_time": "2022-09-01T20:15:43.3995066Z", + "finish_time": "2022-09-01T20:15:51.7133333Z", + "assign_time": "2022-09-01T20:15:32.3933333Z", + "definition_id": 14, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "3b770d45-ae29-59a7-a774-67c6a1476782", + "request_id": 4900, + "build_id": 108, + "build_number": "Release-1 / Stage 2", + "result": "succeeded", + "queue_time": "2022-09-01T20:14:52.4266667Z", + "start_time": "2022-09-01T20:15:10.1184454Z", + "finish_time": "2022-09-01T20:15:31.55Z", + "assign_time": "2022-09-01T20:14:52.7866667Z", + "definition_id": 14, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4899, + "build_id": 5066, + "build_number": "5066", + "result": "succeeded", + "queue_time": "2022-09-01T13:49:34.8366667Z", + "start_time": "2022-09-01T13:49:44.5760594Z", + "finish_time": "2022-09-01T13:52:18.75Z", + "assign_time": "2022-09-01T13:49:35.0133333Z", + "definition_id": 366, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4898, + "build_id": 5065, + "build_number": "5065", + "result": "succeeded", + "queue_time": "2022-09-01T13:20:41.41Z", + "start_time": "2022-09-01T13:20:48.1950176Z", + "finish_time": "2022-09-01T13:24:58.39Z", + "assign_time": "2022-09-01T13:20:41.4533333Z", + "definition_id": 365, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4897, + "build_id": 5064, + "build_number": "5064", + "result": "succeeded", + "queue_time": "2022-09-01T12:35:50.17Z", + "start_time": "2022-09-01T12:35:57.4102501Z", + "finish_time": "2022-09-01T12:39:10.7633333Z", + "assign_time": "2022-09-01T12:35:50.23Z", + "definition_id": 365, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4896, + "build_id": 5063, + "build_number": "20220630.1", + "result": "succeeded", + "queue_time": "2022-09-01T03:00:17.8733333Z", + "start_time": "2022-09-01T03:00:26.8409899Z", + "finish_time": "2022-09-01T03:01:50.0266667Z", + "assign_time": "2022-09-01T03:00:17.91Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4895, + "build_id": 5061, + "build_number": "20220629.2", + "result": "succeeded", + "queue_time": "2022-09-01T19:51:17.76Z", + "start_time": "2022-09-01T19:51:23.9334952Z", + "finish_time": "2022-09-01T19:52:46.86Z", + "assign_time": "2022-09-01T19:51:17.82Z", + "definition_id": 364, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4894, + "build_id": 5058, + "build_number": "20220629.1", + "result": "succeeded", + "queue_time": "2022-09-01T19:41:00.17Z", + "start_time": "2022-09-01T19:41:08.6550627Z", + "finish_time": "2022-09-01T19:44:41.7466667Z", + "assign_time": "2022-09-01T19:41:00.45Z", + "definition_id": 364, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4893, + "build_id": 5054, + "build_number": "20220629.1", + "result": "succeeded", + "queue_time": "2022-09-01T03:00:36.52Z", + "start_time": "2022-09-01T03:00:45.436629Z", + "finish_time": "2022-09-01T03:01:57.1366667Z", + "assign_time": "2022-09-01T03:00:36.56Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", + "request_id": 4892, + "build_id": 5052, + "build_number": "20220628.7", + "result": "succeeded", + "queue_time": "2022-09-01T19:11:13.5933333Z", + "start_time": "2022-09-01T19:11:21.6684563Z", + "finish_time": "2022-09-01T19:12:21.8866667Z", + "assign_time": "2022-09-01T19:11:13.6466667Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", + "request_id": 4891, + "build_id": 5051, + "build_number": "20220628.6", + "result": "succeeded", + "queue_time": "2022-09-01T16:45:46.73Z", + "start_time": "2022-09-01T16:45:56.8715565Z", + "finish_time": "2022-09-01T16:46:56.2666667Z", + "assign_time": "2022-09-01T16:45:46.7633333Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", + "request_id": 4890, + "build_id": 5050, + "build_number": "20220628.5", + "result": "failed", + "queue_time": "2022-09-01T16:42:49.2Z", + "start_time": "2022-09-01T16:42:54.4510649Z", + "finish_time": "2022-09-01T16:43:09.88Z", + "assign_time": "2022-09-01T16:42:49.2266667Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", + "request_id": 4889, + "build_id": 5049, + "build_number": "20220628.4", + "result": "failed", + "queue_time": "2022-09-01T16:38:35.2Z", + "start_time": "2022-09-01T16:38:41.1860027Z", + "finish_time": "2022-09-01T16:38:56.49Z", + "assign_time": "2022-09-01T16:38:35.2633333Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", + "request_id": 4888, + "build_id": 5048, + "build_number": "20220628.3", + "result": "succeeded", + "queue_time": "2022-09-01T16:31:50.58Z", + "start_time": "2022-09-01T16:31:56.974368Z", + "finish_time": "2022-09-01T16:32:57.4933333Z", + "assign_time": "2022-09-01T16:31:50.6066667Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", + "request_id": 4887, + "build_id": 5047, + "build_number": "20220628.2", + "result": "succeeded", + "queue_time": "2022-09-01T16:27:16.41Z", + "start_time": "2022-09-01T16:27:25.7030557Z", + "finish_time": "2022-09-01T16:28:07.04Z", + "assign_time": "2022-09-01T16:27:16.68Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", + "request_id": 4886, + "build_id": 5046, + "build_number": "20220628.1", + "result": "succeeded", + "queue_time": "2022-09-01T16:10:15.1866667Z", + "start_time": "2022-09-01T16:10:22.632602Z", + "finish_time": "2022-09-01T16:11:00.95Z", + "assign_time": "2022-09-01T16:10:15.4566667Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4885, + "build_id": 5045, + "build_number": "20220628.1", + "result": "succeeded", + "queue_time": "2022-09-01T03:00:17.8566667Z", + "start_time": "2022-09-01T03:00:30.6344983Z", + "finish_time": "2022-09-01T03:01:10.2466667Z", + "assign_time": "2022-09-01T03:00:17.8966667Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", + "request_id": 4884, + "build_id": 5043, + "build_number": "20220627.2", + "result": "succeeded", + "queue_time": "2022-09-01T17:47:08.16Z", + "start_time": "2022-09-01T17:47:15.987734Z", + "finish_time": "2022-09-01T17:50:44.12Z", + "assign_time": "2022-09-01T17:47:08.4933333Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ca395085-040a-526b-2ce8-bdc85f692774", + "request_id": 4883, + "build_id": 5042, + "build_number": "20220627.1", + "result": "canceled", + "queue_time": "2022-09-01T17:26:33.07Z", + "start_time": "2022-09-01T17:26:39.6690274Z", + "finish_time": "2022-09-01T17:26:55.87Z", + "assign_time": "2022-09-01T17:26:33.49Z", + "definition_id": 168, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", + "request_id": 4882, + "build_id": 5035, + "build_number": "20220627.1", + "result": "succeeded", + "queue_time": "2022-09-01T16:21:06.4833333Z", + "start_time": "2022-09-01T16:21:11.8349063Z", + "finish_time": "2022-09-01T16:21:58.5633333Z", + "assign_time": "2022-09-01T16:21:06.54Z", + "definition_id": 363, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "a528ef4b-e2e0-565b-271a-65845573d880", + "request_id": 4871, + "build_id": 5032, + "build_number": "20220623.1", + "result": "canceled", + "queue_time": "2022-09-01T00:30:56.79Z", + "start_time": "2022-09-01T00:31:01.9918715Z", + "finish_time": "2022-09-01T00:31:19.5833333Z", + "assign_time": "2022-09-01T00:30:56.8533333Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4870, + "build_id": 5031, + "build_number": "5031", + "result": "succeeded", + "queue_time": "2022-09-01T18:52:57.21Z", + "start_time": "2022-09-01T18:54:41.9650756Z", + "finish_time": "2022-09-01T18:55:41.29Z", + "assign_time": "2022-09-01T18:54:25.0866667Z", + "definition_id": 361, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "cfa20e98-6997-523c-4233-f0a7302c929f", + "request_id": 4869, + "build_id": 5031, + "build_number": "5031", + "result": "succeeded", + "queue_time": "2022-09-01T18:52:57.2Z", + "start_time": "2022-09-01T18:53:14.9752109Z", + "finish_time": "2022-09-01T18:54:24.2033333Z", + "assign_time": "2022-09-01T18:52:57.2233333Z", + "definition_id": 361, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4868, + "build_id": 5029, + "build_number": "5029", + "result": "succeeded", + "queue_time": "2022-09-01T13:01:36.7433333Z", + "start_time": "2022-09-01T13:03:00.7879139Z", + "finish_time": "2022-09-01T13:03:57.8833333Z", + "assign_time": "2022-09-01T13:02:40.4833333Z", + "definition_id": 360, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "cfa20e98-6997-523c-4233-f0a7302c929f", + "request_id": 4867, + "build_id": 5029, + "build_number": "5029", + "result": "succeeded", + "queue_time": "2022-09-01T13:01:36.48Z", + "start_time": "2022-09-01T13:01:51.5040284Z", + "finish_time": "2022-09-01T13:02:39.8466667Z", + "assign_time": "2022-09-01T13:01:36.9533333Z", + "definition_id": 360, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "f8252943-765e-554e-090d-5571acebf4bb", + "request_id": 4866, + "build_id": 5028, + "build_number": "20220622.1", + "result": "succeeded", + "queue_time": "2022-09-01T03:00:34.3866667Z", + "start_time": "2022-09-01T03:00:42.8728772Z", + "finish_time": "2022-09-01T03:01:23.4566667Z", + "assign_time": "2022-09-01T03:00:34.5533333Z", + "definition_id": 135, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4865, + "build_id": 5027, + "build_number": "5027", + "result": "succeeded", + "queue_time": "2022-09-01T18:08:56.53Z", + "start_time": "2022-09-01T18:09:05.5510972Z", + "finish_time": "2022-09-01T18:09:53.5Z", + "assign_time": "2022-09-01T18:08:56.7066667Z", + "definition_id": 361, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "5daf491e-fc1d-52d4-3c36-b35e31684732", + "request_id": 4864, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-09-01T17:04:17.85Z", + "start_time": "2022-09-01T17:06:53.9745617Z", + "finish_time": "2022-09-01T17:07:25.3266667Z", + "assign_time": "2022-09-01T17:06:44.67Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ce39968d-2aee-58c0-6354-4429990bc777", + "request_id": 4863, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-09-01T17:03:33.3766667Z", + "start_time": "2022-09-01T17:06:01.1201953Z", + "finish_time": "2022-09-01T17:06:43.8966667Z", + "assign_time": "2022-09-01T17:05:54.9566667Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "2431e782-2f38-5ac4-c2f8-af294f6d514a", + "request_id": 4862, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-09-01T17:02:20.06Z", + "start_time": "2022-09-01T17:05:07.8148768Z", + "finish_time": "2022-09-01T17:05:54.32Z", + "assign_time": "2022-09-01T17:05:00.4Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "a528ef4b-e2e0-565b-271a-65845573d880", + "request_id": 4861, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-09-01T17:02:19.9Z", + "start_time": "2022-09-01T17:04:22.8635006Z", + "finish_time": "2022-09-01T17:04:59.4966667Z", + "assign_time": "2022-09-01T17:04:16.2166667Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "54beca5a-7b68-5580-ddd0-8aef5b91640f", + "request_id": 4860, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-09-01T17:02:18.9633333Z", + "start_time": "2022-09-01T17:03:35.4472694Z", + "finish_time": "2022-09-01T17:04:15.2066667Z", + "assign_time": "2022-09-01T17:03:27.2Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7cb24041-3325-5b8a-c38d-87131110a6bf", + "request_id": 4859, + "build_id": 5026, + "build_number": "20220621.2", + "result": "succeeded", + "queue_time": "2022-09-01T17:02:17.9Z", + "start_time": "2022-09-01T17:02:51.4121619Z", + "finish_time": "2022-09-01T17:03:26.3666667Z", + "assign_time": "2022-09-01T17:02:43.3566667Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", + "request_id": 4858, + "build_id": 5025, + "build_number": "5025", + "result": "succeeded", + "queue_time": "2022-09-01T17:01:39.48Z", + "start_time": "2022-09-01T17:01:52.5755448Z", + "finish_time": "2022-09-01T17:02:42.6633333Z", + "assign_time": "2022-09-01T17:01:39.54Z", + "definition_id": 360, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", + "request_id": 4857, + "build_id": 5024, + "build_number": "20220621.1", + "result": "succeeded", + "queue_time": "2022-09-01T16:59:29.8433333Z", + "start_time": "2022-09-01T17:00:18.7374553Z", + "finish_time": "2022-09-01T17:00:47.1933333Z", + "assign_time": "2022-09-01T17:00:11.0233333Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "a528ef4b-e2e0-565b-271a-65845573d880", + "request_id": 4856, + "build_id": 5024, + "build_number": "20220621.1", + "result": "succeeded", + "queue_time": "2022-09-01T16:58:34.2633333Z", + "start_time": "2022-09-01T16:59:33.2423874Z", + "finish_time": "2022-09-01T17:00:09.8933333Z", + "assign_time": "2022-09-01T16:59:27.85Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + }, + { + "id": "ce39968d-2aee-58c0-6354-4429990bc777", + "request_id": 4855, + "build_id": 5024, + "build_number": "20220621.1", + "result": "succeeded", + "queue_time": "2022-09-01T16:58:33.5866667Z", + "start_time": "2022-09-01T16:58:41.9914811Z", + "finish_time": "2022-09-01T16:59:27.19Z", + "assign_time": "2022-09-01T16:58:33.8166667Z", + "definition_id": 359, + "runner_name": "Hosted Agent", + "os_description": "Linux", + "runner_group": "Azure Pipelines" + } + ] From 3272e8c609c6b89c41a5e609dadf4ef11095d553 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Thu, 1 Sep 2022 15:14:01 -0400 Subject: [PATCH 30/69] update forecast data in setup --- azure_devops/bootstrap/setup | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/azure_devops/bootstrap/setup b/azure_devops/bootstrap/setup index e7e0533..ba4cfed 100755 --- a/azure_devops/bootstrap/setup +++ b/azure_devops/bootstrap/setup @@ -3,11 +3,13 @@ require "json" require "net/http" require "optparse" require "pathname" +require "date" options = { code_assets_dir: "code", pipeline_assets_dir: "pipelines", - root_dir: File.join(ENV["CODESPACE_VSCODE_FOLDER"], "azure_devops/bootstrap") + root_dir: File.join(ENV["CODESPACE_VSCODE_FOLDER"], "azure_devops/bootstrap"), + forecast_source_file: File.join(".", "azure_devops/jobs_data.json") } OptionParser.new do |opt| @@ -168,10 +170,18 @@ def create_classic_pipelines(options, repository) end end +def update_forecast_source_file(options) + puts "Updating forecast data" + jobs_data = File.read(options[:forecast_source_file]) + today = Date.today.strftime("%Y-%m-%d") + jobs_data.gsub!(/20[0-2][0-9]-[0-1][0-9]-[0-3][0-9]/, today) + File.write(options[:forecast_source_file], jobs_data) +end create_project(options) repository = create_repository(options) create_yaml_pipelines(options, repository) create_classic_pipelines(options, repository) +update_forecast_source_file(options) -puts "Success!" \ No newline at end of file +puts "Success!" From cd341cbe391440e941c14dd0b8fdd6b1067a32e1 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Thu, 1 Sep 2022 15:15:41 -0400 Subject: [PATCH 31/69] Update setup From 5f610ce9d25119f9015206d8159300401a9982f0 Mon Sep 17 00:00:00 2001 From: j-dunham Date: Thu, 1 Sep 2022 15:40:24 -0400 Subject: [PATCH 32/69] updated number for new job data --- azure_devops/valet-forecast-lab.md | 73 ++++++++++++++---------------- 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/valet-forecast-lab.md index 276911c..4d036d8 100644 --- a/azure_devops/valet-forecast-lab.md +++ b/azure_devops/valet-forecast-lab.md @@ -14,21 +14,17 @@ In this lab we will use the `forecast` command to forecast potential GitHub Acti ## Prepare for forecast Before we can run the forecast we need to answer a few questions so we can construct the correct command: -1. What is the date we want to start forecasting from? - -- __2022-03-02__. This should be a date that will give enough data to get a good understanding of the typical usage. - -2. Where do we want to store the results? +1. Where do we want to store the results? - __./tmp/forecast_reports__. This can be any valid path on the system but for simplicity it is recommend to use a directory in the root of the Codespace workspace. -3. What project do we want to run the forecast for? +2. What project do we want to run the forecast for? -- __ValetBootstrap__. This is the default project name for the labs, however, if you chose a different name when setting up the lab environment you should use that. +- __YOUR_PROJECT_NAME__. This is the project name you chose during the lab setup [here](../azure_devops/readme.md#bootstrap-your-azure-devops-organization). Using these answers our command becomes: ``` -gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devops-project YOUR_PROJECT_NAME_HERE --start-date "2022-03-02" +gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devops-project YOUR_PROJECT_NAME_HERE ``` ## Perform a forecast @@ -50,26 +46,26 @@ Open the forecast report and review the calculated metrics. ![explorer-report](https://user-images.githubusercontent.com/18723510/187696893-6d503d8d-b512-427a-af42-bbf053fa4df4.png) -- The file should be similar to this. -
- example forecast_report.md - +- Verify your report looks similar. +
+ click to expand example forecast_report.md + # Forecast report for [Azure DevOps](https://dev.azure.com/jd-testing-org/ValetBootstrap/_build) - Valet version: **0.1.0.13529(efcc91120eaf5ecb40df6af034c64580cbcfd2e8)** - - Performed at: **8/31/22 at 13:46** - - Date range: **4/5/22 - 8/19/22** + - Performed at: **9/1/22 at 19:10** + - Date range: **9/1/22 - 9/1/22** ## Total - - Job count: **186** - - Pipeline count: **60** + - Job count: **84** + - Pipeline count: **32** - Execution time - - Total: **153 minutes** + - Total: **82 minutes** - Median: **0 minutes** - - P90: **1 minutes** + - P90: **2 minutes** - Min: **0 minutes** - Max: **4 minutes** @@ -85,28 +81,28 @@ Open the forecast report and review the calculated metrics. - Median: **0** - P90: **0** - Min: **0** - - Max: **4** + - Max: **5** --- ## Azure Pipelines - - Job count: **183** - - Pipeline count: **58** - - Total consumption: **99%** + - Job count: **81** + - Pipeline count: **30** + - Total consumption: **98%** - Execution time - - Total: **151 minutes** + - Total: **80 minutes** - Median: **0 minutes** - - P90: **1 minutes** + - P90: **2 minutes** - Min: **0 minutes** - Max: **4 minutes** - Queue time - Median: **0 minutes** - - P90: **1 minutes** + - P90: **2 minutes** - Min: **0 minutes** - Max: **5 minutes** @@ -115,7 +111,7 @@ Open the forecast report and review the calculated metrics. - Median: **0** - P90: **0** - Min: **0** - - Max: **4** + - Max: **5** --- @@ -148,8 +144,8 @@ Open the forecast report and review the calculated metrics. - Max: **1** > Note: Concurrent jobs are calculated by using a sliding window of 1m 0s. - -
+ +
### Metric Definitions | Name | Description | @@ -162,19 +158,18 @@ Open the forecast report and review the calculated metrics. ### Total Section - This section shows the metrics for all of the jobs run in our sample data. ## Total - - - Job count: **186** - - Pipeline count: **60** + - Job count: **84** + - Pipeline count: **32** --- - We can see there were 60 pipelines that ran and they contained 186 jobs. The number of jobs is expected to be equal or larger than pipelines because a pipeline is typically a collection of jobs. + We can see there were 32 pipelines that ran and they contained 84 jobs. The number of jobs is expected to be equal or larger than pipelines because a pipeline is typically a collection of jobs. -- `Execution time` shows the metrics for the time a job __took to run__. Looking closer we can see during our forecast timeframe the total job run time was 153 minutes, with 90% of the jobs finishing in or under 1 minute, and the longest job taking 4 minutes. The `Min` and `Median` are 0 because they were less than a minute and were rounded down to 0. +- `Execution time` shows the metrics for the time a job __took to run__. Looking closer we can see during our forecast timeframe the total job run time was 82 minutes, with 90% of the jobs finishing in or under 2 minute, and the longest job took 4 minutes. The `Min` and `Median` are 0 because they were less than a minute and were rounded down to 0. - Execution time - - Total: **153 minutes** - - Median: **0 minutes** - - P90: **1 minutes** - - Min: **0 minutes** - - Max: **4 minutes** + - Total: **82 minutes** + - Median: **0 minutes** + - P90: **2 minutes** + - Min: **0 minutes** + - Max: **4 minutes** - `Queue time` shows the metrics for how long jobs __waited__ for a runner to be available. - Queue time @@ -187,7 +182,7 @@ Open the forecast report and review the calculated metrics. - Median: **0** - P90: **0** - Min: **0** - - Max: **4** + - Max: **5** ### Runner Group Sections - The preceding sections shows the same metrics as the `Total` section, but are broken out into runner groups. A runner group is a logical grouping in Azure DevOps of one or more runners. In our case we have groups named `Azure Pipelines` and `Default`. These sections can be used to identify runner types that needed to be increased or decreased when moving to GitHub Actions. Looking at the report the `Default` group was only used for 3 jobs and a ran for a total of 1 minute. This might be a group of runners we do not need to migrate to Actions. From 160263ad1d7d2b515d784caa31bbc65ca4a34e8d Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 7 Sep 2022 08:32:34 -0700 Subject: [PATCH 33/69] Rename lab filenames --- ...{valet-configure-lab.md => 1-configure.md} | 114 +++++++++--------- .../{valet-audit-lab.md => 2-audit.md} | 0 .../{valet-dry-run-lab.md => 3-dry-run.md} | 0 ...custom-lab.md => 4-custom-transformers.md} | 0 .../{valet-migrate-lab.md => 5-migrate.md} | 0 .../{valet-forecast-lab.md => 6-forecast.md} | 0 azure_devops/readme.md | 3 +- 7 files changed, 59 insertions(+), 58 deletions(-) rename azure_devops/{valet-configure-lab.md => 1-configure.md} (98%) rename azure_devops/{valet-audit-lab.md => 2-audit.md} (100%) rename azure_devops/{valet-dry-run-lab.md => 3-dry-run.md} (100%) rename azure_devops/{valet-migrate-custom-lab.md => 4-custom-transformers.md} (100%) rename azure_devops/{valet-migrate-lab.md => 5-migrate.md} (100%) rename azure_devops/{valet-forecast-lab.md => 6-forecast.md} (100%) diff --git a/azure_devops/valet-configure-lab.md b/azure_devops/1-configure.md similarity index 98% rename from azure_devops/valet-configure-lab.md rename to azure_devops/1-configure.md index b50a150..67e659e 100644 --- a/azure_devops/valet-configure-lab.md +++ b/azure_devops/1-configure.md @@ -1,57 +1,57 @@ -# Configure credentials for Valet -In this lab, we will use the Valet `configure` command to set up the required information to communicate with Azure DevOps and GitHub. The `configure` command can be used for all of the supported providers, but in this lab we will be focusing on Azure DevOps. -- [Prerequisites](#prerequisites) -- [Configuring Valet](#configuring-valet) -- [Verify Valet Works](#verify-valet-works) -- [Next Lab](#next-lab) - -## Prerequisites -1. Followed [steps](../azure_devops#readme) to set up your codespace environment. - -## Configuring Valet -1. Create a GitHub personal access token (PAT). - - Navigate to your GitHub `Settings` - click your profile photo and then click `Settings`. - - Go to `Developer Settings` - - Go to `Personal Access Tokens` -> `Legacy tokens (if present)` - - Click `Generate new token` -> `Legacy tokens (if present)`. If required, provide your password. - - Select at least these scopes: `read packages` and `workflow`. Optionally, provide text in the **Note** field and change the expiration. - - Click `Generate token` - - Copy the token somewhere safe and temporary. -2. Skip this step if you still have the Azure DevOp personal access token created during step 1 in the lab setup [steps](../azure_devops#bootstrap-your-azure-devops-organization), if not create another and save to a save and temporary location. -3. Run Valet configure command. - - In the codespace terminal run `gh valet configure` - - Use the down arrow key to highlight `Azure DevOps`, press the spacebar to select, then hit enter to accept. - - At the prompt enter your GitHub username and press enter. - - At the GitHub Container Registry prompt enter the GitHub PAT generated in step 1 and press enter. - - At the GitHub PAT prompt enter the GitHub PAT generated in step 1 and press enter. - - At the GitHub url prompt enter the GitHub instance url or hit enter to accept the default. - - At the Azure DevOps token prompt enter the access token from step 2 and press enter. - - At the Azure DevOps url prompt enter your Azure DevOps url or hit enter to accept the default. - - At the prompt enter your Azure Devops Organization name. - - At the prompt enter your Azure Devops Project name. -4. If all went well you should see a similar output in your terminal and a new file (.env.local) should have been created in the root of the project. The .env.local file contains the tokens used during the configure command and should be keep secret. - - ![configure-result](https://user-images.githubusercontent.com/18723510/187771230-27c97889-d98a-48f7-af01-c1a9f8df6423.png) - - -## Verify Valet Works -To verify Valet works we are going to run a `update`, `version` and `dry-run` command. We will go further into details about the `dry-run` command in a later lab, but for now we want to get the latest version of Valet and confirm that Valet can perform a dry-run with no errors. - -1. In the codespace terminal update Valet by running `gh valet update` -2. In the terminal you should see a confirmation that it logged into the GitHub Container Registry and pulled the latest version. -3. To verify Valet is updated and installed correctly run `gh valet version` and confirm the command outputs a similar response - - ![valet-version](https://user-images.githubusercontent.com/18723510/187771571-83c0ede3-0b5d-49d5-9cf8-9ff2774ef114.png) - -4. Next, lets run the dry-run command in the codespaces terminal, to verify we can talk to Azure DevOps - ``` - gh valet dry-run azure-devops pipeline -o tmp/configure_test --pipeline-id 7 - ``` -5. In the terminal you should see the command was successful, if not it is a good time to practice the configure command again and make sure the access tokens values are correct and generated with the correct permissions. - - ![dry-run](https://user-images.githubusercontent.com/18723510/187773568-5b4ef731-958f-4e5a-8f50-ea4e8a9e75d4.png) - - -### Next Lab -[Audit Azure DevOps using the Valet audit command](../azure_devops/valet-audit-lab.md) - +# Configure credentials for Valet +In this lab, we will use the Valet `configure` command to set up the required information to communicate with Azure DevOps and GitHub. The `configure` command can be used for all of the supported providers, but in this lab we will be focusing on Azure DevOps. +- [Prerequisites](#prerequisites) +- [Configuring Valet](#configuring-valet) +- [Verify Valet Works](#verify-valet-works) +- [Next Lab](#next-lab) + +## Prerequisites +1. Followed [steps](../azure_devops#readme) to set up your codespace environment. + +## Configuring Valet +1. Create a GitHub personal access token (PAT). + - Navigate to your GitHub `Settings` - click your profile photo and then click `Settings`. + - Go to `Developer Settings` + - Go to `Personal Access Tokens` -> `Legacy tokens (if present)` + - Click `Generate new token` -> `Legacy tokens (if present)`. If required, provide your password. + - Select at least these scopes: `read packages` and `workflow`. Optionally, provide text in the **Note** field and change the expiration. + - Click `Generate token` + - Copy the token somewhere safe and temporary. +2. Skip this step if you still have the Azure DevOp personal access token created during step 1 in the lab setup [steps](../azure_devops#bootstrap-your-azure-devops-organization), if not create another and save to a save and temporary location. +3. Run Valet configure command. + - In the codespace terminal run `gh valet configure` + - Use the down arrow key to highlight `Azure DevOps`, press the spacebar to select, then hit enter to accept. + - At the prompt enter your GitHub username and press enter. + - At the GitHub Container Registry prompt enter the GitHub PAT generated in step 1 and press enter. + - At the GitHub PAT prompt enter the GitHub PAT generated in step 1 and press enter. + - At the GitHub url prompt enter the GitHub instance url or hit enter to accept the default. + - At the Azure DevOps token prompt enter the access token from step 2 and press enter. + - At the Azure DevOps url prompt enter your Azure DevOps url or hit enter to accept the default. + - At the prompt enter your Azure Devops Organization name. + - At the prompt enter your Azure Devops Project name. +4. If all went well you should see a similar output in your terminal and a new file (.env.local) should have been created in the root of the project. The .env.local file contains the tokens used during the configure command and should be keep secret. + + ![configure-result](https://user-images.githubusercontent.com/18723510/187771230-27c97889-d98a-48f7-af01-c1a9f8df6423.png) + + +## Verify Valet Works +To verify Valet works we are going to run a `update`, `version` and `dry-run` command. We will go further into details about the `dry-run` command in a later lab, but for now we want to get the latest version of Valet and confirm that Valet can perform a dry-run with no errors. + +1. In the codespace terminal update Valet by running `gh valet update` +2. In the terminal you should see a confirmation that it logged into the GitHub Container Registry and pulled the latest version. +3. To verify Valet is updated and installed correctly run `gh valet version` and confirm the command outputs a similar response + + ![valet-version](https://user-images.githubusercontent.com/18723510/187771571-83c0ede3-0b5d-49d5-9cf8-9ff2774ef114.png) + +4. Next, lets run the dry-run command in the codespaces terminal, to verify we can talk to Azure DevOps + ``` + gh valet dry-run azure-devops pipeline -o tmp/configure_test --pipeline-id 7 + ``` +5. In the terminal you should see the command was successful, if not it is a good time to practice the configure command again and make sure the access tokens values are correct and generated with the correct permissions. + + ![dry-run](https://user-images.githubusercontent.com/18723510/187773568-5b4ef731-958f-4e5a-8f50-ea4e8a9e75d4.png) + + +### Next Lab +[Audit Azure DevOps using the Valet audit command](../azure_devops/valet-audit-lab.md) + diff --git a/azure_devops/valet-audit-lab.md b/azure_devops/2-audit.md similarity index 100% rename from azure_devops/valet-audit-lab.md rename to azure_devops/2-audit.md diff --git a/azure_devops/valet-dry-run-lab.md b/azure_devops/3-dry-run.md similarity index 100% rename from azure_devops/valet-dry-run-lab.md rename to azure_devops/3-dry-run.md diff --git a/azure_devops/valet-migrate-custom-lab.md b/azure_devops/4-custom-transformers.md similarity index 100% rename from azure_devops/valet-migrate-custom-lab.md rename to azure_devops/4-custom-transformers.md diff --git a/azure_devops/valet-migrate-lab.md b/azure_devops/5-migrate.md similarity index 100% rename from azure_devops/valet-migrate-lab.md rename to azure_devops/5-migrate.md diff --git a/azure_devops/valet-forecast-lab.md b/azure_devops/6-forecast.md similarity index 100% rename from azure_devops/valet-forecast-lab.md rename to azure_devops/6-forecast.md diff --git a/azure_devops/readme.md b/azure_devops/readme.md index ae8a51f..6c123ab 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -1,4 +1,4 @@ -# Valet labs for Azure DevOps +# Azure Pipelines to Actions migrations powered by Valet This lab bootstraps a Valet environment using GitHub Codespaces and enables you to create an Azure DevOps project against which to run the Valet CI/CD migration tool. @@ -59,6 +59,7 @@ This lab bootstraps a Valet environment using GitHub Codespaces and enables you ## Labs for Azure DevOps Perform the following labs to learn how to migrate Azure DevOps pipelines to GitHub Actions using Valet: + - [Configure credentials for Valet](valet-configure-lab.md) - [Audit Azure DevOps pipelines using the Valet audit command](valet-audit-lab.md) - [Dry run the migration of an Azure DevOps pipeline to GitHub Actions](valet-dry-run-lab.md) From 082fb1277c948a6e10c05dc346cffe8cb04e7472 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 7 Sep 2022 08:43:49 -0700 Subject: [PATCH 34/69] Edit azdo readme --- azure_devops/readme.md | 136 +++++++++++++++++++++++++---------------- 1 file changed, 82 insertions(+), 54 deletions(-) diff --git a/azure_devops/readme.md b/azure_devops/readme.md index 6c123ab..2942020 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -1,81 +1,109 @@ # Azure Pipelines to Actions migrations powered by Valet -This lab bootstraps a Valet environment using GitHub Codespaces and enables you to create an Azure DevOps project against which to run the Valet CI/CD migration tool. +The instructions below will guide you through configuring a GitHub Codespace environment that will be used in subsequent labs that demonstrate how to use Valet to migrate Jenkins pipelines to GitHub Actions. -- [Use this Repo as a template](#repo-template) -- [Bootstrap an Azure DevOps organization](#bootstrap-your-azure-devops-organization) -- [Labs for Azure DevOps](#labs-for-azure-devops) +These steps **must** be completed prior to starting other labs. -## Repo template +## Create your own repository for these labs -1. Verify you are in your own Repository created from the landing page [Valet Labs](https://github.com/valet-customers/labs). +1. Ensure that you have created a repository using the [valet-customers/labs](https://github.com/valet-customers/labs) as a template. -## Use Valet with a codespace +## Configure your Codespace -1. Start the codespace +1. Start a new Codespace. - Click the `Code` with button down arrow above repository on the repository's landing page. - Click the `Codespaces` tab -- Click `Create codespaces on main` to create the codespace. If you are in another branch then the `main` branch, the codespace will button will have the current branch specified. -- Wait a couple minutes, then verify that the codespace starts up. Once it is fully booted up, the terminal should be present. +- Click `Create codespaces on main` to create the codespace. +- After the Codespace has initialized there will be a terminal present. -2. Verify the [extension](https://github.com/github/gh-valet) to the official GitHub CLI for Valet is installed and working. +2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). -- Run `gh valet version` in the Visual Studio Code terminal and verify the output looks like the below image. Note the valet version will be different than below as the latest version gets pulled down. -- If `gh valet version` did not produce a similar image with a version please follow these instructions [Troubleshoot GH Valet extension](#troubleshoot-gh-valet-extension) +- Run the following command in the codespace's terminal: ------ + ```bash + gh valet version + ``` + +- Verify the output is similar to below. + + ```bash + gh version 2.14.3 (2022-07-26) + gh valet github/gh-valet v0.1.12 + valet-cli unknown + ``` + + - If `gh valet version` did not produce similar output then please follow the troubleshooting [guide](#troubleshoot-the-valet-cli). ## Bootstrap your Azure DevOps organization -1. Create an Azure DevOps personal access token with the following scopes: +1. Create an Azure DevOps personal access token: -- To do so, navigate to your organization `https://dev.azure.com/{organization}`. -- Click `User settings` in the top right corner of the screen. -- Click `Personal access tokens`. -- Select `+ New Token` -- Name your token, select the organization where you want to use the token, and then set your token to automatically expire after a set number of days. -- Select the following scopes (Click `Show more scopes` if you don't see all of the below): - - Agents Pool: `Read` - - Build: `Read & Execute` - - Code: `Read & Write` - - Project and Team: `Read, Write, & Manage` - - Release: `Read` - - Service Connections: `Read` - - Task Groups: `Read` - - Variable Groups: `Read` -- Click `Create` -- Copy the PAT somewhere safe and temporary. + - To do so, navigate to your existing organization (). + - Click `User settings` in the top right corner of the screen. + - Click `Personal access tokens`. + - Select `+ New Token` + - Name your token, select the organization where you want to use the token, and set your token to automatically expire after a set number of days. + - Select the following scopes (you may need to `Show more scopes` to reveal all scopes): + - Agents Pool: `Read` + - Build: `Read & Execute` + - Code: `Read & Write` + - Project and Team: `Read, Write, & Manage` + - Release: `Read` + - Service Connections: `Read` + - Task Groups: `Read` + - Variable Groups: `Read` + - Click `Create`. + - Copy the generated API token and save in a safe location. -2. Run the Azure DevOps setup script. This script will create an Azure DevOps project and ensure it is ready to be used in the following labs. This script should only need to be run once. +2. Execute the Azure DevOps setup script that will create a new Azure DevOps project in your organization to be used in the following labs. This script should only be run once. -- Navigate to the terminal within your Codespace. -- Run `./azure_devops/bootstrap/setup --organization :organization --project :project --access-token :access-token` while replacing these values: - - `:organization`: the name of your existing Azure DevOps organization - - `:project`: the name of the project to be created in your Azure DevOps organization - - `:access_token`: the PAT created in step 1 above -- Once this script completes, you will see a new project in your Azure DevOps organization that is populated with some pipelines. + - Run the following command from the codespace's terminal, replacing the values accordingly: + - `:organization`: the name of your existing Azure DevOps organization + - `:project`: the name of the project to be created in your Azure DevOps organization + - `:access_token`: the PAT created in step 1 above + + ```bash + ./azure_devops/bootstrap/setup --organization :organization --project :project --access-token :access-token + ``` + +3. Open the newly created Azure DevOps project in your browser () + + - Once authenticated, you will see an Azure DevOps project with a few predefined pipelines. ## Labs for Azure DevOps Perform the following labs to learn how to migrate Azure DevOps pipelines to GitHub Actions using Valet: -- [Configure credentials for Valet](valet-configure-lab.md) -- [Audit Azure DevOps pipelines using the Valet audit command](valet-audit-lab.md) -- [Dry run the migration of an Azure DevOps pipeline to GitHub Actions](valet-dry-run-lab.md) -- [Migrate an Azure DevOps pipeline to GitHub Actions](valet-migrate-lab.md) -- [Migrate an Azure DevOps pipeline to GitHub Actions with a custom transformer](valet-migrate-custom-lab.md) -- [Forecast: Valet forecast lab](valet-forecast-lab.md) +1. [Configure credentials for Valet](1-configure.md) +2. [Perform an audit of an Azure DevOps project](2-audit.md) +3. [Perform a dry-run of a Azure DevOps pipeline](3-dry-run.md) +4. [Use custom transformers to customize Valet's behavior](4-custom-transformers.md) +5. [Perform a production migration of a Azure DevOps pipeline](5-migrate.md) +6. [Forecast potential build runner usage](6-forecast.md) -## Troubleshoot GH Valet extension +## Troubleshoot the Valet CLI -Manually installing the [extension](https://github.com/github/gh-valet) to the official GitHub CLI for Valet: +The CLI extension for Valet can be manually installed by following these steps: -- Verify you are in the Visual Studio Code terminal -- Run this command to install the GitHub Valet extension -- `gh extension install github/gh-valet` -- Verify the result of the install is: `✓ Installed extension github/gh-valet` -- If you get a similar error to the following, click the link to authorize the token - ![linktolcickauth](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) - - Restart Codespace after clicking the link -- Verify the Valet CLI is installed and working by running the `gh valet version` command \ No newline at end of file +- Verify you are in the codespace terminal +- Run this command from within the codespace's terminal: + + ```bash + gh extension install github/gh-valet + ``` + +- Verify the result of the install contains: + + ```bash + ✓ Installed extension github/gh-valet + ``` + +- If you get an error similar to the image below, then click the link in the terminal output to authorize the token. + - Restart the codespace after clicking the link. + ![img](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) +- Verify Valet CLI extension is installed and working by running the following command from the codespace's terminal: + + ```bash + gh valet version + ``` From 4160a849b1a495109f4da58a5338bf6515344380 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 7 Sep 2022 08:57:42 -0700 Subject: [PATCH 35/69] Edit configure lab --- azure_devops/1-configure.md | 111 +++++++++++++++++++++--------------- azure_devops/2-audit.md | 3 +- azure_devops/readme.md | 2 +- 3 files changed, 67 insertions(+), 49 deletions(-) diff --git a/azure_devops/1-configure.md b/azure_devops/1-configure.md index 67e659e..2d82ea9 100644 --- a/azure_devops/1-configure.md +++ b/azure_devops/1-configure.md @@ -1,57 +1,74 @@ # Configure credentials for Valet -In this lab, we will use the Valet `configure` command to set up the required information to communicate with Azure DevOps and GitHub. The `configure` command can be used for all of the supported providers, but in this lab we will be focusing on Azure DevOps. -- [Prerequisites](#prerequisites) -- [Configuring Valet](#configuring-valet) -- [Verify Valet Works](#verify-valet-works) -- [Next Lab](#next-lab) -## Prerequisites -1. Followed [steps](../azure_devops#readme) to set up your codespace environment. +In this lab, you will use the `configure` CLI command to set the required credentials and information for Valet to use when working with Azure DevOps and GitHub. -## Configuring Valet -1. Create a GitHub personal access token (PAT). - - Navigate to your GitHub `Settings` - click your profile photo and then click `Settings`. - - Go to `Developer Settings` - - Go to `Personal Access Tokens` -> `Legacy tokens (if present)` - - Click `Generate new token` -> `Legacy tokens (if present)`. If required, provide your password. - - Select at least these scopes: `read packages` and `workflow`. Optionally, provide text in the **Note** field and change the expiration. - - Click `Generate token` - - Copy the token somewhere safe and temporary. -2. Skip this step if you still have the Azure DevOp personal access token created during step 1 in the lab setup [steps](../azure_devops#bootstrap-your-azure-devops-organization), if not create another and save to a save and temporary location. -3. Run Valet configure command. - - In the codespace terminal run `gh valet configure` - - Use the down arrow key to highlight `Azure DevOps`, press the spacebar to select, then hit enter to accept. - - At the prompt enter your GitHub username and press enter. - - At the GitHub Container Registry prompt enter the GitHub PAT generated in step 1 and press enter. - - At the GitHub PAT prompt enter the GitHub PAT generated in step 1 and press enter. - - At the GitHub url prompt enter the GitHub instance url or hit enter to accept the default. - - At the Azure DevOps token prompt enter the access token from step 2 and press enter. - - At the Azure DevOps url prompt enter your Azure DevOps url or hit enter to accept the default. - - At the prompt enter your Azure Devops Organization name. - - At the prompt enter your Azure Devops Project name. -4. If all went well you should see a similar output in your terminal and a new file (.env.local) should have been created in the root of the project. The .env.local file contains the tokens used during the configure command and should be keep secret. +You will need to complete all of the setup instructions [here](./readme.md#configure-your-codespace) prior to performing this lab. - ![configure-result](https://user-images.githubusercontent.com/18723510/187771230-27c97889-d98a-48f7-af01-c1a9f8df6423.png) +## Configuring credentials - -## Verify Valet Works -To verify Valet works we are going to run a `update`, `version` and `dry-run` command. We will go further into details about the `dry-run` command in a later lab, but for now we want to get the latest version of Valet and confirm that Valet can perform a dry-run with no errors. +1. Create an Azure DevOps Personal Access Token (PAT). + 1. __Note__: you may skip this step if you still have the PAT created during the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). + 2. Navigate to your existing organization () in your browswer. + 3. Click `User settings` in the top right corner of the screen. + 4. Click `Personal access tokens`. + 5. Select `+ New Token` + 6. Name your token, select the organization where you want to use the token, and set your token to automatically expire after a set number of days. + 7. Select the following scopes (you may need to `Show more scopes` to reveal all scopes): + - Agents Pool: `Read` + - Build: `Read & Execute` + - Code: `Read & Write` + - Project and Team: `Read, Write, & Manage` + - Release: `Read` + - Service Connections: `Read` + - Task Groups: `Read` + - Variable Groups: `Read` + 8. Click `Create`. + 9. Copy the generated API token and save in a safe location. -1. In the codespace terminal update Valet by running `gh valet update` -2. In the terminal you should see a confirmation that it logged into the GitHub Container Registry and pulled the latest version. -3. To verify Valet is updated and installed correctly run `gh valet version` and confirm the command outputs a similar response - - ![valet-version](https://user-images.githubusercontent.com/18723510/187771571-83c0ede3-0b5d-49d5-9cf8-9ff2774ef114.png) +2. Create a GitHub Personal Access Token (PAT): + 1. Open github.com in a new browser tab. + 2. Click your profile photo in the top right of the UI and click `Settings`. + 3. Click on `Developer Settings` in the left hand panel. + 4. Click `Personal Access Tokens` and then `Legacy tokens` (if present). + 5. Click `Generate new token` and then `Legacy tokens`. You may be required to authenticate with GitHub during this step. + 6. Select the following scopes: `read:packages` and `workflow`. + 7. Click `Generate token`. + 8. Copy the generated PAT and save in a safe location. -4. Next, lets run the dry-run command in the codespaces terminal, to verify we can talk to Azure DevOps - ``` - gh valet dry-run azure-devops pipeline -o tmp/configure_test --pipeline-id 7 - ``` -5. In the terminal you should see the command was successful, if not it is a good time to practice the configure command again and make sure the access tokens values are correct and generated with the correct permissions. - - ![dry-run](https://user-images.githubusercontent.com/18723510/187773568-5b4ef731-958f-4e5a-8f50-ea4e8a9e75d4.png) +3. Run the `configure` CLI command: + - Select the `TERMINAL` tab from within the codespace terminal window. + - Run the following command: `gh valet configure`. + - Using the down arrow key to highlight `Azure DevOps`, press the spacebar to select, and then hit enter to continue. + - At the GitHub Container Registry prompt enter the GitHub PAT generated in step 2 and press enter. + - At the GitHub PAT prompt enter the GitHub PAT generated in step 2 and press enter. + - At the GitHub url prompt enter the GitHub instance url or hit enter to accept the default value (`https://github.com`). + - At the Azure DevOps token prompt enter the access token from step 1 and press enter. + - At the Azure DevOps url prompt enter your Azure DevOps url or hit enter to accept the default value (`https://dev.azure.com`). + - At the prompt enter your Azure Devops organization name. This should be the same organization used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). + - At the prompt enter your Azure Devops project name. This should be the same project name used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). + ![img](https://user-images.githubusercontent.com/18723510/187771230-27c97889-d98a-48f7-af01-c1a9f8df6423.png) -### Next Lab -[Audit Azure DevOps using the Valet audit command](../azure_devops/valet-audit-lab.md) +## Verify your environment +To verify our environment is configured correctly, we are going to run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. + +1. In the codespace terminal run the following command: + + ```bash + gh valet update + ``` + +2. You should see a confirmation that you were logged into the GitHub Container Registry and Valet was updated to the latest version. + + ```bash + Login Succeeded + latest: Pulling from valet-customers/valet-cli + Digest: sha256:a7d00dee8a37e25da59daeed44b1543f476b00fa2c41c47f48deeaf34a215bbb + Status: Image is up to date for ghcr.io/valet-customers/valet-cli:latest + ghcr.io/valet-customers/valet-cli:latest + ``` + +### Next lab + +[Perform an audit of an Azure DevOps project](2-audit.md) diff --git a/azure_devops/2-audit.md b/azure_devops/2-audit.md index 40aa2dc..6790527 100644 --- a/azure_devops/2-audit.md +++ b/azure_devops/2-audit.md @@ -1,4 +1,5 @@ -# Audit Azure DevOps pipelines using the Valet audit command +# Perform an audit of an Azure DevOps project + In this lab, you will use Valet to `audit` an Azure DevOps organization. The `audit` command can be used to scan a CI server and output a summary of the current pipelines. This summary can then be used to plan the timeline and effort required to migrate to GitHub Actions. - [Prerequisites](#prerequisites) diff --git a/azure_devops/readme.md b/azure_devops/readme.md index 2942020..ad72206 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -39,7 +39,7 @@ These steps **must** be completed prior to starting other labs. 1. Create an Azure DevOps personal access token: - - To do so, navigate to your existing organization (). + - Navigate to your existing organization () in your browswer. - Click `User settings` in the top right corner of the screen. - Click `Personal access tokens`. - Select `+ New Token` From 7d0fd485a7eea16370a6703e4877a7d57548aa92 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 7 Sep 2022 10:06:17 -0700 Subject: [PATCH 36/69] Edit azdo audit lab --- azure_devops/2-audit.md | 190 +++++++++++++++++++++++++++++++++------- gitlab/2-audit.md | 3 +- 2 files changed, 158 insertions(+), 35 deletions(-) diff --git a/azure_devops/2-audit.md b/azure_devops/2-audit.md index 6790527..e31e268 100644 --- a/azure_devops/2-audit.md +++ b/azure_devops/2-audit.md @@ -1,53 +1,175 @@ # Perform an audit of an Azure DevOps project -In this lab, you will use Valet to `audit` an Azure DevOps organization. The `audit` command can be used to scan a CI server and output a summary of the current pipelines. This summary can then be used to plan the timeline and effort required to migrate to GitHub Actions. +In this lab, you will use the `audit` command to get a high-level view of all pipelines in an Azure DevOps organization or project. -- [Prerequisites](#prerequisites) -- [Perform an audit](#perform-an-audit) -- [View audit output](#view-audit-output) -- [Review the pipelines](#review-the-pipelines) -- [Next Lab](#next-lab) +The `audit` command operates by fetching all of the pipelines defined in an Azure DevOps organization or project, converting each to their equivalent GitHub Actions workflow, and writing a report that summarizes how complete and complex of a migration is possible with Valet. ## Prerequisites -1. Follow all steps [here](../azure_devops#readme) to set up your environment -2. Create or start a codespace in this repository (if not started) +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and bootstrap an Azure DevOps project. +2. Completed the [configure lab](./1-configure.md#configuring-credentials). ## Perform an audit -You will use the codespace preconfigured in this repository to perform the audit. -1. Navigate to the codespace Visual Studio Code terminal -2. Verify you are in the `valet` directory -3. Now, from the `valet` folder in your repository, run Valet to verify your Azure DevOps configuration: - +We will be performing an audit against the bootstrapped Azure DevOps project. We will need to answer the following questions before running this command: + +1. What is the Azure DevOps organization name that we want to audit? + - __:organization__. This should be the same organization used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization) + +2. What is the Azure DevOps project name that we want to audit? + - __:project__. This should be the same project name used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization) + +3. Where do we want to store the result? + - __./tmp/audit__. This can be any path within the working directory that Valet commands are executed from. + +### Steps + +1. Navigate to the codespace terminal. +2. Run the following command from the root directory: + + ```bash + gh valet audit azure-devops --output-dir tmp/audit --namespace valet + ``` + + __Note__: The Azure DevOps organization and project name can be omitted from the `audit` command as they were persited in the `.env.local` file in the [configure lab](./1-configure.md). You can optionally provide these arguments on the command line with the `--azure-devops-organization` and `--azure-devops-project` CLI options. + +3. The command will list all the files written to disk in green when the command succeeds. + +## Inspect the output files + +1. Find the `audit_summary.md` file in the file explorer. +2. Right-click the `audit_summary.md` file and select `Open Preview`. +3. This file contains details that summarizes what percentage of your pipelines were converted automatically. + +### Review audit summary + +#### Pipelines + +The pipeline summary section contains high level statistics regarding the conversion rate done by Valet: + +```md +## Pipelines + +Total: **5** + +- Successful: **5 (100%)** +- Partially successful: **0 (0%)** +- Unsupported: **0 (0%)** +- Failed: **0 (0%)** + +### Job types + +Supported: **5 (100%)** + +- designer: **2** +- YAML: **3** ``` -gh valet audit azure-devops --output-dir audit + +Here are some key terms in the "Pipelines" section in the above example: + +- __Successful__ pipelines had 100% of the pipeline constructs and individual items converted automatically to their GitHub Actions equivalent. +- __Partially successful__ pipelines had all of the pipeline constructs converted, however, there were some individual items (e.g. build tasks or build triggers) that were not converted automatically to their GitHub Actions equivalent. +- __Unsupported__ pipelines are definition types that are not supported by Valet. The following Azure DevOps pipeline types are supported: + - Classic (designer) + - YAML + - Release +- __Failed pipelines__ encountered a fatal error when being converted. This can occur for one of three reasons: + - The pipeline was misconfigured and not valid in Azure DevOps. + - Valet encountered an internal error when converting it. + - There was an unsuccessful network response, often due to invalid credentials, that caused the pipeline to be inaccessible. + +The "Job types" section will summarize which types of pipelines are being used and which are supported or unsupported by Valet. + +#### Build steps + +The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by Valet. + +```md +### Build steps + +Total: **14** + +Known: **14 (100%)** + +- script: **4** +- DotNetCoreCLI@2: **2** +- 2c65196a-54fd-4a02-9be8-d9d1837b7c5d@0: **2** +- 333b11bd-d341-40d9-afcf-b32d5ce6f23b@2: **2** +- e213ff0f-5d5c-4791-802d-52ea3e7be1f1@2: **2** +- NodeTool@0: **1** +- checkout: **1** + +Actions: **19** + +- run: **10** +- actions/checkout@v2: **6** +- nuget/setup-nuget@v1: **2** +- actions/setup-node@v2: **1** ``` -### Example -![valet-audit-1](https://user-images.githubusercontent.com/26442605/169615028-696dad13-ff83-41a7-b475-0ab8c0bbcd65.png) -4. Valet displays green log files to indicate a successful audit +Here are some key terms in the "Build steps" section in the above example: -### Example -![valet-audit-2](https://user-images.githubusercontent.com/26442605/169615218-a8a3199d-a436-4d70-8c1e-17a61b089eb6.png) +- A __known__ build step is a step that was automatically converted to an equivalent action. +- An __unknown__ build step is a step that was not automatically converted to an equivalent action. +- An __unsupported__ build step is a step that is either: + - A step that is fundamentally not supported by GitHub Actions. + - A step that is configured in a way that is incompatible with GitHub Actions. +- An __action__ is a list of the actions that were used in the converted workflows. This is important for the following scenarios: + - Gathering the list of actions to sync to your appliance if you use GitHub Enterprise Server. + - Defining an organization-level allowlist of actions that can be used. This list of actions is a comprehensive list of which actions their security and/or compliance teams will need to review. -## View audit output -The audit summary, logs, Azure DevOps yml, and GitHub yml should all be located in the `valet` folder. +There is an equivalent breakdown of build triggers, environment variables, and other uncategorized items displayed in the audit summary file. -1. Under the `valet` folder find the `audit_summary.md` -2. Right-click the `audit_summary.md` file and select `Open Preview` -3. The file contains details about your current pipelines and what can be migrated 100% automatically vs. what will need some manual intervention or aren't supported by GitHub Actions. -4. Review the file. +#### Manual Tasks -### Example -![valet-audit-3](https://user-images.githubusercontent.com/26442605/169615428-26f7a962-2064-46d0-8206-ea930109b252.png) +The manual tasks summary section presents an overview of the manual tasks that you will need to perform that Valet is not able to complete automatically. -## Review the pipelines -The `audit` command grabs the yml, classic, and release pipelines from Azure DevOps and converts them to GitHub Actions. +```md +### Manual tasks -### Example -View the source yml and the proposed GitHub yml -![valet-audit-4](https://user-images.githubusercontent.com/26442605/169615630-8d700081-c631-4b2a-ab1c-e52503f7838f.png) +Total: **1** -### Next Lab -[Dry run the migration of an Azure DevOps pipeline to GitHub Actions](valet-dry-run-lab.md) +Secrets: **1** + +- `${{ secrets.PASSWORD }}`: **1** +``` + +Here are some key terms in the "Manual tasks" section in the above example: + +- A __secret__ refers to a repository or organization level secret that is used by the converted pipelines. These secrets will need to be created manually in Actions in order for these pipelines to function properly. +- A __self-hosted runner__ refers to a label of a runner that is referenced by a converted pipeline that is not a GitHub-hosted runner. You will need to manually define these runners in order for these pipelines to function properly. + +#### Files + +The final section of the audit report provides a manifest of all of the files that are written to disk during the audit. These files include: + +```md +### Successful + +#### valet-bootstrap/valet-classic-test-import1 + +- [valet-bootstrap/valet-classic-test-import1.yml](valet-bootstrap/valet-classic-test-import1.yml) +- [valet-bootstrap/valet-classic-test-import1.config.json](valet-bootstrap/valet-classic-test-import1.config.json) + +#### valet-bootstrap/valet-classic-test-import2 + +- [valet-bootstrap/valet-classic-test-import2.yml](valet-bootstrap/valet-classic-test-import2.yml) +- [valet-bootstrap/valet-classic-test-import2.config.json](valet-bootstrap/valet-classic-test-import2.config.json) + +#### valet-bootstrap/pipelines/valet-pipeline1 + +- [valet-bootstrap/pipelines/valet-pipeline1.yml](valet-bootstrap/pipelines/valet-pipeline1.yml) +- [valet-bootstrap/pipelines/valet-pipeline1.config.json](valet-bootstrap/pipelines/valet-pipeline1.config.json) +- [valet-bootstrap/pipelines/valet-pipeline1.source.yml](valet-bootstrap/pipelines/valet-pipeline1.source.yml) +``` + +Each pipeline will have a variety of files written that include: + +- The original pipeline as it was defined in Azure DevOps. +- Any network responses used to convert a pipeline. +- The converted workflow. +- Stack traces that can used to troubleshoot a failed pipeline conversion + +### Next lab + +[Perform a dry-run of an Azure DevOps pipeline](3-dry-run.md) diff --git a/gitlab/2-audit.md b/gitlab/2-audit.md index 09c1cac..5685af9 100644 --- a/gitlab/2-audit.md +++ b/gitlab/2-audit.md @@ -66,7 +66,8 @@ Unsupported: **1 (9%)** Here are some key terms in the “Pipelines” section in the above example: - __Successful__ pipelines had 100% of the pipeline constructs and individual items converted automatically to their GitHub Actions equivalent. -- __Partially successful__ pipelines had all of the pipeline constructs converted, however, there were some "Auto DevOps" pipelines. +- __Partially successful__ pipelines had all of the pipeline constructs converted, however, there were some individual items (e.g. build tasks or build triggers) that were not converted automatically to their GitHub Actions equivalent. +- __Unsupported__ pipelines are definition types that are not supported by Valet. Auto DevOps pipelines are not supported. - __Failed pipelines__ encountered a fatal error when being converted. This can occur for one of three reasons: - The pipeline was misconfigured and not valid in GitLab. - Valet encountered an internal error when converting it. From 35905b5174eb6b31215e94ded5ff633b121cc8af Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 7 Sep 2022 10:25:30 -0700 Subject: [PATCH 37/69] Edit azdo dry-run lab --- azure_devops/3-dry-run.md | 117 ++++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 37 deletions(-) diff --git a/azure_devops/3-dry-run.md b/azure_devops/3-dry-run.md index 36ae851..d9dbe08 100644 --- a/azure_devops/3-dry-run.md +++ b/azure_devops/3-dry-run.md @@ -1,52 +1,95 @@ -# Dry run the migration of an Azure DevOps pipeline to GitHub Actions -In this lab, you will use the `valet dry-run` command to convert an Azure DevOps pipeline to it's equivalent GitHub Actions workflow and write the workflow to your local filesystem. +# Perform a dry-run of an Azure DevOps pipeline -- [Prerequisites](#prerequisites) -- [Identify the Azure DevOps pipeline ID to use](#identify-the-azure-devops-pipeline-id-to-use) -- [Perform a dry run](#perform-a-dry-run) -- [View dry-run output](#view-dry-run-output) -- [Next Lab](#next-lab) +In this lab you will use the `dry-run` command to convert an Azure DevOps pipeline to its equivalent GitHub Actions workflow. ## Prerequisites -1. Follow all steps [here](../azure_devops#readme) to set up your environment -2. Create or start a codespace in this repository (if not started) -3. You have completed the [Valet audit lab](valet-audit-lab.md). - -## Identify the Azure DevOps pipeline ID to use -You will need a pipeline ID to perform the dry run -1. Go to the `valet/ValetBootstrap/pipelines` folder -2. Open the `valet/ValetBootstrap/pipelines/valet-pipeline1.config.json` file -3. Look for the `$.web.href` link -4. At the end of the link is the pipeline ID. Copy or note the ID. - -### Example -![valet-dr-5](https://user-images.githubusercontent.com/26442605/169616920-7c407adc-0c4e-4104-9046-d1d2ecdd6edf.png) +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and bootstrap an Azure DevOps project. +2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). +3. Completed the [audit lab](./2-audit.md). ## Perform a dry run -You will use the codespace preconfigured in this repository to perform the dry run. -1. Navigate to the codespace Visual Studio Code terminal -2. Verify you are in the `valet` directory +We will be performing a dry-run for a pipeline in the bootstrapped Azure DevOps project. We will need to answer the following questions before running this command: + +1. What is the id of the pipeline to convert? + - __:id__. This id can be found by: + - Navigating to the build pipelines in the bootstrapped Azure DevOps project + - Selecting the pipeline with the name "valet-pipeline1" + - Inspecting the URL to locate the pipeline id + +2. Where do we want to store the result? + - __./tmp/dry-run-lab__. This can be any path within the working directory that Valet commands are executed from. + +### Steps + +1. Navigate to the codespace terminal +2. Run the following command from the root directory: + + ```bash + gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id -o tmp/dry-run-lab + ``` + +3. The command will list all the files written to disk when the command succeeds. +4. View the converted workflow: + - Find `./tmp/dry-run-lab` in the file explorer pane in codespaces. + - Click `valet-pipeline1.yml` to open. +## Inspect the output files + +The files generated from the `dry-run` command represent the equivalent Actions workflow for the given Azure DevOps pipeline. The Azure DevOps pipeline and converted workflow can be seen below: + +
+ Azure DevOps pipeline 👇 + +```yaml +trigger: +- main + +pool: + vmImage: windows-latest + +steps: +- script: echo Hello, I am pipeline 1! + displayName: 'Run a one-line script' + +- script: | + echo Add other tasks to build, test, and deploy your project. + echo See https://aka.ms/yaml + displayName: 'Run a multi-line script' ``` -gh valet dry-run azure-devops pipeline --pipeline-id PIPELINE-ID --output-dir dry-run + +
+ +
+ Converted workflow 👇 + +```yaml +name: valet-bootstrap/pipelines/valet-pipeline1 +on: + push: + branches: + - main +jobs: + build: + runs-on: windows-latest + steps: + - name: checkout + uses: actions/checkout@v2 + - name: Run a one-line script + run: echo Hello, I am pipeline 1! + - name: Run a multi-line script + run: |- + echo Add other tasks to build, test, and deploy your project. + echo See https://aka.ms/yaml ``` -3. Now, from the `valet` folder in your repository, run `gh valet dry-run` to see the output: -### Example -![valet-dr-1](https://user-images.githubusercontent.com/26442605/169616149-46c2d743-47fe-4061-a48a-7f21442624cb.png) +
-4. Valet will create a folder called `dry-runs` under the `valet` folder that shows what will be migrated. +Despite these 2 pipelines using different syntax they will function equivantly. -### Example -![valet-dr-2](https://user-images.githubusercontent.com/26442605/169616265-176a19fd-3071-44fc-bff7-866a172afc57.png) + -## View dry-run output -The dry-run output will show you the GitHub Actions yml that will be migrated to GitHub. +## Next lab -### Example -![valet-dr-3](https://user-images.githubusercontent.com/26442605/169616486-fd5512fa-0761-45fe-a252-5b2ef0926a04.png) - -### Next Lab -[Migrate an Azure DevOps pipeline to GitHub Actions](valet-migrate-lab.md) +[Use custom transformers to customize Valet's behavior](./4-custom-transformers.md) From ac8d383cab5a3efd960b08264de109d343575d87 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 7 Sep 2022 13:16:25 -0700 Subject: [PATCH 38/69] Edit azdo custom transformers lab --- azure_devops/4-custom-transformers.md | 253 ++++++++++++++++++++------ jenkins/4-custom-transformers.md | 2 +- 2 files changed, 200 insertions(+), 55 deletions(-) diff --git a/azure_devops/4-custom-transformers.md b/azure_devops/4-custom-transformers.md index ffe7725..7d04a12 100644 --- a/azure_devops/4-custom-transformers.md +++ b/azure_devops/4-custom-transformers.md @@ -1,54 +1,106 @@ -# Migrate an Azure DevOps pipeline to GitHub Actions with a custom transformer -In this lab, you will create a custom plugin that transforms some of the existing migration mapping and replaces it with your own mapping. Then use the `migrate` subcommand to migrate the pipeline. The `migrate` subcommand can be used to convert a pipeline to its GitHub Actions equivalent and then create a pull request with the contents. +# Using custom transformers to customize Valet's behavior -- [Prerequisites](#prerequisites) -- [Identify the Azure DevOps pipeline ID to use](#identify-the-azure-devops-pipeline-id-to-use) -- [Create a custom transformer](#create-a-custom-transformer) -- [Migrate with a custom transformer](#migrate-with-a-custom-transformer) -- [View the pull request](#view-the-pull-request) +In this lab we will build upon the `dry-run` command to override Valet's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: + +1. Convert items that are not automatically converted. +2. Convert items that were automatically converted using different actions. +3. Convert environment variable values differently. +4. Convert references to runners to use a different runner name in Actions. ## Prerequisites -1. Follow all steps [here](../azure_devops#readme) to set up your environment -2. Create or start a codespace in this repository (if not started) -3. Complete the [Valet audit lab](valet-audit-lab.md). -4. Complete the [Valet migrate lab](valet-migrate-lab.md). +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and bootstrap an Azure DevOps project. +2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). +3. Completed the [audit lab](./2-audit.md). +4. Completed the [dry-run lab](./3-dry-run.md). -## Identify the Azure DevOps pipeline ID to use -You will need the `valet-custom-transformer-example` Azure DevOps pipeline ID to perform the migration -1. Go to the `valet/ValetBootstrap/pipelines` folder -2. Open the `valet/ValetBootstrap/pipelines/valet-custom-transformer-example.config.json` file -3. Look for the `web - href` link -4. At the end of the link is the pipeline ID. Copy or note the ID. +## Perform a dry run -### Example -![mapperprops](https://user-images.githubusercontent.com/26442605/175090567-525b97a7-60d2-41b7-9dcd-d559ca1c5bd7.png) +We will be performing a dry-run for a pipeline in the bootstrapped Azure DevOps project. We will need to answer the following questions before running this command: -## Create a custom transformer +1. What is the id of the pipeline to convert? + - __:pipeline_id__. This id can be found by: + - Navigating to the build pipelines in the bootstrapped Azure DevOps project + - Selecting the pipeline with the name "valet-custom-transformer-example" + - Inspecting the URL to locate the pipeline id -To create a transformer, you need to create a Ruby file that looks as follows: -``` ruby -transform "azuredevopstaskname" do |item| - # your ruby code here that produces output -end -``` +2. Where do we want to store the result? + - __./tmp/dry-run-lab__. This can be any path within the working directory that Valet commands are executed from. -We start by creating a new folder called `plugin` under the `valet` folder in your repository. In there create a file called `DotNetCoreCLI.rb`. +### Steps -Next change the function name to match the Azure DevOps task name `DotNetCoreCLI@2`. -The way you find this name is by clicking the **view yaml** button at a task in the pipeline: +1. Navigate to the codespace terminal +2. Run the following command from the root directory: -This results in the following code: -``` ruby -transform "DotNetCoreCLI@2" do |item| - # your ruby code here that produces output -end -``` -The parameter item is a collection of items than contain the properties of the original task that was retrieved from Azure DevOps. -In this case we can see in the yaml that the properties that are set are `command` and `projects`. - -Add the following code to the ruby file: -``` Ruby + ```bash + gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id -o tmp/dry-run-lab + ``` + +3. The command will list all the files written to disk when the command succeeds. +4. View the converted workflow: + - Find `./tmp/dry-run-lab` in the file explorer pane in codespaces. + - Click `valet-custom-transformer-example.yml` to open. + +The converted workflow that is generated can be seen below: + +
+ Converted workflow 👇 + +```yaml +name: valet-bootstrap/pipelines/valet-custom-transformer-example +on: + push: + branches: + - "*" +env: + BUILDCONFIGURATION: Release + BuildParameters_RESTOREBUILDPROJECTS: "**/*.csproj" +jobs: + Job_1: + name: Agent job 1 + runs-on: windows-latest + steps: + - name: checkout + uses: actions/checkout@v2 + - uses: actions/checkout@v2 + - name: Use Node 10.16.3 + uses: actions/setup-node@v2 + with: + node-version: 10.16.3 + - name: Restore + run: dotnet restore ${{ env.BuildParameters_RESTOREBUILDPROJECTS }} + - name: Build + run: dotnet build ${{ env.BuildParameters_RESTOREBUILDPROJECTS }} --configuration ${{ env.BUILDCONFIGURATION }} +``` + +
+ +_Note_: You can refer to the previous [lab](./3-dry-run.md) to learn about the fundamentals of the `dry-run` command. + +## Custom transformers for build steps + +We can use custom transformers override Valet's default behavior. In this scenario, we may want to override the behavior for converting `DotnetCoreCLI@2` tasks to support parameters that are glob patterns. We will need to answer the following questions before writing a custom transformer: + +1. What is the "identifier" of the step to customize? + - __DotnetCoreCLI@2__ + +2. What is the desired Actions syntax to use instead? + - After some research, we have determined that the uploading test results as an artifact will be suitable: + + ```yaml + - run: shopt -s globstar; for f in ./**/*.csproj; do dotnet build $f --configuration ${{ env.BUILDCONFIGURATION }} ; done + shell: bash + ``` + +Now we can begin to write the custom transformer. Customer transformers use a DSL built on top of Ruby and should be defined in a file with the `.rb` file extension. You can create this file by running the following command in your codespace terminal: + +```bash +code transformers.rb +``` + +Next, we will define a `transform` method for the `DotnetCoreCLI@2` identifier by adding the following code to `transformers.rb`: + +```ruby transform "DotNetCoreCLI@2" do |item| projects = item["projects"] command = item["command"] @@ -60,28 +112,121 @@ transform "DotNetCoreCLI@2" do |item| else run_command << "dotnet #{command} #{item['projects']} #{item['arguments']}" end - + + { + run: run_command.join("\n"), + shell: "bash", + } +end +``` + +This method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. Valet will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in Azure DevOps. + +Now, we can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: + +```bash +gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id -o tmp/dry-run-lab --custom-transformers transformers.rb +``` + +Open the workflow that is generated and inspect the contents. Now, the `DotnetCoreCLI@2` steps are converted using the customized behavior! + +```diff +- - name: Restore +- run: dotnet restore ${{ env.BuildParameters_RESTOREBUILDPROJECTS }} +- - name: Build +- run: dotnet build ${{ env.BuildParameters_RESTOREBUILDPROJECTS }} --configuration ${{ env.BUILDCONFIGURATION }} ++ - name: Restore ++ run: shopt -s globstar; for f in ./**/*.csproj; do dotnet restore $f ; done ++ shell: bash ++ - name: Build ++ run: shopt -s globstar; for f in ./**/*.csproj; do dotnet build $f --configuration ${{ env.BUILDCONFIGURATION }} ; done ++ shell: bash +``` + +## Custom transformers for environment variables + +We can also use custom transformers to edit the values of environment variables in converted workflows. In our example, we will be updating the `BUILDCONFIGURATION` environment variable to be `Debug` instead of `Release`. + +To do this, add the following code to the `transformers.rb` file. + +```ruby +env "BUILDCONFIGURATION", "Debug" +``` + +In this example, the first parameter to the `env` method is the environment variable name and the second is the updated value. + +Now, we can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `DB_ENGINE` environment variable will be set to `mongodb`: + +```diff +env: +- BUILDCONFIGURATION: Release ++ BUILDCONFIGURATION: Debug + BuildParameters_RESTOREBUILDPROJECTS: "**/*.csproj" +``` + +## Custom transformers for runners + +Finally, we can use custom transformers to dictate which runners converted workflows should use. To do this we will need to answer the following questions: + +1. What is label of the runner in Azure DevOps to update? + - __windows-latest__ + +2. What is the label of the runner in Actions to use instead? + - __ubuntu-latest__ + +With these questions answered, we can add the following code to the `transformers.rb` file: + +```ruby +runner "windows-latest", "ubuntu-latest" +``` + +In this example, the first parameter to the `runner` method is the Azure DevOps label and the second is the Actions runner label. + +Now, we can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `runs-on` statement will use the customized runner label: + +```diff +runs-on: +- - windows-latest ++ - ubuntu-latest +``` + +At this point of the lab the file contents of `transformers.rb` should match this: + +
+ Custom transformers 👇 + +```ruby +transform "DotNetCoreCLI@2" do |item| + projects = item["projects"] + command = item["command"] + run_command = [] + + if projects.include?("$") + command = "build" if command.nil? + run_command << "shopt -s globstar; for f in ./**/*.csproj; do dotnet #{command} $f #{item['arguments']} ; done" + else + run_command << "dotnet #{command} #{item['projects']} #{item['arguments']}" + end + { shell: "bash", run: run_command.join("\n") } end + +env "BUILDCONFIGURATION", "Debug" + +runner "windows-latest", "ubuntu-latest" ``` -## Migrate with a custom transformer +
-Run the `gh valet migrate` command from the `valet` directory with the transformer again and pass it the custom plugin. Look at the result and see if it results in a successful build. +Thats it! At this point you have overridden Valet's default behavior by customizing the conversion of: -``` -gh valet migrate azure-devops pipeline --target-url https://github.com/GITHUB-ORG/GITHUB-REPO --pipeline-id PIPELINE-ID --custom-transformers plugin/DotNetCoreCLI.rb --output-dir migrate -``` +- Build steps +- Environment variables +- Runners -### Example -![valet-cm-1](https://user-images.githubusercontent.com/26442605/169618556-7c79b34b-6d4c-48d5-98e5-7f8d771117a5.png) - -## View the pull request -The migrate output will show you the pull request on GitHub. Note here that the checks on the pull request all passed! - -### Example -![mapper-ex3](https://user-images.githubusercontent.com/26442605/161117488-93e38847-3034-4f04-a768-e74e16dba4ae.png) +## Next lab +[Perform a production migration of an Azure DevOps pipeline](5-migrate.md) diff --git a/jenkins/4-custom-transformers.md b/jenkins/4-custom-transformers.md index b9d28ba..e97ee48 100644 --- a/jenkins/4-custom-transformers.md +++ b/jenkins/4-custom-transformers.md @@ -139,7 +139,7 @@ We can also override Valet's default behavior. In this scenario, we may not desi - __junit__ 2. What is the desired Actions syntax to use instead? - - After some research, we have determined that the uploading test results as an artifact will be suitable: + - After some research, we have determined that uploading test results as an artifact will be suitable: ```yaml - uses: actions/upload-artifact@v3 From e9673255f67f69488da718a911645dec4ebe171d Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 7 Sep 2022 16:13:27 -0700 Subject: [PATCH 39/69] Edit azdo migrate lab --- azure_devops/5-migrate.md | 89 +++++++++++++++++++++------------------ jenkins/5-migrate.md | 4 +- 2 files changed, 49 insertions(+), 44 deletions(-) diff --git a/azure_devops/5-migrate.md b/azure_devops/5-migrate.md index 3fa1029..992acfc 100644 --- a/azure_devops/5-migrate.md +++ b/azure_devops/5-migrate.md @@ -1,59 +1,64 @@ -# Migrate an Azure DevOps pipeline to GitHub Actions -In this lab, you will use the Valet `migrate` command to migrate an Azure DevOps pipeline to GitHub Actions. The `migrate` subcommand can be used to convert a pipeline to its GitHub Actions equivalent and then create a pull request with the contents. +# Perform a production migration of an Azure DevOps pipeline -- [Prerequisites](#prerequisites) -- [Identify the Azure DevOps pipeline ID to use](#identify-the-azure-devops-pipeline-id-to-use) -- [Perform a migration](#perform-a-migration) -- [View the pull request](#view-the-pull-request) -- [Next Lab](#next-lab) +In this lab, you will use the `migrate` command to convert an Azure DevOps pipeline and open a pull request with the equivalent Actions workflow. ## Prerequisites -1. Follow all steps [here](../azure_devops#readme) to set up your environment -2. Create or start a codespace in this repository (if not started) -3. Completed the [Valet audit lab](valet-audit-lab.md). +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and bootstrap an Azure DevOps project. +2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). +3. Completed the [dry-run lab](./3-dry-run.md). +4. Completed the [custom transformers lab](./4-custom-transformers.md). -## Identify the Azure DevOps pipeline ID to use -You will need a pipeline ID to perform the migration -1. Go to the `valet/ValetBootstrap/pipelines` folder -2. Open the `valet/ValetBootstrap/pipelines/valet-pipeline1.config.json` file -3. Look for the `web - href` link -4. At the end of the link is the pipeline ID. Copy or note the ID. +## Performing a migration -### Example -![Screen Shot 2022-05-10 at 8 50 06 AM](https://user-images.githubusercontent.com/26442605/167670536-b46aa383-74bd-4e22-a782-0de5d0ce64a5.png) +We need to answer the following questions before running a `migrate` command: +1. What is the id of the pipeline to convert? + - __:pipeline_id__. This id can be found by: + - Navigating to the build pipelines in the bootstrapped Azure DevOps project + - Selecting the pipeline with the name "valet-custom-transformer-example" + - Inspecting the URL to locate the pipeline id +2. Where do we want to store the logs? + - __./tmp/migrate__ +3. What is the URL for the GitHub repository to add the workflow to? + - __this repository__. The URL should should follow the pattern with `:owner` and `:repo` replaced with your values. -## Perform a migration -You will use the codespace preconfigured in this repository to perform the migration. +### Steps -1. Navigate to the codespace Visual Studio Code terminal -2. Verify you are in the valet directory -3. Copy the following command and replace: - - `GITHUB-ORG` with the name of your organization. - - `GITHUB-REPO` with the name of your repository. - - `PIPELINE-ID` with your pipeline ID. -4. Run `gh valet migrate` from the `valet` directory to migrate the pipeline to GitHub Actions.. -``` -gh valet migrate azure-devops pipeline --target-url https://github.com/GITHUB-ORG/GITHUB-REPO --pipeline-id PIPELINE-ID --output-dir migrate -``` +1. Run the following `migrate` command in the codespace terminal: -### Example -![valet-migrate-1](https://user-images.githubusercontent.com/26442605/169617557-289cee54-0116-4d13-8e6f-a9d0508259e1.png) + ```bash + gh valet migrate azure-devops pipeline --pipeline-id :pipeline_id --target-url https://github.com/:owner/:repo --output-dir ./tmp/migrate + ``` +2. The command will write the URL to the pull request that was created when the command succeeds. -5. Valet will create a pull request directly to your GitHub repository. -6. Click the green pull request link in the output of the migrate command. See below. + ```bash + ➜ gh valet migrate azure-devops pipeline --pipeline-id 7 --target-url https://github.com/ethanis/labs --output-dir ./tmp/migrate + [2022-09-07 20:25:08] Logs: 'tmp/dry-run-lab/log/valet-20220907-202508.log' + [2022-09-07 20:25:13] Pull request: 'https://github.com/ethanis/labs/pull/42' + ``` -### Example -![valet-migrate-5](https://user-images.githubusercontent.com/26442605/169617699-ce0c0720-8830-46ed-811d-c2fe1ccf06ea.png) +3. Open the generated pull request in a new browser tab. +### Inspect the pull request -## View the pull request -The migrate output will show you the pull request on GitHub. +The first thing we should notice about the PR is that there is a list of manual steps for us to complete: -### Example -![migrate-pr](https://user-images.githubusercontent.com/26442605/161110724-f39d9cb9-1992-44c5-bea5-da2fcebb074c.png) + -### Next Lab -[Migrate an Azure DevOps pipeline to GitHub Actions with a custom transformer](valet-migrate-custom-lab.md) +![img](https://user-images.githubusercontent.com/19557880/186784161-b7882ac4-ac99-4462-b69f-f49b9202527b.png) + +Next, let's review the workflow we are adding by clicking on `Files changed` tab. This is where you would double check everything looks good. If it didn't you could push commits with the required changes, prior to merging. + +Next, you can inspect the "Files changed" in this PR and see the converted workflow that is being added. Any additional changes or code reviews that were needed should be done in this PR. + +Finally, you can merge the PR once your review has completed. We can then view the workflow running by selecting the "Actions" menu in the top navigation bar in GitHub. + +![img](https://user-images.githubusercontent.com/19557880/185509704-90243ec5-e77f-4baf-a9b2-d9a4d9fda199.png) + +At this point, the migration has completed and you have successfully migrated an Azure DevOps pipeline to Actions! + +### Next lab + +[Forecast potential build runner usage](6-forecast.md) diff --git a/jenkins/5-migrate.md b/jenkins/5-migrate.md index a8ebba2..936e940 100644 --- a/jenkins/5-migrate.md +++ b/jenkins/5-migrate.md @@ -15,7 +15,7 @@ We need to answer the following questions before running a `migrate` command: 1. What is the source URL of the pipeline we want to convert? - ____ -2. Where do we want to store the result? +2. Where do we want to store the logs? - __./tmp/migrate__ 3. What is the URL for the GitHub repository to add the workflow to? - __this repository__. The URL should should follow the pattern with `:owner` and `:repo` replaced with your values. @@ -25,7 +25,7 @@ We need to answer the following questions before running a `migrate` command: 1. Run the following `migrate` command in the codespace terminal: ```bash - gh valet migrate jenkins --target-urlhttps://github.com/:owner/:repo --output-dir ./tmp/migrate --source-url http://localhost:8080/job/monas_dev_work/job/monas_freestyle + gh valet migrate jenkins --target-url https://github.com/:owner/:repo --output-dir ./tmp/migrate --source-url http://localhost:8080/job/monas_dev_work/job/monas_freestyle ``` 2. The command will write the URL to the pull request that was created when the command succeeds. From db69651119c5b4b3948cd13e4c546f0e447234c6 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 7 Sep 2022 16:30:41 -0700 Subject: [PATCH 40/69] Edit azdo forecast labs --- azure_devops/6-forecast.md | 217 ++++++------------ .../{jobs_data.json => bootstrap/jobs.json} | 0 2 files changed, 64 insertions(+), 153 deletions(-) rename azure_devops/{jobs_data.json => bootstrap/jobs.json} (100%) diff --git a/azure_devops/6-forecast.md b/azure_devops/6-forecast.md index 4d036d8..9603f3c 100644 --- a/azure_devops/6-forecast.md +++ b/azure_devops/6-forecast.md @@ -1,191 +1,102 @@ -# Forecast Azure DevOps usage using Valet's forecast command -In this lab we will use the `forecast` command to forecast potential GitHub Actions usage by computing metrics from the historical pipeline data in Azure DevOps. The metrics will be stored on disk in a markdown file and include job metrics for execution time, queue time, and concurrency. We will look at each of these metrics in more depth later in this lab. +# Forecast potential build runner usage -- [Prerequisites](#prerequisites) -- [Prepare for forecast](#prepare-for-forecast) -- [Perform a forecast](#perform-a-forecast) -- [Review forecast report](#review-forecast-report) -- [Next steps](#next-steps) +In this lab you will use the `forecast` command to forecast potential GitHub Actions usage by computing metrics from completed pipeline runs in your Azure DevOps project. ## Prerequisites -1. Follow all steps [here](../azure_devops#readme) to set up your environment -2. Create or start a codespace in this repository (if not started) -## Prepare for forecast -Before we can run the forecast we need to answer a few questions so we can construct the correct command: - -1. Where do we want to store the results? - -- __./tmp/forecast_reports__. This can be any valid path on the system but for simplicity it is recommend to use a directory in the root of the Codespace workspace. - -2. What project do we want to run the forecast for? - -- __YOUR_PROJECT_NAME__. This is the project name you chose during the lab setup [here](../azure_devops/readme.md#bootstrap-your-azure-devops-organization). - -Using these answers our command becomes: -``` -gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devops-project YOUR_PROJECT_NAME_HERE -``` +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and bootstrap an Azure DevOps project. +2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). ## Perform a forecast -- Run the command generated in the previous step in the terminal. -- You should get "No jobs found" because we have no pipelines that ran during the timeframe we picked. Actually, our demo project has never had any pipelines run so any date we pick will return no jobs. -![no-jobs](https://user-images.githubusercontent.com/18723510/187690315-6312088d-9888-4c55-9bbf-c6f2687fa547.png) -- lets use the `--source-file` option of the forecast command to generate a report that we can review. This option is normally used to create reports using data from multiple CI/CD providers, but in this case we can use it to create a report from sample Azure DevOps data. We can view the `forecast` command options by using the help flag `gh valet forecast --help`. -![help-menu](https://user-images.githubusercontent.com/18723510/187692843-623d4bdc-8970-4348-a632-73c8b00a40f8.png) -- Run the `forecast` command using the sample data. - ``` - gh valet forecast azure-devops -o ./tmp/sample_report --source-file-path azure_devops/jobs_data.json - ``` -- A report should be generated from the sample data! -![sample-report](https://user-images.githubusercontent.com/18723510/187694590-9121b997-0c89-4984-bbf2-84f3df2ed882.png) -## Review forecast report -Open the forecast report and review the calculated metrics. -- From the codespace explorer pane find `./tmp/sample_report/forecast_report.md` and right-click, and select __Open Preview__. +We will need to answer the following questions before running the `forecast` command: - ![explorer-report](https://user-images.githubusercontent.com/18723510/187696893-6d503d8d-b512-427a-af42-bbf053fa4df4.png) +1. What is the Azure DevOps organization name that we want to audit? + - __:organization__. This should be the same organization used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization) -- Verify your report looks similar. -
- click to expand example forecast_report.md - - # Forecast report for [Azure DevOps](https://dev.azure.com/jd-testing-org/ValetBootstrap/_build) +2. What is the Azure DevOps project name that we want to audit? + - __:project__. This should be the same project name used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization) - - Valet version: **0.1.0.13529(efcc91120eaf5ecb40df6af034c64580cbcfd2e8)** - - Performed at: **9/1/22 at 19:10** - - Date range: **9/1/22 - 9/1/22** +3. Where do we want to store the results? + - `./tmp/forecast_reports` - ## Total +### Steps - - Job count: **84** - - Pipeline count: **32** +1. Navigate to the codespace terminal +2. Run the following command from the root directory: - - Execution time + ```bash + gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devops-project :project + ``` - - Total: **82 minutes** - - Median: **0 minutes** - - P90: **2 minutes** - - Min: **0 minutes** - - Max: **4 minutes** +3. The command will output a message stating that "No jobs found" because no jobs have been executed in your bootstrapped project. - - Queue time + ![img](https://user-images.githubusercontent.com/18723510/187690315-6312088d-9888-4c55-9bbf-c6f2687fa547.png) - - Median: **0 minutes** - - P90: **1 minutes** - - Min: **0 minutes** - - Max: **5 minutes** +4. If you inspect the help menu using the `gh valet forecast --help` command then you will see a `--source-file-path` option. This option can be used to perform a `forecast` command using json files that are already present on the filesystem. These labs come bundled with sample json files located [here](./bootstrap/jobs.json). - - Concurrent jobs + ![img](https://user-images.githubusercontent.com/18723510/187692843-623d4bdc-8970-4348-a632-73c8b00a40f8.png) - - Median: **0** - - P90: **0** - - Min: **0** - - Max: **5** +5. Run the following `forecast` command while specifying the path to the sample json files: - --- + ```bash + gh valet forecast azure-devops -o ./tmp/forecast_reports --source-file-path azure_devops/bootstrap/jobs.json + ``` - ## Azure Pipelines +6. The command will list all the files written to disk when the command succeeds. - - Job count: **81** - - Pipeline count: **30** - - Total consumption: **98%** + ![img](https://user-images.githubusercontent.com/18723510/187694590-9121b997-0c89-4984-bbf2-84f3df2ed882.png) - - Execution time +## Review the forecast report - - Total: **80 minutes** - - Median: **0 minutes** - - P90: **2 minutes** - - Min: **0 minutes** - - Max: **4 minutes** +The forecast report, logs, and completed job data will be located within the `tmp/forecast_reports` folder. - - Queue time +1. Find the `forecast_report.md` file in the file explorer. +2. Right-click the `forecast_report.md` file and select `Open Preview`. +3. This file contains metrics used to forecast potential GitHub Actions usage. - - Median: **0 minutes** - - P90: **2 minutes** - - Min: **0 minutes** - - Max: **5 minutes** +### Total - - Concurrent jobs +The "Total" section of the forecast report contains high level statistics related to all the jobs completed after the `--start-date` CLI option: - - Median: **0** - - P90: **0** - - Min: **0** - - Max: **5** +```md +- Job count: **84** +- Pipeline count: **32** - --- +- Execution time - ## Default + - Total: **82 minutes** + - Median: **0 minutes** + - P90: **2 minutes** + - Min: **0 minutes** + - Max: **4 minutes** - - Job count: **3** - - Pipeline count: **2** - - Total consumption: **1%** +- Queue time - - Execution time + - Median: **0 minutes** + - P90: **1 minutes** + - Min: **0 minutes** + - Max: **5 minutes** - - Total: **1 minutes** - - Median: **0 minutes** - - P90: **0 minutes** - - Min: **0 minutes** - - Max: **0 minutes** +- Concurrent jobs - - Queue time + - Median: **0** + - P90: **0** + - Min: **0** + - Max: **5** +``` - - Median: **0 minutes** - - P90: **0 minutes** - - Min: **0 minutes** - - Max: **0 minutes** +Here are some key terms of items defined in the forecast report: - - Concurrent jobs +- The `job count` is the total number of completed jobs. +- The `pipeline count` is the number of unique pipelines used. +- `Execution time` describes the amount of time a runner spent on a job. This metric can be used to help plan for the cost of GitHub hosted runners. + - This metric is correlated to how much you should expect to spend in GitHub Actions. This will vary depending on the hardware used for these minutes and the [Actions pricing calculator](https://github.com/pricing/calculator) should be used to estimate a dollar amount. +- `Queue time` metrics describe the amount of time a job spent waiting for a runner to be available to execute it. +- `Concurrent jobs` metrics describe the amount of jobs running at any given time. This metric can be used to define the number of runners a customer should configure. - - Median: **0** - - P90: **0** - - Min: **0** - - Max: **1** - - > Note: Concurrent jobs are calculated by using a sliding window of 1m 0s. - -
- -### Metric Definitions -| Name | Description | -| ----- | ----------- | -| Median | The __middle__ value | -| P90 | 90% of the values are less than or equal to this | -| Min | The lowest value | -| Max | The highest value | - -### Total Section -- This section shows the metrics for all of the jobs run in our sample data. - ## Total - - Job count: **84** - - Pipeline count: **32** - --- - We can see there were 32 pipelines that ran and they contained 84 jobs. The number of jobs is expected to be equal or larger than pipelines because a pipeline is typically a collection of jobs. - -- `Execution time` shows the metrics for the time a job __took to run__. Looking closer we can see during our forecast timeframe the total job run time was 82 minutes, with 90% of the jobs finishing in or under 2 minute, and the longest job took 4 minutes. The `Min` and `Median` are 0 because they were less than a minute and were rounded down to 0. - - Execution time - - Total: **82 minutes** - - Median: **0 minutes** - - P90: **2 minutes** - - Min: **0 minutes** - - Max: **4 minutes** - -- `Queue time` shows the metrics for how long jobs __waited__ for a runner to be available. - - Queue time - - Median: **0 minutes** - - P90: **1 minutes** - - Min: **0 minutes** - - Max: **5 minutes** -- `Concurrent jobs` show the metrics for how many jobs started or ended within the same 60 second time slice. The time slice window can be changed using the `--time-slice` option. - - Concurrent jobs - - Median: **0** - - P90: **0** - - Min: **0** - - Max: **5** - -### Runner Group Sections -- The preceding sections shows the same metrics as the `Total` section, but are broken out into runner groups. A runner group is a logical grouping in Azure DevOps of one or more runners. In our case we have groups named `Azure Pipelines` and `Default`. These sections can be used to identify runner types that needed to be increased or decreased when moving to GitHub Actions. Looking at the report the `Default` group was only used for 3 jobs and a ran for a total of 1 minute. This might be a group of runners we do not need to migrate to Actions. +Additionally, these metrics are defined for each queue of runners defined in Azure DevOps. This is especially useful if there are a mix of hosted/self-hosted runners or high/low spec machines to see metrics specific to different types of runners. ## Next steps -This concludes the Valet labs for Azure Devops, if you are interested exploring the power of Valet more. You can leverage the lab environment and modify and add new pipelines that more closely match your needs and try out the commands again! + +This concludes all labs for migrating Azure DevOps pipelines to Actions with Valet! diff --git a/azure_devops/jobs_data.json b/azure_devops/bootstrap/jobs.json similarity index 100% rename from azure_devops/jobs_data.json rename to azure_devops/bootstrap/jobs.json From dc7c478762f88b2ddd67e49046350c429f0ec5f7 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 7 Sep 2022 16:49:07 -0700 Subject: [PATCH 41/69] Add manual tasks to lab content --- azure_devops/2-audit.md | 4 ++-- azure_devops/5-migrate.md | 8 +++----- .../bootstrap/pipelines/yml/valet-pipeline2.yml | 17 ++++++++--------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/azure_devops/2-audit.md b/azure_devops/2-audit.md index e31e268..8253190 100644 --- a/azure_devops/2-audit.md +++ b/azure_devops/2-audit.md @@ -129,9 +129,9 @@ The manual tasks summary section presents an overview of the manual tasks that y Total: **1** -Secrets: **1** +Self hosted runners: **1** -- `${{ secrets.PASSWORD }}`: **1** +- `mechamachine`: **1** ``` Here are some key terms in the "Manual tasks" section in the above example: diff --git a/azure_devops/5-migrate.md b/azure_devops/5-migrate.md index 992acfc..2d582e0 100644 --- a/azure_devops/5-migrate.md +++ b/azure_devops/5-migrate.md @@ -16,7 +16,7 @@ We need to answer the following questions before running a `migrate` command: 1. What is the id of the pipeline to convert? - __:pipeline_id__. This id can be found by: - Navigating to the build pipelines in the bootstrapped Azure DevOps project - - Selecting the pipeline with the name "valet-custom-transformer-example" + - Selecting the pipeline with the name "valet-pipeline2" - Inspecting the URL to locate the pipeline id 2. Where do we want to store the logs? - __./tmp/migrate__ @@ -34,7 +34,7 @@ We need to answer the following questions before running a `migrate` command: 2. The command will write the URL to the pull request that was created when the command succeeds. ```bash - ➜ gh valet migrate azure-devops pipeline --pipeline-id 7 --target-url https://github.com/ethanis/labs --output-dir ./tmp/migrate + ➜ gh valet migrate azure-devops pipeline --pipeline-id 8 --target-url https://github.com/ethanis/labs --output-dir ./tmp/migrate [2022-09-07 20:25:08] Logs: 'tmp/dry-run-lab/log/valet-20220907-202508.log' [2022-09-07 20:25:13] Pull request: 'https://github.com/ethanis/labs/pull/42' ``` @@ -45,9 +45,7 @@ We need to answer the following questions before running a `migrate` command: The first thing we should notice about the PR is that there is a list of manual steps for us to complete: - - -![img](https://user-images.githubusercontent.com/19557880/186784161-b7882ac4-ac99-4462-b69f-f49b9202527b.png) +![img](https://user-images.githubusercontent.com/8703324/189002125-45561312-dd26-42fd-bd38-a596614ee871.png) Next, let's review the workflow we are adding by clicking on `Files changed` tab. This is where you would double check everything looks good. If it didn't you could push commits with the required changes, prior to merging. diff --git a/azure_devops/bootstrap/pipelines/yml/valet-pipeline2.yml b/azure_devops/bootstrap/pipelines/yml/valet-pipeline2.yml index 8b801c9..6f9ba13 100644 --- a/azure_devops/bootstrap/pipelines/yml/valet-pipeline2.yml +++ b/azure_devops/bootstrap/pipelines/yml/valet-pipeline2.yml @@ -4,16 +4,15 @@ # https://aka.ms/yaml trigger: -- main + - main -pool: - vmImage: windows-latest +pool: mechamachine steps: -- script: echo Hello, I am pipeline 2! - displayName: 'Run a one-line script' + - script: echo Hello, I am pipeline 2! + displayName: "Run a one-line script" -- script: | - echo Add other tasks to build, test, and deploy your project. - echo See https://aka.ms/yaml - displayName: 'Run a multi-line script' + - script: | + echo Add other tasks to build, test, and deploy your project. + echo See https://aka.ms/yaml + displayName: "Run a multi-line script" From b23666978e92e67ffe04ad683dae45b19dfcef47 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 7 Sep 2022 16:57:06 -0700 Subject: [PATCH 42/69] Add better custom transformer example --- azure_devops/3-dry-run.md | 4 +- azure_devops/4-custom-transformers.md | 17 ++++--- .../yml/valet-custom-transformer-example.yml | 51 +++++++++---------- gitlab/3-dry-run.md | 2 +- jenkins/3-dry-run.md | 2 +- 5 files changed, 37 insertions(+), 39 deletions(-) diff --git a/azure_devops/3-dry-run.md b/azure_devops/3-dry-run.md index d9dbe08..c199cee 100644 --- a/azure_devops/3-dry-run.md +++ b/azure_devops/3-dry-run.md @@ -86,9 +86,7 @@ jobs:
-Despite these 2 pipelines using different syntax they will function equivantly. - - +Despite these 2 pipelines using different syntax they will function equivalently. ## Next lab diff --git a/azure_devops/4-custom-transformers.md b/azure_devops/4-custom-transformers.md index 7d04a12..e0c8b95 100644 --- a/azure_devops/4-custom-transformers.md +++ b/azure_devops/4-custom-transformers.md @@ -58,7 +58,9 @@ env: jobs: Job_1: name: Agent job 1 - runs-on: windows-latest + runs-on: + - self-hosted + - mechamachine steps: - name: checkout uses: actions/checkout@v2 @@ -169,7 +171,7 @@ env: Finally, we can use custom transformers to dictate which runners converted workflows should use. To do this we will need to answer the following questions: 1. What is label of the runner in Azure DevOps to update? - - __windows-latest__ + - __mechamachine__ 2. What is the label of the runner in Actions to use instead? - __ubuntu-latest__ @@ -177,7 +179,7 @@ Finally, we can use custom transformers to dictate which runners converted workf With these questions answered, we can add the following code to the `transformers.rb` file: ```ruby -runner "windows-latest", "ubuntu-latest" +runner "mechamachine", "ubuntu-latest" ``` In this example, the first parameter to the `runner` method is the Azure DevOps label and the second is the Actions runner label. @@ -185,9 +187,10 @@ In this example, the first parameter to the `runner` method is the Azure DevOps Now, we can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `runs-on` statement will use the customized runner label: ```diff -runs-on: -- - windows-latest -+ - ubuntu-latest +- runs-on: +- - self-hosted +- - mechamachine ++ runs-on: ubuntu-latest ``` At this point of the lab the file contents of `transformers.rb` should match this: @@ -216,7 +219,7 @@ end env "BUILDCONFIGURATION", "Debug" -runner "windows-latest", "ubuntu-latest" +runner "mechamachine", "ubuntu-latest" ```
diff --git a/azure_devops/bootstrap/pipelines/yml/valet-custom-transformer-example.yml b/azure_devops/bootstrap/pipelines/yml/valet-custom-transformer-example.yml index 8220c95..7d9ba2b 100644 --- a/azure_devops/bootstrap/pipelines/yml/valet-custom-transformer-example.yml +++ b/azure_devops/bootstrap/pipelines/yml/valet-custom-transformer-example.yml @@ -1,29 +1,26 @@ ---- variables: -- name: BuildParameters.RESTOREBUILDPROJECTS - value: "**/*.csproj" -- name: BUILDCONFIGURATION - value: Release -name: "$(date:yyyyMMdd)$(rev:.r)" + - name: BuildParameters.RESTOREBUILDPROJECTS + value: "**/*.csproj" + - name: BUILDCONFIGURATION + value: Release +name: "custom-transformer-example" jobs: -- job: Job_1 - displayName: Agent job 1 - pool: - vmImage: windows-latest - steps: - - checkout: self - - task: NodeTool@0 - displayName: Use Node 10.16.3 - inputs: - versionSpec: 10.16.3 - - task: DotNetCoreCLI@2 - displayName: Restore - inputs: - command: restore - projects: "$(BuildParameters.RESTOREBUILDPROJECTS)" - - task: DotNetCoreCLI@2 - displayName: Build - inputs: - projects: "$(BuildParameters.RESTOREBUILDPROJECTS)" - arguments: "--configuration $(BUILDCONFIGURATION)" - + - job: Job_1 + displayName: Agent job 1 + pool: "mechamachine" + steps: + - checkout: self + - task: NodeTool@0 + displayName: Use Node 10.16.3 + inputs: + versionSpec: 10.16.3 + - task: DotNetCoreCLI@2 + displayName: Restore + inputs: + command: restore + projects: "$(BuildParameters.RESTOREBUILDPROJECTS)" + - task: DotNetCoreCLI@2 + displayName: Build + inputs: + projects: "$(BuildParameters.RESTOREBUILDPROJECTS)" + arguments: "--configuration $(BUILDCONFIGURATION)" diff --git a/gitlab/3-dry-run.md b/gitlab/3-dry-run.md index cf66935..0859dae 100644 --- a/gitlab/3-dry-run.md +++ b/gitlab/3-dry-run.md @@ -198,7 +198,7 @@ jobs: ```
-Despite these 2 pipelines using different syntax they will function equivantly. +Despite these 2 pipelines using different syntax they will function equivalently. ## Perform a dry-run of a pipeline using `include`'d files diff --git a/jenkins/3-dry-run.md b/jenkins/3-dry-run.md index d022e59..1749371 100644 --- a/jenkins/3-dry-run.md +++ b/jenkins/3-dry-run.md @@ -123,7 +123,7 @@ jobs: -These 2 pipelines function equivantly despite using different syntax. In this case, the pipeline conversion was “partially successful” (i.e. there were item(s) not automatically converted) and the unconverted item was placed as comment in the location the Jenkins pipeline used it. For example: +These 2 pipelines function equivalently despite using different syntax. In this case, the pipeline conversion was “partially successful” (i.e. there were item(s) not automatically converted) and the unconverted item was placed as comment in the location the Jenkins pipeline used it. For example: ```diff - sleep 80 From 76cfaab62743011544532b5bbe733d2085cdbc60 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Thu, 8 Sep 2022 10:46:19 -0700 Subject: [PATCH 43/69] Make sentence more succinct co-authored-by: Begona Guereca --- azure_devops/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/readme.md b/azure_devops/readme.md index ad72206..5eaf592 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -1,6 +1,6 @@ # Azure Pipelines to Actions migrations powered by Valet -The instructions below will guide you through configuring a GitHub Codespace environment that will be used in subsequent labs that demonstrate how to use Valet to migrate Jenkins pipelines to GitHub Actions. +The instructions below will guide you through configuring a Codespace that will be used in these labs to demonstrate how Valet can be used to migrate Azure DevOps pipelines to GitHub Actions. These steps **must** be completed prior to starting other labs. From 9a83eba03f425e9d0f21967cf5618c698495cb38 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Thu, 8 Sep 2022 13:50:39 -0700 Subject: [PATCH 44/69] Update azure_devops/readme.md Co-authored-by: Begona Guereca --- azure_devops/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/readme.md b/azure_devops/readme.md index 5eaf592..1c197bb 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -13,7 +13,7 @@ These steps **must** be completed prior to starting other labs. 1. Start a new Codespace. - Click the `Code` with button down arrow above repository on the repository's landing page. -- Click the `Codespaces` tab +- Click the `Codespaces` tab. - Click `Create codespaces on main` to create the codespace. - After the Codespace has initialized there will be a terminal present. From e6e62e673f95df13baeaa3bf2d3b0aba2c3da384 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Thu, 8 Sep 2022 13:51:57 -0700 Subject: [PATCH 45/69] Update text co-authored-by: Begona Guereca --- azure_devops/readme.md | 2 +- gitlab/readme.md | 2 +- jenkins/readme.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/azure_devops/readme.md b/azure_devops/readme.md index 1c197bb..bfed300 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -12,7 +12,7 @@ These steps **must** be completed prior to starting other labs. 1. Start a new Codespace. -- Click the `Code` with button down arrow above repository on the repository's landing page. +- Click the `Code` button on your repository's landing page. - Click the `Codespaces` tab. - Click `Create codespaces on main` to create the codespace. - After the Codespace has initialized there will be a terminal present. diff --git a/gitlab/readme.md b/gitlab/readme.md index 042e378..f4b1a6e 100644 --- a/gitlab/readme.md +++ b/gitlab/readme.md @@ -12,7 +12,7 @@ These steps **must** be completed prior to starting other labs. 1. Start the codespace -- Click the `Code` button down arrow above the repository on the repository's landing page. +- Click the `Code` button on your repository's landing page. - Click the `Codespaces` tab. - Click `Create codespaces on main` to create the codespace. - After the Codespace has initialized there will be a terminal present. diff --git a/jenkins/readme.md b/jenkins/readme.md index 0466eb9..2d198a7 100644 --- a/jenkins/readme.md +++ b/jenkins/readme.md @@ -12,8 +12,8 @@ These steps **must** be completed prior to starting other labs. 1. Start a new Codespace. -- Click the `Code` with button down arrow above repository on the repository's landing page. -- Click the `Codespaces` tab +- Click the `Code` button on your repository's landing page. +- Click the `Codespaces` tab. - Click `Create codespaces on main` to create the codespace. - After the Codespace has initialized there will be a terminal present. From 797311ece64f7faa72baf5aeb7c81e59fcb5a1f3 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Fri, 9 Sep 2022 08:18:55 -0700 Subject: [PATCH 46/69] Apply suggestions from code review Co-authored-by: Begona Guereca --- azure_devops/1-configure.md | 2 +- azure_devops/2-audit.md | 2 +- azure_devops/3-dry-run.md | 2 +- azure_devops/4-custom-transformers.md | 4 ++-- azure_devops/5-migrate.md | 8 +++----- azure_devops/6-forecast.md | 10 +++++----- 6 files changed, 13 insertions(+), 15 deletions(-) diff --git a/azure_devops/1-configure.md b/azure_devops/1-configure.md index 2d82ea9..6f0795d 100644 --- a/azure_devops/1-configure.md +++ b/azure_devops/1-configure.md @@ -8,7 +8,7 @@ You will need to complete all of the setup instructions [here](./readme.md#confi 1. Create an Azure DevOps Personal Access Token (PAT). 1. __Note__: you may skip this step if you still have the PAT created during the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). - 2. Navigate to your existing organization () in your browswer. + 2. Navigate to your existing organization () in your browser. 3. Click `User settings` in the top right corner of the screen. 4. Click `Personal access tokens`. 5. Select `+ New Token` diff --git a/azure_devops/2-audit.md b/azure_devops/2-audit.md index 8253190..f40b306 100644 --- a/azure_devops/2-audit.md +++ b/azure_devops/2-audit.md @@ -31,7 +31,7 @@ We will be performing an audit against the bootstrapped Azure DevOps project. We gh valet audit azure-devops --output-dir tmp/audit --namespace valet ``` - __Note__: The Azure DevOps organization and project name can be omitted from the `audit` command as they were persited in the `.env.local` file in the [configure lab](./1-configure.md). You can optionally provide these arguments on the command line with the `--azure-devops-organization` and `--azure-devops-project` CLI options. + __Note__: The Azure DevOps organization and project name can be omitted from the `audit` command as they were persisted in the `.env.local` file in the [configure lab](./1-configure.md). You can optionally provide these arguments on the command line with the `--azure-devops-organization` and `--azure-devops-project` CLI options. 3. The command will list all the files written to disk in green when the command succeeds. diff --git a/azure_devops/3-dry-run.md b/azure_devops/3-dry-run.md index c199cee..3aa2db9 100644 --- a/azure_devops/3-dry-run.md +++ b/azure_devops/3-dry-run.md @@ -23,7 +23,7 @@ We will be performing a dry-run for a pipeline in the bootstrapped Azure DevOps ### Steps -1. Navigate to the codespace terminal +1. Navigate to the codespace terminal. 2. Run the following command from the root directory: ```bash diff --git a/azure_devops/4-custom-transformers.md b/azure_devops/4-custom-transformers.md index e0c8b95..c13ef4d 100644 --- a/azure_devops/4-custom-transformers.md +++ b/azure_devops/4-custom-transformers.md @@ -81,7 +81,7 @@ _Note_: You can refer to the previous [lab](./3-dry-run.md) to learn about the f ## Custom transformers for build steps -We can use custom transformers override Valet's default behavior. In this scenario, we may want to override the behavior for converting `DotnetCoreCLI@2` tasks to support parameters that are glob patterns. We will need to answer the following questions before writing a custom transformer: +We can use custom transformers to override Valet's default behavior. In this scenario, we may want to override the behavior for converting `DotnetCoreCLI@2` tasks to support parameters that are glob patterns. We will need to answer the following questions before writing a custom transformer: 1. What is the "identifier" of the step to customize? - __DotnetCoreCLI@2__ @@ -170,7 +170,7 @@ env: Finally, we can use custom transformers to dictate which runners converted workflows should use. To do this we will need to answer the following questions: -1. What is label of the runner in Azure DevOps to update? +1. What is the label of the runner in Azure DevOps to update? - __mechamachine__ 2. What is the label of the runner in Actions to use instead? diff --git a/azure_devops/5-migrate.md b/azure_devops/5-migrate.md index 2d582e0..5ef8212 100644 --- a/azure_devops/5-migrate.md +++ b/azure_devops/5-migrate.md @@ -21,7 +21,7 @@ We need to answer the following questions before running a `migrate` command: 2. Where do we want to store the logs? - __./tmp/migrate__ 3. What is the URL for the GitHub repository to add the workflow to? - - __this repository__. The URL should should follow the pattern with `:owner` and `:repo` replaced with your values. + - __this repository__. The URL should follow the pattern with `:owner` and `:repo` replaced with your values. ### Steps @@ -47,11 +47,9 @@ The first thing we should notice about the PR is that there is a list of manual ![img](https://user-images.githubusercontent.com/8703324/189002125-45561312-dd26-42fd-bd38-a596614ee871.png) -Next, let's review the workflow we are adding by clicking on `Files changed` tab. This is where you would double check everything looks good. If it didn't you could push commits with the required changes, prior to merging. +Next, you can inspect the `Files changed` in this PR and see the converted workflow that is being added. Any additional changes or code reviews that were needed should be done in this PR. -Next, you can inspect the "Files changed" in this PR and see the converted workflow that is being added. Any additional changes or code reviews that were needed should be done in this PR. - -Finally, you can merge the PR once your review has completed. We can then view the workflow running by selecting the "Actions" menu in the top navigation bar in GitHub. +Finally, you can merge the PR once your review has completed. We can then view the workflow running by selecting the `Actions` menu in the top navigation bar in GitHub. ![img](https://user-images.githubusercontent.com/19557880/185509704-90243ec5-e77f-4baf-a9b2-d9a4d9fda199.png) diff --git a/azure_devops/6-forecast.md b/azure_devops/6-forecast.md index 9603f3c..d413a55 100644 --- a/azure_devops/6-forecast.md +++ b/azure_devops/6-forecast.md @@ -22,14 +22,14 @@ We will need to answer the following questions before running the `forecast` com ### Steps -1. Navigate to the codespace terminal +1. Navigate to the codespace terminal. 2. Run the following command from the root directory: ```bash gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devops-project :project ``` -3. The command will output a message stating that "No jobs found" because no jobs have been executed in your bootstrapped project. +3. The command will output a message that says "No jobs found" because no jobs have been executed in your bootstrapped project. ![img](https://user-images.githubusercontent.com/18723510/187690315-6312088d-9888-4c55-9bbf-c6f2687fa547.png) @@ -57,7 +57,7 @@ The forecast report, logs, and completed job data will be located within the `tm ### Total -The "Total" section of the forecast report contains high level statistics related to all the jobs completed after the `--start-date` CLI option: +The `Total` section of the forecast report contains high level statistics related to all the jobs completed after the `--start-date` CLI option: ```md - Job count: **84** @@ -88,8 +88,8 @@ The "Total" section of the forecast report contains high level statistics relate Here are some key terms of items defined in the forecast report: -- The `job count` is the total number of completed jobs. -- The `pipeline count` is the number of unique pipelines used. +- The `Job count` is the total number of completed jobs. +- The `Pipeline count` is the number of unique pipelines used. - `Execution time` describes the amount of time a runner spent on a job. This metric can be used to help plan for the cost of GitHub hosted runners. - This metric is correlated to how much you should expect to spend in GitHub Actions. This will vary depending on the hardware used for these minutes and the [Actions pricing calculator](https://github.com/pricing/calculator) should be used to estimate a dollar amount. - `Queue time` metrics describe the amount of time a job spent waiting for a runner to be available to execute it. From e4374d199eb0b40597a8c0a5ea37fe0e36173ece Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Fri, 9 Sep 2022 08:21:26 -0700 Subject: [PATCH 47/69] Update jenkins/5-migrate.md Co-authored-by: Begona Guereca --- jenkins/5-migrate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins/5-migrate.md b/jenkins/5-migrate.md index 936e940..c1121e1 100644 --- a/jenkins/5-migrate.md +++ b/jenkins/5-migrate.md @@ -18,7 +18,7 @@ We need to answer the following questions before running a `migrate` command: 2. Where do we want to store the logs? - __./tmp/migrate__ 3. What is the URL for the GitHub repository to add the workflow to? - - __this repository__. The URL should should follow the pattern with `:owner` and `:repo` replaced with your values. + - __this repository__. The URL should follow the pattern with `:owner` and `:repo` replaced with your values. ### Steps From 781c2f36997e5e11bae0c7ef2f894863397d0d61 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Fri, 9 Sep 2022 08:21:37 -0700 Subject: [PATCH 48/69] Update azure_devops/readme.md Co-authored-by: Begona Guereca --- azure_devops/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/readme.md b/azure_devops/readme.md index bfed300..369aafe 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -39,7 +39,7 @@ These steps **must** be completed prior to starting other labs. 1. Create an Azure DevOps personal access token: - - Navigate to your existing organization () in your browswer. + - Navigate to your existing organization () in your browser. - Click `User settings` in the top right corner of the screen. - Click `Personal access tokens`. - Select `+ New Token` From a3f2fe338f43f05014e321a66dd7245c56d74796 Mon Sep 17 00:00:00 2001 From: Jennifer Kerns <47341891+JenniferKerns@users.noreply.github.com> Date: Tue, 13 Sep 2022 08:55:51 -0400 Subject: [PATCH 49/69] Readme edits --- azure_devops/1-configure.md | 61 ++++++++++++++------------- azure_devops/2-audit.md | 20 ++++----- azure_devops/3-dry-run.md | 16 +++---- azure_devops/4-custom-transformers.md | 36 ++++++++-------- azure_devops/5-migrate.md | 12 +++--- azure_devops/6-forecast.md | 14 +++--- azure_devops/readme.md | 30 ++++++------- gitlab/1-configure.md | 40 +++++++++--------- gitlab/2-audit.md | 20 ++++----- gitlab/3-dry-run.md | 22 +++++----- gitlab/4-custom-transformers.md | 26 ++++++------ gitlab/5-migrate.md | 14 +++--- gitlab/6-forecast.md | 20 ++++----- gitlab/readme.md | 28 ++++++------ jenkins/1-configure.md | 50 +++++++++++----------- jenkins/2-audit.md | 16 +++---- jenkins/3-dry-run.md | 26 ++++++------ jenkins/4-custom-transformers.md | 44 +++++++++---------- jenkins/5-migrate.md | 18 ++++---- jenkins/6-forecast.md | 22 +++++----- jenkins/readme.md | 26 ++++++------ readme.md | 13 +++--- 22 files changed, 287 insertions(+), 287 deletions(-) diff --git a/azure_devops/1-configure.md b/azure_devops/1-configure.md index 6f0795d..0549334 100644 --- a/azure_devops/1-configure.md +++ b/azure_devops/1-configure.md @@ -6,14 +6,15 @@ You will need to complete all of the setup instructions [here](./readme.md#confi ## Configuring credentials -1. Create an Azure DevOps Personal Access Token (PAT). - 1. __Note__: you may skip this step if you still have the PAT created during the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). - 2. Navigate to your existing organization () in your browser. - 3. Click `User settings` in the top right corner of the screen. - 4. Click `Personal access tokens`. - 5. Select `+ New Token` - 6. Name your token, select the organization where you want to use the token, and set your token to automatically expire after a set number of days. - 7. Select the following scopes (you may need to `Show more scopes` to reveal all scopes): +1. Create an Azure DevOps personal access token (PAT). + + __Note__: you can skip this step if you still have the PAT created during the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). + - Navigate to your existing organization () in your browser. + - In the top right corner of your screen, click `User settings`. + - Click `Personal access tokens`. + - Select `+ New Token` + - Name your token, select the organization where you want to use the token, and set your token to automatically expire after a set number of days. + - Select the following scopes (you may need to `Show more scopes` to reveal all scopes): - Agents Pool: `Read` - Build: `Read & Execute` - Code: `Read & Write` @@ -22,38 +23,38 @@ You will need to complete all of the setup instructions [here](./readme.md#confi - Service Connections: `Read` - Task Groups: `Read` - Variable Groups: `Read` - 8. Click `Create`. - 9. Copy the generated API token and save in a safe location. + - Click `Create`. + - Copy the generated API token and save it in a safe location. -2. Create a GitHub Personal Access Token (PAT): - 1. Open github.com in a new browser tab. - 2. Click your profile photo in the top right of the UI and click `Settings`. - 3. Click on `Developer Settings` in the left hand panel. - 4. Click `Personal Access Tokens` and then `Legacy tokens` (if present). - 5. Click `Generate new token` and then `Legacy tokens`. You may be required to authenticate with GitHub during this step. - 6. Select the following scopes: `read:packages` and `workflow`. - 7. Click `Generate token`. - 8. Copy the generated PAT and save in a safe location. +2. Create a GitHub personal access token (PAT): + - Open github.com in a new browser tab. + - In the top right corner of the UI, click your profile photo and then click `Settings`. + - In the left panel, click `Developer Settings`. + - Click `Personal access tokens` and then `Legacy tokens` (if present). + - Click `Generate new token` and then `Generate new legacy token`. You may be required to authenticate with GitHub during this step. + - Select the following scopes: `workflow` and `read:packages`. + - Click `Generate token`. + - Copy the generated PAT and save it in a safe location. 3. Run the `configure` CLI command: - - Select the `TERMINAL` tab from within the codespace terminal window. + - Select the `TERMINAL` tab from within the codespace terminal. - Run the following command: `gh valet configure`. - - Using the down arrow key to highlight `Azure DevOps`, press the spacebar to select, and then hit enter to continue. - - At the GitHub Container Registry prompt enter the GitHub PAT generated in step 2 and press enter. - - At the GitHub PAT prompt enter the GitHub PAT generated in step 2 and press enter. - - At the GitHub url prompt enter the GitHub instance url or hit enter to accept the default value (`https://github.com`). - - At the Azure DevOps token prompt enter the access token from step 1 and press enter. - - At the Azure DevOps url prompt enter your Azure DevOps url or hit enter to accept the default value (`https://dev.azure.com`). - - At the prompt enter your Azure Devops organization name. This should be the same organization used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). - - At the prompt enter your Azure Devops project name. This should be the same project name used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). + - Use the down arrow key to highlight `Azure DevOps`, press the spacebar to select, and then press enter to continue. + - At the GitHub Container Registry prompt, enter the GitHub PAT generated in step 2 and press enter. + - At the GitHub PAT prompt, enter the GitHub PAT generated in step 2 and press enter. + - At the GitHub URL prompt, enter the GitHub instance URL or press enter to accept the default value (`https://github.com`). + - At the Azure DevOps token prompt, enter the access token from step 1 and press enter. + - At the Azure DevOps URL prompt, enter your Azure DevOps URL or press enter to accept the default value (`https://dev.azure.com`). + - At the prompt, enter your Azure DevOps organization name. This should be the same organization used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). + - At the prompt, enter your Azure DevOps project name. This should be the same project name used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). ![img](https://user-images.githubusercontent.com/18723510/187771230-27c97889-d98a-48f7-af01-c1a9f8df6423.png) ## Verify your environment -To verify our environment is configured correctly, we are going to run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. +To verify our environment is configured correctly, run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. -1. In the codespace terminal run the following command: +1. In the codespace terminal, run the following command: ```bash gh valet update diff --git a/azure_devops/2-audit.md b/azure_devops/2-audit.md index f40b306..1a2d327 100644 --- a/azure_devops/2-audit.md +++ b/azure_devops/2-audit.md @@ -6,21 +6,21 @@ The `audit` command operates by fetching all of the pipelines defined in an Azur ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and bootstrap an Azure DevOps project. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and bootstrap an Azure DevOps project. 2. Completed the [configure lab](./1-configure.md#configuring-credentials). ## Perform an audit -We will be performing an audit against the bootstrapped Azure DevOps project. We will need to answer the following questions before running this command: +You will now perform an audit against the bootstrapped Azure DevOps project. Answer the following questions before running this command: -1. What is the Azure DevOps organization name that we want to audit? +1. What is the Azure DevOps organization name that you want to audit? - __:organization__. This should be the same organization used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization) -2. What is the Azure DevOps project name that we want to audit? +2. What is the Azure DevOps project name that you want to audit? - __:project__. This should be the same project name used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization) -3. Where do we want to store the result? - - __./tmp/audit__. This can be any path within the working directory that Valet commands are executed from. +3. Where do you want to store the result? + - __./tmp/audit__. This can be any path within the working directory from which Valet commands are executed. ### Steps @@ -31,7 +31,7 @@ We will be performing an audit against the bootstrapped Azure DevOps project. We gh valet audit azure-devops --output-dir tmp/audit --namespace valet ``` - __Note__: The Azure DevOps organization and project name can be omitted from the `audit` command as they were persisted in the `.env.local` file in the [configure lab](./1-configure.md). You can optionally provide these arguments on the command line with the `--azure-devops-organization` and `--azure-devops-project` CLI options. + __Note__: The Azure DevOps organization and project name can be omitted from the `audit` command because they were persisted in the `.env.local` file in the [configure lab](./1-configure.md). You can optionally provide these arguments on the command line with the `--azure-devops-organization` and `--azure-devops-project` CLI options. 3. The command will list all the files written to disk in green when the command succeeds. @@ -39,7 +39,7 @@ We will be performing an audit against the bootstrapped Azure DevOps project. We 1. Find the `audit_summary.md` file in the file explorer. 2. Right-click the `audit_summary.md` file and select `Open Preview`. -3. This file contains details that summarizes what percentage of your pipelines were converted automatically. +3. This file contains details that summarize what percentage of your pipelines were converted automatically. ### Review audit summary @@ -73,7 +73,7 @@ Here are some key terms in the "Pipelines" section in the above example: - Classic (designer) - YAML - Release -- __Failed pipelines__ encountered a fatal error when being converted. This can occur for one of three reasons: +- __Failed__ pipelines encountered a fatal error when being converted. This can occur for one of three reasons: - The pipeline was misconfigured and not valid in Azure DevOps. - Valet encountered an internal error when converting it. - There was an unsuccessful network response, often due to invalid credentials, that caused the pipeline to be inaccessible. @@ -172,4 +172,4 @@ Each pipeline will have a variety of files written that include: ### Next lab -[Perform a dry-run of an Azure DevOps pipeline](3-dry-run.md) +[Perform a dry-run migration of an Azure DevOps pipeline](3-dry-run.md) diff --git a/azure_devops/3-dry-run.md b/azure_devops/3-dry-run.md index 3aa2db9..da6ac9a 100644 --- a/azure_devops/3-dry-run.md +++ b/azure_devops/3-dry-run.md @@ -1,16 +1,16 @@ -# Perform a dry-run of an Azure DevOps pipeline +# Perform a dry-run migration of an Azure DevOps pipeline In this lab you will use the `dry-run` command to convert an Azure DevOps pipeline to its equivalent GitHub Actions workflow. ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and bootstrap an Azure DevOps project. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and bootstrap an Azure DevOps project. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). 3. Completed the [audit lab](./2-audit.md). ## Perform a dry run -We will be performing a dry-run for a pipeline in the bootstrapped Azure DevOps project. We will need to answer the following questions before running this command: +You will perform a dry run for a pipeline in the bootstrapped Azure DevOps project. Answer the following questions before running this command: 1. What is the id of the pipeline to convert? - __:id__. This id can be found by: @@ -18,12 +18,12 @@ We will be performing a dry-run for a pipeline in the bootstrapped Azure DevOps - Selecting the pipeline with the name "valet-pipeline1" - Inspecting the URL to locate the pipeline id -2. Where do we want to store the result? - - __./tmp/dry-run-lab__. This can be any path within the working directory that Valet commands are executed from. +2. Where do you want to store the result? + - __./tmp/dry-run-lab__. This can be any path within the working directory from which Valet commands are executed. ### Steps -1. Navigate to the codespace terminal. +1. Navigate to your codespace terminal. 2. Run the following command from the root directory: ```bash @@ -32,7 +32,7 @@ We will be performing a dry-run for a pipeline in the bootstrapped Azure DevOps 3. The command will list all the files written to disk when the command succeeds. 4. View the converted workflow: - - Find `./tmp/dry-run-lab` in the file explorer pane in codespaces. + - Find `./tmp/dry-run-lab` in the file explorer pane in your codespace. - Click `valet-pipeline1.yml` to open. ## Inspect the output files @@ -86,7 +86,7 @@ jobs: -Despite these 2 pipelines using different syntax they will function equivalently. +Despite these two pipelines using different syntax they will function equivalently. ## Next lab diff --git a/azure_devops/4-custom-transformers.md b/azure_devops/4-custom-transformers.md index c13ef4d..e3edce9 100644 --- a/azure_devops/4-custom-transformers.md +++ b/azure_devops/4-custom-transformers.md @@ -9,14 +9,14 @@ In this lab we will build upon the `dry-run` command to override Valet's default ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and bootstrap an Azure DevOps project. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and bootstrap an Azure DevOps project. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). 3. Completed the [audit lab](./2-audit.md). 4. Completed the [dry-run lab](./3-dry-run.md). ## Perform a dry run -We will be performing a dry-run for a pipeline in the bootstrapped Azure DevOps project. We will need to answer the following questions before running this command: +You will perform a dry-run for a pipeline in the bootstrapped Azure DevOps project. Answer the following questions before running this command: 1. What is the id of the pipeline to convert? - __:pipeline_id__. This id can be found by: @@ -24,8 +24,8 @@ We will be performing a dry-run for a pipeline in the bootstrapped Azure DevOps - Selecting the pipeline with the name "valet-custom-transformer-example" - Inspecting the URL to locate the pipeline id -2. Where do we want to store the result? - - __./tmp/dry-run-lab__. This can be any path within the working directory that Valet commands are executed from. +2. Where do you want to store the result? + - __./tmp/dry-run-lab__. This can be any path within the working directory from which Valet commands are executed. ### Steps @@ -38,7 +38,7 @@ We will be performing a dry-run for a pipeline in the bootstrapped Azure DevOps 3. The command will list all the files written to disk when the command succeeds. 4. View the converted workflow: - - Find `./tmp/dry-run-lab` in the file explorer pane in codespaces. + - Find `./tmp/dry-run-lab` in the file explorer pane in your codespace. - Click `valet-custom-transformer-example.yml` to open. The converted workflow that is generated can be seen below: @@ -81,26 +81,26 @@ _Note_: You can refer to the previous [lab](./3-dry-run.md) to learn about the f ## Custom transformers for build steps -We can use custom transformers to override Valet's default behavior. In this scenario, we may want to override the behavior for converting `DotnetCoreCLI@2` tasks to support parameters that are glob patterns. We will need to answer the following questions before writing a custom transformer: +You can use custom transformers to override Valet's default behavior. In this scenario, you may want to override the behavior for converting `DotnetCoreCLI@2` tasks to support parameters that are glob patterns. Answer the following questions before writing a custom transformer: 1. What is the "identifier" of the step to customize? - __DotnetCoreCLI@2__ 2. What is the desired Actions syntax to use instead? - - After some research, we have determined that the uploading test results as an artifact will be suitable: + - After some research, you have determined that the uploading test results as an artifact will be suitable: ```yaml - run: shopt -s globstar; for f in ./**/*.csproj; do dotnet build $f --configuration ${{ env.BUILDCONFIGURATION }} ; done shell: bash ``` -Now we can begin to write the custom transformer. Customer transformers use a DSL built on top of Ruby and should be defined in a file with the `.rb` file extension. You can create this file by running the following command in your codespace terminal: +Now you can begin to write the custom transformer. Customer transformers use a DSL built on top of Ruby and should be defined in a file with the `.rb` file extension. You can create this file by running the following command in your codespace terminal: ```bash code transformers.rb ``` -Next, we will define a `transform` method for the `DotnetCoreCLI@2` identifier by adding the following code to `transformers.rb`: +Next, you will define a `transform` method for the `DotnetCoreCLI@2` identifier by adding the following code to `transformers.rb`: ```ruby transform "DotNetCoreCLI@2" do |item| @@ -124,13 +124,13 @@ end This method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. Valet will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in Azure DevOps. -Now, we can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: +Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: ```bash gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id -o tmp/dry-run-lab --custom-transformers transformers.rb ``` -Open the workflow that is generated and inspect the contents. Now, the `DotnetCoreCLI@2` steps are converted using the customized behavior! +Open the workflow that is generated and inspect the contents. Now the `DotnetCoreCLI@2` steps are converted using the customized behavior! ```diff - - name: Restore @@ -147,7 +147,7 @@ Open the workflow that is generated and inspect the contents. Now, the `DotnetCo ## Custom transformers for environment variables -We can also use custom transformers to edit the values of environment variables in converted workflows. In our example, we will be updating the `BUILDCONFIGURATION` environment variable to be `Debug` instead of `Release`. +You can also use custom transformers to edit the values of environment variables in converted workflows. In this example, you will be updating the `BUILDCONFIGURATION` environment variable to be `Debug` instead of `Release`. To do this, add the following code to the `transformers.rb` file. @@ -157,7 +157,7 @@ env "BUILDCONFIGURATION", "Debug" In this example, the first parameter to the `env` method is the environment variable name and the second is the updated value. -Now, we can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `DB_ENGINE` environment variable will be set to `mongodb`: +Now you can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow, the `DB_ENGINE` environment variable will be set to `mongodb`: ```diff env: @@ -168,7 +168,7 @@ env: ## Custom transformers for runners -Finally, we can use custom transformers to dictate which runners converted workflows should use. To do this we will need to answer the following questions: +Finally, you can use custom transformers to dictate which runners converted workflows should use. First, answer the following questions: 1. What is the label of the runner in Azure DevOps to update? - __mechamachine__ @@ -176,7 +176,7 @@ Finally, we can use custom transformers to dictate which runners converted workf 2. What is the label of the runner in Actions to use instead? - __ubuntu-latest__ -With these questions answered, we can add the following code to the `transformers.rb` file: +With these questions answered, you can add the following code to the `transformers.rb` file: ```ruby runner "mechamachine", "ubuntu-latest" @@ -184,7 +184,7 @@ runner "mechamachine", "ubuntu-latest" In this example, the first parameter to the `runner` method is the Azure DevOps label and the second is the Actions runner label. -Now, we can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `runs-on` statement will use the customized runner label: +Now you can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow, the `runs-on` statement will use the customized runner label: ```diff - runs-on: @@ -193,7 +193,7 @@ Now, we can perform another `dry-run` command with the `--custom-transformers` C + runs-on: ubuntu-latest ``` -At this point of the lab the file contents of `transformers.rb` should match this: +At this point, the file contents of `transformers.rb` should match this:
Custom transformers 👇 @@ -224,7 +224,7 @@ runner "mechamachine", "ubuntu-latest"
-Thats it! At this point you have overridden Valet's default behavior by customizing the conversion of: +That's it! At this point you have overridden Valet's default behavior by customizing the conversion of: - Build steps - Environment variables diff --git a/azure_devops/5-migrate.md b/azure_devops/5-migrate.md index 5ef8212..43e17a1 100644 --- a/azure_devops/5-migrate.md +++ b/azure_devops/5-migrate.md @@ -4,21 +4,21 @@ In this lab, you will use the `migrate` command to convert an Azure DevOps pipel ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and bootstrap an Azure DevOps project. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and bootstrap an Azure DevOps project. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). 3. Completed the [dry-run lab](./3-dry-run.md). 4. Completed the [custom transformers lab](./4-custom-transformers.md). ## Performing a migration -We need to answer the following questions before running a `migrate` command: +Answer the following questions before running a `migrate` command: 1. What is the id of the pipeline to convert? - __:pipeline_id__. This id can be found by: - Navigating to the build pipelines in the bootstrapped Azure DevOps project - Selecting the pipeline with the name "valet-pipeline2" - Inspecting the URL to locate the pipeline id -2. Where do we want to store the logs? +2. Where do you want to store the logs? - __./tmp/migrate__ 3. What is the URL for the GitHub repository to add the workflow to? - __this repository__. The URL should follow the pattern with `:owner` and `:repo` replaced with your values. @@ -43,13 +43,13 @@ We need to answer the following questions before running a `migrate` command: ### Inspect the pull request -The first thing we should notice about the PR is that there is a list of manual steps for us to complete: +The first thing to notice about the pull request is that there is a list of manual steps to complete: ![img](https://user-images.githubusercontent.com/8703324/189002125-45561312-dd26-42fd-bd38-a596614ee871.png) -Next, you can inspect the `Files changed` in this PR and see the converted workflow that is being added. Any additional changes or code reviews that were needed should be done in this PR. +Next, you can inspect the `Files changed` in this pull request to see the converted workflow that is being added. Any additional changes or code reviews that were needed should be done in this pull request. -Finally, you can merge the PR once your review has completed. We can then view the workflow running by selecting the `Actions` menu in the top navigation bar in GitHub. +Finally, you can merge the pull request once your review has completed. You can then view the workflow running by selecting the `Actions` menu in the top navigation bar in GitHub. ![img](https://user-images.githubusercontent.com/19557880/185509704-90243ec5-e77f-4baf-a9b2-d9a4d9fda199.png) diff --git a/azure_devops/6-forecast.md b/azure_devops/6-forecast.md index d413a55..0937dba 100644 --- a/azure_devops/6-forecast.md +++ b/azure_devops/6-forecast.md @@ -4,20 +4,20 @@ In this lab you will use the `forecast` command to forecast potential GitHub Act ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and bootstrap an Azure DevOps project. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and bootstrap an Azure DevOps project. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). ## Perform a forecast -We will need to answer the following questions before running the `forecast` command: +Answer the following questions before running the `forecast` command: -1. What is the Azure DevOps organization name that we want to audit? +1. What is the Azure DevOps organization name that you want to audit? - __:organization__. This should be the same organization used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization) -2. What is the Azure DevOps project name that we want to audit? +2. What is the Azure DevOps project name that you want to audit? - __:project__. This should be the same project name used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization) -3. Where do we want to store the results? +3. Where do you want to store the results? - `./tmp/forecast_reports` ### Steps @@ -33,7 +33,7 @@ We will need to answer the following questions before running the `forecast` com ![img](https://user-images.githubusercontent.com/18723510/187690315-6312088d-9888-4c55-9bbf-c6f2687fa547.png) -4. If you inspect the help menu using the `gh valet forecast --help` command then you will see a `--source-file-path` option. This option can be used to perform a `forecast` command using json files that are already present on the filesystem. These labs come bundled with sample json files located [here](./bootstrap/jobs.json). +4. If you inspect the help menu using the `gh valet forecast --help` command, you will see a `--source-file-path` option. You can use this option to perform a `forecast` command using json files that are already present on the filesystem. These labs come bundled with sample json files located [here](./bootstrap/jobs.json). ![img](https://user-images.githubusercontent.com/18723510/187692843-623d4bdc-8970-4348-a632-73c8b00a40f8.png) @@ -91,7 +91,7 @@ Here are some key terms of items defined in the forecast report: - The `Job count` is the total number of completed jobs. - The `Pipeline count` is the number of unique pipelines used. - `Execution time` describes the amount of time a runner spent on a job. This metric can be used to help plan for the cost of GitHub hosted runners. - - This metric is correlated to how much you should expect to spend in GitHub Actions. This will vary depending on the hardware used for these minutes and the [Actions pricing calculator](https://github.com/pricing/calculator) should be used to estimate a dollar amount. + - This metric is correlated to how much you should expect to spend in GitHub Actions. This will vary depending on the hardware used for these minutes. You can use the [Actions pricing calculator](https://github.com/pricing/calculator) to estimate a dollar amount. - `Queue time` metrics describe the amount of time a job spent waiting for a runner to be available to execute it. - `Concurrent jobs` metrics describe the amount of jobs running at any given time. This metric can be used to define the number of runners a customer should configure. diff --git a/azure_devops/readme.md b/azure_devops/readme.md index 369aafe..a924ca6 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -1,25 +1,25 @@ # Azure Pipelines to Actions migrations powered by Valet -The instructions below will guide you through configuring a Codespace that will be used in these labs to demonstrate how Valet can be used to migrate Azure DevOps pipelines to GitHub Actions. +These instructions will guide you through configuring the GitHub Codespaces environment that will be used in these labs to demonstrate how to use Valet to migrate Azure DevOps pipelines to GitHub Actions. These steps **must** be completed prior to starting other labs. ## Create your own repository for these labs -1. Ensure that you have created a repository using the [valet-customers/labs](https://github.com/valet-customers/labs) as a template. +- Ensure that you have created a repository using [valet-customers/labs](https://github.com/valet-customers/labs) as a template. -## Configure your Codespace +## Configure your codespace -1. Start a new Codespace. +1. Start a new codespace. - Click the `Code` button on your repository's landing page. - Click the `Codespaces` tab. - Click `Create codespaces on main` to create the codespace. -- After the Codespace has initialized there will be a terminal present. +- After the codespace has initialized there will be a terminal present. 2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). -- Run the following command in the codespace's terminal: +- Run the following command in the codespace terminal: ```bash gh valet version @@ -33,14 +33,14 @@ These steps **must** be completed prior to starting other labs. valet-cli unknown ``` - - If `gh valet version` did not produce similar output then please follow the troubleshooting [guide](#troubleshoot-the-valet-cli). + - If `gh valet version` did not produce similar output, please refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). ## Bootstrap your Azure DevOps organization -1. Create an Azure DevOps personal access token: +1. Create an Azure DevOps personal access token (PAT): - Navigate to your existing organization () in your browser. - - Click `User settings` in the top right corner of the screen. + - In the top right corner of the screen, click `User settings`. - Click `Personal access tokens`. - Select `+ New Token` - Name your token, select the organization where you want to use the token, and set your token to automatically expire after a set number of days. @@ -54,11 +54,11 @@ These steps **must** be completed prior to starting other labs. - Task Groups: `Read` - Variable Groups: `Read` - Click `Create`. - - Copy the generated API token and save in a safe location. + - Copy the generated API token and save it in a safe location. 2. Execute the Azure DevOps setup script that will create a new Azure DevOps project in your organization to be used in the following labs. This script should only be run once. - - Run the following command from the codespace's terminal, replacing the values accordingly: + - Run the following command from the codespace terminal, replacing the values accordingly: - `:organization`: the name of your existing Azure DevOps organization - `:project`: the name of the project to be created in your Azure DevOps organization - `:access_token`: the PAT created in step 1 above @@ -77,7 +77,7 @@ Perform the following labs to learn how to migrate Azure DevOps pipelines to Git 1. [Configure credentials for Valet](1-configure.md) 2. [Perform an audit of an Azure DevOps project](2-audit.md) -3. [Perform a dry-run of a Azure DevOps pipeline](3-dry-run.md) +3. [Perform a dry-run migration of an Azure DevOps pipeline](3-dry-run.md) 4. [Use custom transformers to customize Valet's behavior](4-custom-transformers.md) 5. [Perform a production migration of a Azure DevOps pipeline](5-migrate.md) 6. [Forecast potential build runner usage](6-forecast.md) @@ -87,7 +87,7 @@ Perform the following labs to learn how to migrate Azure DevOps pipelines to Git The CLI extension for Valet can be manually installed by following these steps: - Verify you are in the codespace terminal -- Run this command from within the codespace's terminal: +- Run this command from within the codespace terminal: ```bash gh extension install github/gh-valet @@ -99,10 +99,10 @@ The CLI extension for Valet can be manually installed by following these steps: ✓ Installed extension github/gh-valet ``` -- If you get an error similar to the image below, then click the link in the terminal output to authorize the token. +- If you get an error similar to the image below, click the link in the terminal output to authorize the token. - Restart the codespace after clicking the link. ![img](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) -- Verify Valet CLI extension is installed and working by running the following command from the codespace's terminal: +- Verify Valet CLI extension is installed and working by running the following command from the codespace terminal: ```bash gh valet version diff --git a/gitlab/1-configure.md b/gitlab/1-configure.md index 6b4aa0f..2fe886f 100644 --- a/gitlab/1-configure.md +++ b/gitlab/1-configure.md @@ -6,7 +6,7 @@ You will need to complete all of the setup instructions [here](./readme.md#confi ## Configuring credentials -1. Run the setup script in the codespace's terminal to ensure the GitLab server is ready: +1. Run the setup script in the codespace terminal to ensure the GitLab server is ready: ```bash ./gitlab/bootstrap/setup.sh ``` @@ -16,40 +16,40 @@ You will need to complete all of the setup instructions [here](./readme.md#confi - In the `PORTS` tab find the row for port 80. - Hover over the address under the `Local Address` column and click the globe to "open in browser". -3. Create a GitLab personal access token: +3. Create a GitLab personal access token (PAT): - Authenticate with the GitLab server using the following credentials: - Username: `root` - Password: `valet-labs!` - - Follow the GitLab [instructions](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token) to generate a personal access token. + - Follow the GitLab [instructions](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token) to generate a PAT. - Ensure the token has the `read_api` scope. - - Copy the generated token and save in a safe location. + - Copy the generated token and save it in a safe location. -4. Create a GitHub Personal Access Token (PAT): +4. Create a GitHub personal access token (PAT): - Open github.com in a new browser tab. - - Click your profile photo in the top right of the UI and click `Settings`. - - Click on `Developer Settings` in the left hand panel. - - Click `Personal Access Tokens` and then `Legacy tokens` (if present). - - Click `Generate new token` and then `Legacy tokens`. You may be required to authenticate with GitHub during this step. - - Select the following scopes: `read:packages` and `workflow`. + - In the top right corner of the UI, click your profile photo and click `Settings`. + - In the left panel, click `Developer Settings`. + - Click `Personal access tokens` and then `Legacy tokens` (if present). + - Click `Generate new token` and then `Generate new legacy token`. You may be required to authenticate with GitHub during this step. + - Select the following scopes: `workflow` and `read:packages`. - Click `Generate token`. - - Copy the generated PAT and save in a safe location. + - Copy the generated PAT and save it in a safe location. -4. Run the `configure` CLI command: +5. Run the `configure` CLI command: - Select the `TERMINAL` tab from within the codespace terminal window. - Run the following command: `gh valet configure`. - - Using the down arrow key to highlight `GitLab CI`, press the spacebar to select, and then hit enter to continue. - - At the prompt enter your GitHub Username and press enter. - - At the GitHub Container Registry prompt enter the GitHub PAT generated in step 4 and press enter. - - At the GitHub PAT prompt enter the GitHub PAT generated in step 4 and press enter. - - At the GitHub url prompt enter the GitHub instance url or hit enter to accept the default value (`https://github.com`). - - At the GitLab CI token prompt enter the GitLab CI access token from step 3 and press enter. - - At the GitLab CI url prompt enter `http://localhost` and press enter. + - Use the down arrow key to highlight `GitLab CI`, press the spacebar to select, and then press enter to continue. + - At the prompt, enter your GitHub username and press enter. + - At the GitHub Container Registry prompt, enter the GitHub PAT generated in step 4 and press enter. + - At the GitHub PAT prompt, enter the GitHub PAT generated in step 4 and press enter. + - At the GitHub URL prompt, enter the GitHub instance URL or press enter to accept the default value (`https://github.com`). + - At the GitLab CI token prompt, enter the GitLab CI access token from step 3 and press enter. + - At the GitLab CI URL prompt, enter `http://localhost` and press enter. ![img](https://user-images.githubusercontent.com/18723510/183990474-d0b2559c-d2bf-40d9-ac43-19af53e45329.png) ## Verify your environment -To verify our environment is configured correctly, we are going to run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. +To verify your environment is configured correctly, run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. 1. In the codespace terminal run the following command: diff --git a/gitlab/2-audit.md b/gitlab/2-audit.md index 5685af9..efe8d97 100644 --- a/gitlab/2-audit.md +++ b/gitlab/2-audit.md @@ -6,18 +6,18 @@ The `audit` command operates by fetching all of the pipelines defined in a GitLa ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and start a GitLab server. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a GitLab server. 2. Completed the [configure lab](./1-configure.md#configuring-credentials). ## Perform an audit -We will be performing an audit against your preconfigured GitLab server. We will need to answer the following questions before running this command: +You will be performing an audit against your preconfigured GitLab server. Answer the following questions before running this command: -1. What namespace (e.g. group) do we want to audit? - - __valet__. In this example we will be auditing the `valet` group. In the future, you could add additional groups and subgroups to the audit command. +1. What namespace (e.g. group) do you want to audit? + - __valet__. In this example you will be auditing the `valet` group. In the future, you could add additional groups and subgroups to the audit command. -2. Where do we want to store the result? - - __./tmp/audit__. This can be any path within the working directory that Valet commands are executed from. +2. Where do you want to store the result? + - __./tmp/audit__. This can be any path within the working directory from which Valet commands are executed. ### Steps @@ -34,7 +34,7 @@ We will be performing an audit against your preconfigured GitLab server. We will 1. Find the `audit_summary.md` file in the file explorer. 2. Right-click the `audit_summary.md` file and select `Open Preview`. -3. This file contains details that summarizes what percentage of your pipelines were converted automatically. +3. This file contains details that summarize what percentage of your pipelines were converted automatically. ### Review audit summary @@ -68,7 +68,7 @@ Here are some key terms in the “Pipelines” section in the above example: - __Successful__ pipelines had 100% of the pipeline constructs and individual items converted automatically to their GitHub Actions equivalent. - __Partially successful__ pipelines had all of the pipeline constructs converted, however, there were some individual items (e.g. build tasks or build triggers) that were not converted automatically to their GitHub Actions equivalent. - __Unsupported__ pipelines are definition types that are not supported by Valet. Auto DevOps pipelines are not supported. -- __Failed pipelines__ encountered a fatal error when being converted. This can occur for one of three reasons: +- __Failed__ pipelines encountered a fatal error when being converted. This can occur for one of three reasons: - The pipeline was misconfigured and not valid in GitLab. - Valet encountered an internal error when converting it. - There was an unsuccessful network response, often due to invalid credentials, that caused the pipeline to be inaccessible. @@ -176,8 +176,8 @@ Each pipeline will have a variety of files written that include: - The original pipeline as it was defined in GitLab. - Any network responses used to convert a pipeline. - The converted workflow. -- Stack traces that can used to troubleshoot a failed pipeline conversion +- Stack traces that can be used to troubleshoot a failed pipeline conversion ### Next lab -[Perform a dry-run of a GitLab pipeline](3-dry-run.md) +[Perform a dry-run migration of a GitLab pipeline](3-dry-run.md) diff --git a/gitlab/3-dry-run.md b/gitlab/3-dry-run.md index 0859dae..31f9932 100644 --- a/gitlab/3-dry-run.md +++ b/gitlab/3-dry-run.md @@ -1,4 +1,4 @@ -# Perform a dry-run of a GitLab pipeline +# Perform a dry-run migration of a GitLab pipeline In this lab you will use the `dry-run` command to convert a GitLab pipeline to its equivalent GitHub Actions workflow. @@ -10,20 +10,20 @@ In this lab you will use the `dry-run` command to convert a GitLab pipeline to i ## Perform a dry run -We will be performing a dry-run against a pipeline in your preconfigured GitLab server. We will need to answer the following questions before running this command: +You will be performing a dry run against a pipeline in your preconfigured GitLab server. Answer the following questions before running this command: -1. What is the project we want to convert? +1. What project do you want to convert? - __basic-pipeline-example__ 2. What is the namespace for that project? - __Valet__ -3. Where do we want to store the result? - - __./tmp/dry-run-lab__. This can be any path within the working directory that Valet commands are executed from. +3. Where do you want to store the result? + - __./tmp/dry-run-lab__. This can be any path within the working directory from which Valet commands are executed. ### Steps -1. Navigate to the codespace terminal +1. Navigate to your codespace terminal 2. Run the following command from the root directory: ```bash @@ -35,7 +35,7 @@ We will be performing a dry-run against a pipeline in your preconfigured GitLab ![img](https://user-images.githubusercontent.com/18723510/184173635-aec28d1c-8c61-4dcf-a743-f86cbdc836c5.png) 4. View the converted workflow: - - Find `./tmp/dry-run/valet` in the file explorer pane in codespaces. + - Find `./tmp/dry-run/valet` in the file explorer pane in your codespace. - Click `basic-pipeline-example.yml` to open. ## Inspect the output files @@ -198,11 +198,11 @@ jobs: ``` -Despite these 2 pipelines using different syntax they will function equivalently. +Despite these two pipelines using different syntax they will function equivalently. -## Perform a dry-run of a pipeline using `include`'d files +## Perform a dry-run migration of a pipeline using `include`'d files -The previous example demonstrated a basic pipeline that mapped exactly to concepts in GitHub Actions. In this section, we will perform a dry-run of the `included-files-example` pipeline that uses the `include` statement in GitLab: +The previous example demonstrated a basic pipeline that mapped exactly to concepts in GitHub Actions. In this section, you will perform a dry run of the `included-files-example` pipeline that uses the `include` statement in GitLab: ```yaml include: @@ -247,7 +247,7 @@ jobs: It's important to note that Valet converted this into a single workflow without templates. This is because of fundamental differences in how GitLab templates and GitHub Actions templates (i.e. Reusable Workflows and Composite Actions) function in regards to job ordering. Unfortunately, elements of reusability will be sacrificed in order for the converted pipelines to function the same. It is likely that the output of Valet could be refactored to use [reusable workflow](https://docs.github.com/en/actions/using-workflows/reusing-workflows) at a later date. -As an added challenge, try constructing and running the `dry-run` command yourself. Hint, you should just have to change the project name. +As an added challenge, try constructing and running the `dry-run` command yourself. Hint, you should only have to change the project name. ## Next lab diff --git a/gitlab/4-custom-transformers.md b/gitlab/4-custom-transformers.md index 25e0fbb..9b2dbfa 100644 --- a/gitlab/4-custom-transformers.md +++ b/gitlab/4-custom-transformers.md @@ -1,6 +1,6 @@ # Using custom transformers to customize Valet's behavior -In this lab we will build upon the `dry-run` command to override Valet's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: +In this lab you will build upon the `dry-run` command to override Valet's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: 1. Convert items that are not automatically converted. 2. Convert items that were automatically converted using different actions. @@ -9,13 +9,13 @@ In this lab we will build upon the `dry-run` command to override Valet's default ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and start you GitLab server. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start you GitLab server. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). 3. Completed the [dry-run lab](./3-dry-run.md). ## Perform a dry-run -We will be performing a `dry-run` command to inspect the workflow that is converted by default. Run the following command within the codespace terminal: +You will be performing a `dry-run` command to inspect the workflow that is converted by default. Run the following command within the codespace terminal: ```bash gh valet dry-run gitlab --output-dir tmp --namespace valet --project terraform-example @@ -57,13 +57,13 @@ _Note_: You can refer to the previous [lab](./3-dry-run.md) to learn about the f ## Custom transformers for an unknown step -The converted workflow above contains an `artifacts.terraform` step was not automatically converted. We will need to answer the following questions before writing a custom transformer: +The converted workflow above contains an `artifacts.terraform` step that was not automatically converted. Answer the following questions before writing a custom transformer: 1. What is the "identifier" of the step to customize? - __artifacts.terraform__ 2. What is the desired Actions syntax to use instead? - - After some research, we have determined that the following bash script will provide similar functionality: + - After some research, you have determined that the following bash script will provide similar functionality: ```yaml - uses: actions/upload-artifact@v3 @@ -71,13 +71,13 @@ The converted workflow above contains an `artifacts.terraform` step was not auto path: VALUE_FROM_GITLAB ``` -Now we can begin to write the custom transformer. Customer transformers use a DSL built on top of Ruby and should be defined in a file with the `.rb` file extension. You can create this file by running the following command in your codespace terminal: +Now you can begin to write the custom transformer. Custom transformers use a DSL built on top of Ruby and should be defined in a file with the `.rb` file extension. You can create this file by running the following command in your codespace terminal: ```bash code transformers.rb ``` -Next, we will define a `transform` method for the `artifacts.terraform` identifier by adding the following code to `transformers.rb`: +Next, you will define a `transform` method for the `artifacts.terraform` identifier by adding the following code to `transformers.rb`: ```ruby transform "artifacts.terraform" do |item| @@ -92,7 +92,7 @@ end This method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. Valet will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in GitLab. -Now, we can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: +Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: ```bash gh valet dry-run gitlab --output-dir tmp --namespace valet --project terraform-example --custom-transformers transformers.rb @@ -107,7 +107,7 @@ The converted workflow that is generated by the above command will now use the c + path: "$PLAN_JSON" ``` -_Note_: If you were unsure what the data structure of `item` was then you could use the following code in the custom transformer to print `item` to the console: +_Note_: If you were unsure what the data structure of `item` was, you could use the following code in the custom transformer to print `item` to the console: ```ruby transform "artifacts.terraform" do |item| @@ -117,7 +117,7 @@ end ## Custom transformers for environment variables -We can also use custom transformers to edit the values of environment variables in converted workflows. In our example, we will be updating the `PLAN_JSON` environment variable to be `custom_plan.json` instead of `plan.json`. +You can also use custom transformers to edit the values of environment variables in converted workflows. In this example, you will update the `PLAN_JSON` environment variable to be `custom_plan.json` instead of `plan.json`. To do this, add the following code to the `transformers.rb` file. @@ -127,7 +127,7 @@ env "PLAN_JSON", "custom_plan.json" In this example, the first parameter to the `env` method is the environment variable name and the second is the updated value. -Now, we can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `PLAN_JSON` environment variable will be set to `custom_plan.json`: +Now you can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `PLAN_JSON` environment variable will be set to `custom_plan.json`: ```diff env: @@ -136,7 +136,7 @@ Now, we can perform another `dry-run` command with the `--custom-transformers` C + PLAN_JSON: custom_plan.json ``` -At this point of the lab the file contents of `transformers.rb` should match this: +At this point, the file contents of `transformers.rb` should match this:
Custom transformers 👇 @@ -156,7 +156,7 @@ At this point of the lab the file contents of `transformers.rb` should match thi
-Thats it! Congratulations you have overridden Valet's default behavior by customizing the conversion of: +That's it! Congratulations, you have overridden Valet's default behavior by customizing the conversion of: - Unknown steps - Environment variables diff --git a/gitlab/5-migrate.md b/gitlab/5-migrate.md index b58f953..3c08295 100644 --- a/gitlab/5-migrate.md +++ b/gitlab/5-migrate.md @@ -4,20 +4,20 @@ In this lab, you will use the `migrate` command to convert a GitLab pipeline and ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and start a GitLab server. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a GitLab server. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). 3. Completed the [dry-run lab](./3-dry-run.md). 4. Completed the [custom transformers lab](./4-custom-transformers.md). ## Performing a migration -We need to answer the following questions before running a `migrate` command: +Answer the following questions before running a `migrate` command: -1. What is the project we want to migrate? +1. What project do you want to migrate? - __rails-example__ 2. What is the namespace for that project? - __Valet__ -3. Where do we want to store the logs? +3. Where do you want to store the logs? - __./tmp/migrate__ 4. What is the URL for the GitHub repository to add the workflow to? - __this repository__. The URL should should follow the pattern with `:owner` and `:repo` replaced with your values. @@ -38,11 +38,11 @@ We need to answer the following questions before running a `migrate` command: ### Inspect the pull request -The first thing we should notice about the PR is that there is a list of manual steps for us to complete. +The first thing to notice about the pull request is that there is a list of manual steps to complete. -Next, you can inspect the "Files changed" in this PR and see the converted workflow that is being added. Any additional changes or code reviews that were needed should be done in this PR. +Next, you can inspect the "Files changed" in this pull request and see the converted workflow that is being added. Any additional changes or code reviews that were needed should be done in this pull request. -Finally, you can merge the PR once your review has completed. We can then view the workflow running by selecting the "Actions" menu in the top navigation bar in GitHub. +Finally, you can merge the pull request once your review has completed. You can then view the workflow running by selecting the "Actions" menu in the top navigation bar in GitHub. ![img](https://user-images.githubusercontent.com/18723510/184960870-590b1a28-422f-4350-9ec0-0423bf7ad445.png) diff --git a/gitlab/6-forecast.md b/gitlab/6-forecast.md index bb5294b..e28a7ef 100644 --- a/gitlab/6-forecast.md +++ b/gitlab/6-forecast.md @@ -4,23 +4,23 @@ In this lab you will use the `forecast` command to forecast potential GitHub Act ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and start a GitLab server. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a GitLab server. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). ## Perform a forecast -We will need to answer the following questions before running the `forecast` command: +Answer the following questions before running the `forecast` command: -1. What namespace do we want to run the forecast for? +1. What namespace do you want to run the forecast for? - **valet** -2. What is the date we want to start forecasting from? +2. What is the date you want to start forecasting from? - **2022-08-02**. This date is needed as it is prior to when the data was seeded in GitLab for these labs. This value defaults to the date one week ago, however, you should use a start date that will show a representative view of typical usage. -3. Where do we want to store the results? +3. Where do you want to store the results? - **./tmp/forecast_reports** ### Steps -1. Navigate to the codespace terminal +1. Navigate to your codespace terminal 2. Run the following command from the root directory: ```bash @@ -74,8 +74,8 @@ Here are some key terms of items defined in the forecast report: - The `job count` is the total number of completed jobs. - The `pipeline count` is the number of unique pipelines used. -- `Execution time` describes the amount of time a runner spent on a job. This metric can be used to help plan for the cost of GitHub hosted runners. - - This metric is correlated to how much you should expect to spend in GitHub Actions. This will vary depending on the hardware used for these minutes and the [Actions pricing calculator](https://github.com/pricing/calculator) should be used to estimate a dollar amount. +- `Execution time` describes the amount of time a runner spent on a job. This metric can be used to help plan for the cost of GitHub-hosted runners. + - This metric is correlated to how much you should expect to spend in GitHub Actions. This will vary depending on the hardware used for these minutes. You can use the [Actions pricing calculator](https://github.com/pricing/calculator) to estimate a dollar amount. - `Queue time` metrics describe the amount of time a job spent waiting for a runner to be available to execute it. - `Concurrent jobs` metrics describe the amount of jobs running at any given time. This metric can be used to define the number of runners a customer should configure. @@ -83,11 +83,11 @@ Additionally, these metrics are defined for each queue of runners defined in Git ## Forecasting multiple providers -We can examine the available options for the `forecast` command by running `gh valet forecast --help`. When you do this you will see the `--source-file-path` option: +You can examine the available options for the `forecast` command by running `gh valet forecast --help`. When you do this you will see the `--source-file-path` option: ![img](https://user-images.githubusercontent.com/19557880/186263140-f02c6cab-7979-417c-bdfe-b9590e9c5597.png) -The `--source-file-path` CLI option can be used to combine data from multiple reports into a single report. This becomes useful if you use multiple CI/CD providers and wanted to get a holistic view of the runner usage. This works by using the `.json` files generated by `forecast` commands as space-delimited values for the `--source-file-path` CLI option. Optionally, this value could be a glob pattern to dynamically specify the list of files (e.g. `**/*.json`). +You can use the `--source-file-path` CLI option to combine data from multiple reports into a single report. This becomes useful if you use multiple CI/CD providers and want to get a holistic view of the runner usage. This works by using the `.json` files generated by `forecast` commands as space-delimited values for the `--source-file-path` CLI option. Optionally, this value could be a glob pattern to dynamically specify the list of files (e.g. `**/*.json`). Run the following command from within the codespace terminal: diff --git a/gitlab/readme.md b/gitlab/readme.md index f4b1a6e..96cd78f 100644 --- a/gitlab/readme.md +++ b/gitlab/readme.md @@ -1,25 +1,25 @@ # GitLab to Actions migrations powered by Valet -The instructions below will guide you through configuring a GitHub Codespace environment that will be used in subsequent labs that demonstrate how to use Valet to migrate GitLab pipelines to GitHub Actions. +These instructions will guide you through configuring the GitHub Codespaces environment that will be used in these labs that demonstrate how to use Valet to migrate GitLab pipelines to GitHub Actions. These steps **must** be completed prior to starting other labs. ## Create your own repository for these labs -1. Ensure that you have created a repository using the [valet-customers/labs](https://github.com/valet-customers/labs) as a template. +- Ensure that you have created a repository using [valet-customers/labs](https://github.com/valet-customers/labs) as a template. -## Configure your Codespace +## Configure your codespace -1. Start the codespace +1. Start a new codespace - Click the `Code` button on your repository's landing page. - Click the `Codespaces` tab. - Click `Create codespaces on main` to create the codespace. -- After the Codespace has initialized there will be a terminal present. +- After the codespace has initialized there will be a terminal present. 2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). -- Run the following command in the codespace's terminal: +- Run the following command in the codespace terminal: ```bash gh valet version @@ -33,20 +33,20 @@ These steps **must** be completed prior to starting other labs. valet-cli unknown ``` - - If `gh valet version` did not produce similar output then please follow the troubleshooting [guide](#troubleshoot-the-valet-cli). + - If `gh valet version` did not produce similar output, please refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). ## Bootstrap a GitLab server -1. Execute the GitLab setup script that will start a container with GitLab running inside of it. The script should be executed when starting a new Codespace or restarting an existing one. +1. Execute the GitLab setup script that will start a container with GitLab running inside of it. The script should be executed when starting a new codespace or restarting an existing one. -- Run the following command from the codespace's terminal: +- Run the following command from the codespace terminal: ```bash ./gitlab/bootstrap/setup.sh ``` - After some time, a pop-up box should appear with a link to the URL for your GitLab server. - - You can also access the URL by going to the `Ports` tab in your terminal. Right click on the URL listed under the `Local Address` and click the `Open in Browser` tab. + - You can also access the URL by going to the `Ports` tab in your terminal. Right-click the URL listed under the `Local Address` and click the `Open in Browser` tab. 2. Open the GitLab server in your browser and use the following credentials to authenticate: @@ -61,7 +61,7 @@ Perform the following labs to learn more about Actions migrations with Valet: 1. [Configure credentials for Valet](1-configure.md) 2. [Perform an audit on GitLab pipelines](2-audit.md) -3. [Perform a dry-run of a GitLab pipeline](3-dry-run.md) +3. [Perform a dry-run migration of a GitLab pipeline](3-dry-run.md) 4. [Use custom transformers to customize Valet's behavior](4-custom-transformers.md) 5. [Perform a production migration of a GitLab pipeline](5-migrate.md) 6. [Forecast potential build runner usage](6-forecast.md) @@ -71,7 +71,7 @@ Perform the following labs to learn more about Actions migrations with Valet: The CLI extension for Valet can be manually installed by following these steps: - Verify you are in the codespace terminal -- Run this command from within the codespace's terminal: +- Run this command from within the codespace terminal: ```bash gh extension install github/gh-valet @@ -83,10 +83,10 @@ The CLI extension for Valet can be manually installed by following these steps: ✓ Installed extension github/gh-valet ``` -- If you get an error similar to the image below, then click the link in the terminal output to authorize the token. +- If you get an error similar to the image below, click the link in the terminal output to authorize the token. - Restart the codespace after clicking the link. ![img](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) -- Verify Valet CLI extension is installed and working by running the following command from the codespace's terminal: +- Verify Valet CLI extension is installed and working by running the following command from the codespace terminal: ```bash gh valet version diff --git a/jenkins/1-configure.md b/jenkins/1-configure.md index 4b519be..dce0bb0 100644 --- a/jenkins/1-configure.md +++ b/jenkins/1-configure.md @@ -7,44 +7,44 @@ You will need to complete all of the setup instructions [here](./readme.md#confi ## Configuring credentials 1. Open the Jenkins server in a new browser tab: - 1. Click the `PORTS` tab in the codespace terminal window. - 2. In the `PORTS` tab find the row for port 8080. - 3. Hover over the address under the `Local Address` column and click the globe to "open in browser". + - Click the `PORTS` tab in the codespace terminal window. + - In the `PORTS` tab, find the row for port 8080. + - Hover over the address under the `Local Address` column and click the globe to "open in browser". 2. Create a Jenkins API token: - 1. Click the `admin` button in the top right menu bar. - 2. Click on the `Configure` gear located on the left hand panel. - 3. Click the `Add new Token` button in the `API token` section and click `Generate`. - 4. Copy the generated API token and save in a safe location. + - In the top right menue bar, click the `admin` button. + - In the left panel, click the `Configure` gear. + - In the `API token` section, click the `Add new Token` button and click `Generate`. + - Copy the generated API token and save it in a safe location. ![img](https://user-images.githubusercontent.com/19557880/184041667-d06cb7f2-a885-474e-b728-7567314aeaf3.png) -3. Create a GitHub Personal Access Token (PAT): - 1. Open github.com in a new browser tab. - 2. Click your profile photo in the top right of the UI and click `Settings`. - 3. Click on `Developer Settings` in the left hand panel. - 4. Click `Personal Access Tokens` and then `Legacy tokens` (if present). - 5. Click `Generate new token` and then `Legacy tokens`. You may be required to authenticate with GitHub during this step. - 6. Select the following scopes: `read:packages` and `workflow`. - 7. Click `Generate token`. - 8. Copy the generated PAT and save in a safe location. +3. Create a GitHub personal access token (PAT): + - Open github.com in a new browser tab. + - In the top right corner of the UI, click your profile photo and click `Settings`. + - In the left panel, click `Developer Settings`. + - Click `Personal access tokens` and then `Legacy tokens` (if present). + - Click `Generate new token` and then `Generate new legacy token`. You may be required to authenticate with GitHub during this step. + - Select the following scopes: `workflow` and `read:packages`. + - Click `Generate token`. + - Copy the generated PAT and save it in a safe location. 4. Run the `configure` CLI command: - Select the `TERMINAL` tab from within the codespace terminal window. - Run the following command: `gh valet configure`. - - Using the down arrow key to highlight `Jenkins`, press the spacebar to select, and then hit enter to continue. - - At the prompt enter your GitHub Username and press enter. - - At the GitHub Container Registry prompt enter the GitHub PAT generated in step 3 and press enter. - - At the GitHub PAT prompt enter the GitHub PAT generated in step 3 and press enter. - - At the GitHub url prompt enter the GitHub instance url or hit enter to accept the default value (`https://github.com`). - - At the Jenkins token prompt enter the Jenkins access token from step 2 and press enter. - - At the Jenkins url prompt enter `http://localhost:8080/` and press enter. - - At the Personal access token to fetch source code in GitHub prompt hit enter to accept the default value. + - Use the down arrow key to highlight `Jenkins`, press the spacebar to select, and then press enter to continue. + - At the prompt, enter your GitHub username and press enter. + - At the GitHub Container Registry prompt, enter the GitHub PAT generated in step 3 and press enter. + - At the GitHub PAT prompt, enter the GitHub PAT generated in step 3 and press enter. + - At the GitHub URL prompt, enter the GitHub instance URL or press enter to accept the default value (`https://github.com`). + - At the Jenkins token prompt, enter the Jenkins access token from step 2 and press enter. + - At the Jenkins URL prompt, enter `http://localhost:8080/` and press enter. + - At the Personal access token to fetch source code in GitHub prompt, press enter to accept the default value. ![img](https://user-images.githubusercontent.com/19557880/184041328-ce54ea22-b0cd-4c84-b02c-10ad7b09ad89.png) ## Verify your environment -To verify our environment is configured correctly, we are going to run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. +To verify your environment is configured correctly, run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. 1. In the codespace terminal run the following command: diff --git a/jenkins/2-audit.md b/jenkins/2-audit.md index e7673b7..c3e9a6c 100644 --- a/jenkins/2-audit.md +++ b/jenkins/2-audit.md @@ -6,18 +6,18 @@ The `audit` command operates by fetching all of the pipelines defined in a Jenki ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and start a Jenkins server. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a Jenkins server. 2. Completed the [configure lab](./1-configure.md#configuring-credentials). ## Perform an audit -We will be performing an audit against your preconfigured Jenkins server. We will need to answer the following questions before running this command: +You will be performing an audit against your preconfigured Jenkins server. Answer the following questions before running this command: -1. Do we want to audit the entire Jenkins instance or just a single folder? - - In this example we will be auditing the entire Jenkins instance, but in the future if you wanted to configure a specific folder to be audited add the `-f ` flag to the audit command. +1. Do you want to audit the entire Jenkins instance or just a single folder? + - In this example you will audit the entire Jenkins instance, but in the future if you wanted to configure a specific folder to be audited add the `-f ` flag to the `audit` command. -2. Where do we want to store the result? - - __./tmp/audit__. This can be any path within the working directory that Valet commands are executed from. +2. Where do you want to store the result? + - __./tmp/audit__. This can be any path within the working directory from which Valet commands are executed. ### Steps @@ -56,7 +56,7 @@ Here are some key terms in the “Pipelines” section in the above example: - Flow Definition - Project (declarative Jenkinsfile pipelines) - Multibranch Project -- __Failed pipelines__ encountered a fatal error when being converted. This can occur for one of three reasons: +- __Failed__ pipelines encountered a fatal error when being converted. This can occur for one of three reasons: - The pipeline was misconfigured and not valid in Jenkins. - Valet encountered an internal error when converting it. - There was an unsuccessful network response, often due to invalid credentials, that caused the pipeline to be inaccessible. @@ -108,4 +108,4 @@ Each pipeline will have a variety of files written that include: ## Next lab -[Perform a dry-run of a Jenkins pipeline](3-dry-run.md) +[Perform a dry-run migration of a Jenkins pipeline](3-dry-run.md) diff --git a/jenkins/3-dry-run.md b/jenkins/3-dry-run.md index 1749371..4706216 100644 --- a/jenkins/3-dry-run.md +++ b/jenkins/3-dry-run.md @@ -1,29 +1,29 @@ -# Perform a dry-run of a Jenkins pipeline +# Perform a dry-run migration of a Jenkins pipeline In this lab you will use the `dry-run` command to convert a Jenkins pipeline to its equivalent GitHub Actions workflow. ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and start a Jenkins server. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a Jenkins server. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). 3. Completed the [audit lab](./2-audit.md). -## Perform a dry-run +## Perform a dry run -We will be performing a dry-run against a pipeline in your preconfigured Jenkins server. We will need to answer the following questions before running this command: +You will be performing a dry run against a pipeline in your preconfigured Jenkins server. Answer the following questions before running this command: -1. What is the name of the pipeline we want to convert? +1. What is the name of the pipeline you want to convert? - __test_pipeline__ -2. What is the URL of the pipeline we want to convert? +2. What is the URL of the pipeline you want to convert? - ____ -3. Where do we want to store the result? - - __./tmp/dry-run-lab__. This can be any path within the working directory that Valet commands are executed from. +3. Where do you want to store the result? + - __./tmp/dry-run-lab__. This can be any path within the working directory from which Valet commands are executed. ### Steps -1. Navigate to the codespace terminal +1. Navigate to your codespace terminal 2. Run the following command from the root directory: ```bash @@ -35,7 +35,7 @@ We will be performing a dry-run against a pipeline in your preconfigured Jenkins ![img](https://user-images.githubusercontent.com/19557880/184935603-5c2d4dfe-66ef-4cb1-9398-e96954ca72e3.png) 4. View the converted workflow: - - Find `./tmp/dry-run` in the file explorer pane in codespaces. + - Find `./tmp/dry-run` in the file explorer pane in your codespace. - Click `test_pipeline.yml` to open ## Inspect the output files @@ -123,7 +123,7 @@ jobs: -These 2 pipelines function equivalently despite using different syntax. In this case, the pipeline conversion was “partially successful” (i.e. there were item(s) not automatically converted) and the unconverted item was placed as comment in the location the Jenkins pipeline used it. For example: +These two pipelines function equivalently despite using different syntax. In this case, the pipeline conversion was “partially successful” (i.e. there were item(s) not automatically converted) and the unconverted item was placed as comment in the location the Jenkins pipeline used it. For example: ```diff - sleep 80 @@ -135,9 +135,9 @@ These 2 pipelines function equivalently despite using different syntax. In this + # value: 80 ``` -In the next lab, we'll learn how to override Valet's default behavior and customize the converted workflow that is generate. +In the next lab, you'll learn how to override Valet's default behavior and customize the converted workflow that is generated. -Try running the `dry-run` command for different pipelines in the Jenkins server. As a hint, you just have to change the `--source-url` CLI option. +Try running the `dry-run` command for different pipelines in the Jenkins server. As a hint, you only have to change the `--source-url` CLI option. ## Next lab diff --git a/jenkins/4-custom-transformers.md b/jenkins/4-custom-transformers.md index e97ee48..dfcbd52 100644 --- a/jenkins/4-custom-transformers.md +++ b/jenkins/4-custom-transformers.md @@ -1,6 +1,6 @@ # Use custom transformers to customize Valet's behavior -In this lab we will build upon the `dry-run` command to override Valet's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: +In this lab you will build upon the `dry-run` command to override Valet's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: 1. Convert items that are not automatically converted. 2. Convert items that were automatically converted using different actions. @@ -9,13 +9,13 @@ In this lab we will build upon the `dry-run` command to override Valet's default ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and start a Jenkins server. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a Jenkins server. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). 3. Completed the [dry-run lab](./3-dry-run.md). ## Perform a dry-run -We will be performing a `dry-run` command to inspect the workflow that is converted by default. Run the following command within the codespace terminal: +You will be performing a `dry-run` command to inspect the workflow that is converted by default. Run the following command within the codespace terminal: ```bash gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline -o tmp/jenkins/dry-run @@ -75,13 +75,13 @@ _Note_: You can refer to the previous [lab](./3-dry-run.md) to learn about the f ## Custom transformers for an unknown step -The converted workflow above contains a `sleep` step was not automatically converted. We will need to answer the following questions before writing a custom transformer: +The converted workflow above contains a `sleep` step was not automatically converted. Answer the following questions before writing a custom transformer: 1. What is the "identifier" of the step to customize? - __sleep__. The identifier will be the key of a key value pair within the step of a Jenkinsfile. 2. What is the desired Actions syntax to use instead? - - After some research, we have determined that the following bash script will provide similar functionality: + - After some research, you have determined that the following bash script will provide similar functionality: ```yaml - name: Sleep for 80 seconds @@ -89,13 +89,13 @@ The converted workflow above contains a `sleep` step was not automatically conve shell: bash ``` -Now we can begin to write the custom transformer. Customer transformers use a DSL built on top of Ruby and should be defined in a file with the `.rb` file extension. You can create this file by running the following command in your codespace terminal: +Now you can begin to write the custom transformer. Custom transformers use a DSL built on top of Ruby and should be defined in a file with the `.rb` file extension. You can create this file by running the following command in your codespace terminal: ```bash code transformers.rb ``` -Next, we will define a `transform` method for the `sleep` identifier by adding the following code to `transformers.rb`: +Next, you will define a `transform` method for the `sleep` identifier by adding the following code to `transformers.rb`: ```ruby transform "sleep" do |item| @@ -111,13 +111,13 @@ end This method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. Valet will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in Jenkins. -Now, we can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: +Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: ```bash gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline -o tmp/jenkins/dry-run --custom-transformers transformers.rb ``` -Open the workflow that is generated and inspect the contents. Now, the `sleep` step is converted and uses the customized behavior! +Open the workflow that is generated and inspect the contents. Now the `sleep` step is converted and uses the customized behavior! ```diff - # # This item has no matching transformer @@ -133,13 +133,13 @@ Open the workflow that is generated and inspect the contents. Now, the `sleep` s ## Custom transformers for a known step -We can also override Valet's default behavior. In this scenario, we may not desire to use the third-party action for publishing junit test results that is used by default. Again, we will need to answer the following questions before writing a custom transformer: +You can also override Valet's default behavior. In this scenario, you may not want to use the third-party action for publishing junit test results that is used by default. Again, answer the following questions before writing a custom transformer: 1. What is the "identifier" of the step to customize? - __junit__ 2. What is the desired Actions syntax to use instead? - - After some research, we have determined that uploading test results as an artifact will be suitable: + - After some research, you have determined that uploading test results as an artifact will be suitable: ```yaml - uses: actions/upload-artifact@v3 @@ -148,9 +148,9 @@ We can also override Valet's default behavior. In this scenario, we may not desi path: path/to/artifact/world.txt ``` -We will build this custom transformer similar to the previous custom transformer, however, we first need to inspect the `item` keyword to programmatically use the file path to junit's test results in the `actions/upload-artifact@v3` step. +You will build this custom transformer similar to the previous custom transformer, however, you first need to inspect the `item` keyword to programmatically use the file path to junit's test results in the `actions/upload-artifact@v3` step. -To do this, we will print `item` to the console. You can achieve this by adding the following custom transformer to `transformers.rb`: +To do this, you will print `item` to the console. You can achieve this by adding the following custom transformer to `transformers.rb`: ```ruby transform "junit" do |item| @@ -162,7 +162,7 @@ Now, we can perform another `dry-run` command with the `--custom-transformers` C ![img](https://user-images.githubusercontent.com/19557880/186782050-65ece0c4-52a3-4f88-818f-0f860c50c2b7.png) -Now that we know the data structure of `item` we can access the file path programmatically by editing the custom transformer to following: +Now that you know the data structure of `item`, you can access the file path programmatically by editing the custom transformer to the following: ```ruby transform "junit" do |item| @@ -181,7 +181,7 @@ end _Note_: `transformers.rb` should contain a `transform` method for both `sleep` and `junit`. -Now, we can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `EnricoMi/publish-unit-test-result-action@v1.7` action will have been replaced with the customized steps. +Now you can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `EnricoMi/publish-unit-test-result-action@v1.7` action will have been replaced with the customized steps. ```diff - - name: Publish test results @@ -197,7 +197,7 @@ Now, we can perform another `dry-run` command with the `--custom-transformers` C ## Custom transformers for environment variables -We can also use custom transformers to edit the values of environment variables in converted workflows. In our example, we will be updating the `DB_ENGINE` environment variable to be `mongodb` instead of `sqlite`. +You can also use custom transformers to edit the values of environment variables in converted workflows. In this example, you will be updating the `DB_ENGINE` environment variable to be `mongodb` instead of `sqlite`. To do this, add the following code to the `transformers.rb` file. @@ -207,7 +207,7 @@ env "DB_ENGINE", "mongodb" In this example, the first parameter to the `env` method is the environment variable name and the second is the updated value. -Now, we can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `DB_ENGINE` environment variable will be set to `mongodb`: +Now you can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `DB_ENGINE` environment variable will be set to `mongodb`: ```diff env: @@ -218,7 +218,7 @@ env: ## Custom transformers for runners -Finally, we can use custom transformers to dictate which runners converted workflows should use. To do this we will need to answer the following questions: +Finally, you can use custom transformers to dictate which runners the converted workflows should use. To do this, answer the following questions: 1. What is label of the runner in Jenkins to update? - __TeamARunner__ @@ -226,7 +226,7 @@ Finally, we can use custom transformers to dictate which runners converted workf 2. What is the label of the runner in Actions to use instead? - __ubuntu-latest__ -With these questions answered, we can add the following code to the `transformers.rb` file: +With these questions answered, you can add the following code to the `transformers.rb` file: ```ruby runner "TeamARunner", "ubuntu-latest" @@ -234,7 +234,7 @@ runner "TeamARunner", "ubuntu-latest" In this example, the first parameter to the `runner` method is the Jenkins label and the second is the Actions runner label. -Now, we can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `runs-on` statement will use the customized runner label: +Now you can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `runs-on` statement will use the customized runner label: ```diff runs-on: @@ -243,7 +243,7 @@ runs-on: + - ubuntu-latest ``` -At this point of the lab the file contents of `transformers.rb` should match this: +At this point the file contents of `transformers.rb` should match this:
Custom transformers 👇 @@ -281,7 +281,7 @@ At this point of the lab the file contents of `transformers.rb` should match thi
-Thats it! Congratulations you have overridden Valet's default behavior by customizing the conversion of: +That's it! Congratulations, you have overridden Valet's default behavior by customizing the conversion of: - Unknown steps - Known steps diff --git a/jenkins/5-migrate.md b/jenkins/5-migrate.md index c1121e1..66a8f11 100644 --- a/jenkins/5-migrate.md +++ b/jenkins/5-migrate.md @@ -4,25 +4,25 @@ In this lab, you will use the `migrate` command to convert a Jenkins pipeline an ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and start a Jenkins server. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a Jenkins server. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). 3. Completed the [dry-run lab](./3-dry-run.md). 4. Completed the [custom transformers lab](./4-custom-transformers.md). ## Performing a migration -We need to answer the following questions before running a `migrate` command: +Answer the following questions before running a `migrate` command: -1. What is the source URL of the pipeline we want to convert? +1. What is the source URL of the pipeline you want to convert? - ____ -2. Where do we want to store the logs? +2. Where do you want to store the logs? - __./tmp/migrate__ 3. What is the URL for the GitHub repository to add the workflow to? - __this repository__. The URL should follow the pattern with `:owner` and `:repo` replaced with your values. ### Steps -1. Run the following `migrate` command in the codespace terminal: +1. Run the following `migrate` command in your codespace terminal: ```bash gh valet migrate jenkins --target-url https://github.com/:owner/:repo --output-dir ./tmp/migrate --source-url http://localhost:8080/job/monas_dev_work/job/monas_freestyle @@ -36,15 +36,15 @@ We need to answer the following questions before running a `migrate` command: ### Inspect the pull request -The first thing we should notice about the PR is that there is a list of manual steps for us to complete: +The first thing we should notice about the pull request is that there is a list of manual steps to complete: ![img](https://user-images.githubusercontent.com/19557880/186784161-b7882ac4-ac99-4462-b69f-f49b9202527b.png) -Next, let's review the workflow we are adding by clicking on `Files changed` tab. This is where you would double check everything looks good. If it didn't you could push commits with the required changes, prior to merging. +Next, review the workflow you are adding by clicking on the `Files changed` tab. This is where you double check that everything looks good. If it didn't, you could push commits with the required changes, prior to merging. -Next, you can inspect the "Files changed" in this PR and see the converted workflow that is being added. Any additional changes or code reviews that were needed should be done in this PR. +Next, you can inspect the "Files changed" in this pull request and see the converted workflow that is being added. Any additional changes or code reviews that were needed should be done in this pull request. -Finally, you can merge the PR once your review has completed. We can then view the workflow running by selecting the "Actions" menu in the top navigation bar in GitHub. +Finally, you can merge the pull request once your review has completed. You can then view the workflow running by selecting the "Actions" menu in the top navigation bar in GitHub. ![img](https://user-images.githubusercontent.com/19557880/185509704-90243ec5-e77f-4baf-a9b2-d9a4d9fda199.png) diff --git a/jenkins/6-forecast.md b/jenkins/6-forecast.md index deeb6b0..8506a23 100644 --- a/jenkins/6-forecast.md +++ b/jenkins/6-forecast.md @@ -4,25 +4,25 @@ In this lab you will use the `forecast` command to forecast potential GitHub Act ## Prerequisites -1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and start a Jenkins server. +1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a Jenkins server. 2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). ## Perform a forecast -We will need to answer the following questions before running the `forecast` command: +Answer the following questions before running the `forecast` command: -1. Do we want to forecast the entire Jenkins server or a single folder? - - We will be forecasting the entire Jenkins server but we could optionally limit this by using the `-f ` CLI option. +1. Do you want to forecast the entire Jenkins server or a single folder? + - You will be forecasting the entire Jenkins server but you could optionally limit this by using the `-f ` CLI option. -2. What is the date we want to start forecasting from? +2. What is the date you want to start forecasting from? - __2022-08-02__. This date is needed as it is prior to when the data was seeded in Jenkins for these labs. This value defaults to the date one week ago, however, you should use a start date that will show a representative view of typical usage. -3. Where do we want to store the results? +3. Where do you want to store the results? - `./tmp/forecast_reports` ### Steps -1. Navigate to the codespace terminal +1. Navigate to your codespace terminal 2. Run the following command from the root directory: ```bash @@ -76,8 +76,8 @@ Here are some key terms of items defined in the forecast report: - The `job count` is the total number of completed jobs. - The `pipeline count` is the number of unique pipelines used. -- `Execution time` describes the amount of time a runner spent on a job. This metric can be used to help plan for the cost of GitHub hosted runners. - - This metric is correlated to how much you should expect to spend in GitHub Actions. This will vary depending on the hardware used for these minutes and the [Actions pricing calculator](https://github.com/pricing/calculator) should be used to estimate a dollar amount. +- `Execution time` describes the amount of time a runner spent on a job. This metric can be used to help plan for the cost of GitHub-hosted runners. + - This metric is correlated to how much you should expect to spend in GitHub Actions. This will vary depending on the hardware used for these minutes. You can use the [Actions pricing calculator](https://github.com/pricing/calculator) to estimate a dollar amount. - `Queue time` metrics describe the amount of time a job spent waiting for a runner to be available to execute it. - `Concurrent jobs` metrics describe the amount of jobs running at any given time. This metric can be used to define the number of runners a customer should configure. @@ -85,11 +85,11 @@ Additionally, these metrics are defined for each queue of runners defined in Jen ## Forecasting multiple providers -We can examine the available options for the `forecast` command by running `gh valet forecast --help`. When you do this you will see the `--source-file-path` option: +You can examine the available options for the `forecast` command by running `gh valet forecast --help`. When you do this you will see the `--source-file-path` option: ![img](https://user-images.githubusercontent.com/19557880/186263140-f02c6cab-7979-417c-bdfe-b9590e9c5597.png) -The `--source-file-path` CLI option can be used to combine data from multiple reports into a single report. This becomes useful if you use multiple CI/CD providers and wanted to get a holistic view of the runner usage. This works by using the `.json` files generated by `forecast` commands as space-delimited values for the `--source-file-path` CLI option. Optionally, this value could be a glob pattern to dynamically specify the list of files (e.g. `**/*.json`). +You can use the `--source-file-path` CLI option to combine data from multiple reports into a single report. This becomes useful if you use multiple CI/CD providers and wanted to get a holistic view of the runner usage. This works by using the `.json` files generated by `forecast` commands as space-delimited values for the `--source-file-path` CLI option. Optionally, this value could be a glob pattern to dynamically specify the list of files (e.g. `**/*.json`). Run the following command from within the codespace terminal: diff --git a/jenkins/readme.md b/jenkins/readme.md index 2d198a7..a8e78c7 100644 --- a/jenkins/readme.md +++ b/jenkins/readme.md @@ -1,6 +1,6 @@ # Jenkins to Actions migrations powered by Valet -The instructions below will guide you through configuring a GitHub Codespace environment that will be used in subsequent labs that demonstrate how to use Valet to migrate Jenkins pipelines to GitHub Actions. +These instructions will guide you through configuring a GitHub Codespaces environment that will be used in subsequent labs that demonstrate how to use Valet to migrate Jenkins pipelines to GitHub Actions. These steps **must** be completed prior to starting other labs. @@ -8,14 +8,14 @@ These steps **must** be completed prior to starting other labs. 1. Ensure that you have created a repository using the [valet-customers/labs](https://github.com/valet-customers/labs) as a template. -## Configure your Codespace +## Configure your codespace -1. Start a new Codespace. +1. Start a new codespace. - Click the `Code` button on your repository's landing page. - Click the `Codespaces` tab. - Click `Create codespaces on main` to create the codespace. -- After the Codespace has initialized there will be a terminal present. +- After the codespace has initialized there will be a terminal present. 2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). @@ -33,11 +33,11 @@ These steps **must** be completed prior to starting other labs. valet-cli unknown ``` - - If `gh valet version` did not produce similar output then please follow the troubleshooting [guide](#troubleshoot-the-valet-cli). + - If `gh valet version` did not produce similar output, refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). ## Bootstrap a Jenkins server - 1. Execute the Jenkins setup script that will start a container with a Jenkins server running inside of it. This script should be executed when starting a new Codespace or restarting an existing one. + 1. Execute the Jenkins setup script that will start a container with a Jenkins server running inside of it. This script should be executed when starting a new codespace or restarting an existing one. - Run the following command from the codespace's terminal to start a Jenkins server: @@ -46,7 +46,7 @@ These steps **must** be completed prior to starting other labs. ``` - After some time, a pop-up box should appear with a link to the URL for your Jenkins server. - - You can also access the URL by going to the `Ports` tab in your terminal. Right click on the URL listed under the `Local Address` and click the `Open in Browser` tab. + - You can also access the URL by going to the `Ports` tab in your terminal. Right-click the URL listed under the `Local Address` and click the `Open in Browser` tab. 2. Open the Jenkins server in your browser and use the following credentials to authenticate: @@ -61,7 +61,7 @@ Perform the following labs to learn more about Actions migrations with Valet: 1. [Configure credentials for Valet](1-configure.md) 2. [Perform an audit of a Jenkins server](2-audit.md) -3. [Perform a dry-run of a Jenkins pipeline](3-dry-run.md) +3. [Perform a dry-run migration of a Jenkins pipeline](3-dry-run.md) 4. [Use custom transformers to customize Valet's behavior](4-custom-transformers.md) 5. [Perform a production migration of a Jenkins pipeline](5-migrate.md) 6. [Forecast potential build runner usage](6-forecast.md) @@ -71,7 +71,7 @@ Perform the following labs to learn more about Actions migrations with Valet: The CLI extension for Valet can be manually installed by following these steps: - Verify you are in the codespace terminal -- Run this command from within the codespace's terminal: +- Run this command from within the codespace terminal: ```bash gh extension install github/gh-valet @@ -86,7 +86,7 @@ The CLI extension for Valet can be manually installed by following these steps: - If you get an error similar to the image below, then click the link in the terminal output to authorize the token. - Restart the codespace after clicking the link. ![img](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) -- Verify Valet CLI extension is installed and working by running the following command from the codespace's terminal: +- Verify Valet CLI extension is installed and working by running the following command from the codespace terminal: ```bash gh valet version @@ -96,10 +96,10 @@ The CLI extension for Valet can be manually installed by following these steps: Follow these steps if the Jenkins server does not start correctly after running the setup script: -1. Navigate to the `Docker` tab on the left side of the codespace. +1. On the left side of the codespace, navigate to the `Docker` tab. 2. Under the `Containers` tab you should see a docker container named `jenkins:valet` listed with a green play button ▶ -- If you see the `jenkins:valet` container, but it has a red stopped symbol next to it ▢, right click on the container and click on `start`, the container should begin running again. -- If the container does not start even after trying to manually start it, right click on the `jenkins:valet` container and click the `remove` button. Then, attempt to start the Jenkins server again by following the steps [here](#bootstrap-a-jenkins-server). +- If you see the `jenkins:valet` container, but it has a red stopped symbol next to it ▢, right-click the container and click `start`. The container should begin running again. +- If the container does not start even after trying to start it manually, right-click the `jenkins:valet` container and click the `remove` button. Then, attempt to start the Jenkins server again by following the steps [here](#bootstrap-a-jenkins-server). ![img](https://user-images.githubusercontent.com/19557880/183770210-c0386616-656e-4fe9-9324-b410ad62c406.png) diff --git a/readme.md b/readme.md index 0317e10..f2c1371 100644 --- a/readme.md +++ b/readme.md @@ -1,15 +1,14 @@ # GitHub Actions migrations powered by Valet -Valet helps facilitate the migration of Azure DevOps, CircleCI, GitLab CI, Jenkins, and Travis CI pipelines to GitHub Actions. This repository contains learning paths that teach you how to use Valet and approach migrations to Actions. +Valet helps facilitate the migration of Azure DevOps, CircleCI, GitLab CI, Jenkins, and Travis CI pipelines to GitHub Actions. This repository contains learning paths that teach you how to use Valet and how to approach migrations to Actions. > Valet is currently private and you must be onboarded prior to using it. Please reach out to [GitHub Sales](https://github.com/enterprise/contact) to inquire about being granted access. To get started: 1. Use the `valet-customers/labs` repository as a template to [generate](https://github.com/valet-customers/labs/generate) a new GitHub repository. -2. Select which learning path to begin. There are currently learning paths for: - - [Azure DevOps to GitHub Actions migrations](/azure_devops/readme.md) - - [GitLab CI to GitHub Actions migrations](/gitlab/readme.md) - - [Jenkins to GitHub Actions migrations](/jenkins/readme.md) -3. Follow the instructions in each learning path to bootstrap a CI/CD environment. -4. Follow the instructions to complete each learning path. +2. Select which learning path to begin with. There are currently learning paths for: + - [Migrations from Azure DevOps to GitHub Actions](/azure_devops/readme.md) + - [Migrations from GitLab CI to GitHub Actions](/gitlab/readme.md) + - [Migrations from Jenkins to GitHub Actions](/jenkins/readme.md) +3. Each learning path describes how to configure your codespace, bootstrap a CI/CD environment, and troubleshoot the Valet CLI. From bb96ac97ba0b9919b9b48d38a16ee0c41111b904 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Tue, 13 Sep 2022 07:31:56 -0700 Subject: [PATCH 50/69] Update jenkins/1-configure.md --- jenkins/1-configure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins/1-configure.md b/jenkins/1-configure.md index dce0bb0..0e1fabe 100644 --- a/jenkins/1-configure.md +++ b/jenkins/1-configure.md @@ -12,7 +12,7 @@ You will need to complete all of the setup instructions [here](./readme.md#confi - Hover over the address under the `Local Address` column and click the globe to "open in browser". 2. Create a Jenkins API token: - - In the top right menue bar, click the `admin` button. + - In the top right menu bar, click the `admin` button. - In the left panel, click the `Configure` gear. - In the `API token` section, click the `Add new Token` button and click `Generate`. - Copy the generated API token and save it in a safe location. From 9024209f072cb1bdabcb5e94d01774e752e9fa22 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Tue, 13 Sep 2022 15:59:24 -0700 Subject: [PATCH 51/69] Update setup --- azure_devops/bootstrap/setup | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure_devops/bootstrap/setup b/azure_devops/bootstrap/setup index ba4cfed..a5dde82 100755 --- a/azure_devops/bootstrap/setup +++ b/azure_devops/bootstrap/setup @@ -9,7 +9,7 @@ options = { code_assets_dir: "code", pipeline_assets_dir: "pipelines", root_dir: File.join(ENV["CODESPACE_VSCODE_FOLDER"], "azure_devops/bootstrap"), - forecast_source_file: File.join(".", "azure_devops/jobs_data.json") + forecast_source_file: File.join(".", "azure_devops/bootstrap/jobs.json") } OptionParser.new do |opt| From 8cd321432f2cba3d9b780b7254704b38e0fc87a5 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 14 Sep 2022 10:25:58 -0700 Subject: [PATCH 52/69] Prefer --output-dir to -o --- azure_devops/2-audit.md | 2 +- azure_devops/3-dry-run.md | 4 ++-- azure_devops/4-custom-transformers.md | 4 ++-- azure_devops/6-forecast.md | 2 +- gitlab/6-forecast.md | 2 +- jenkins/3-dry-run.md | 2 +- jenkins/4-custom-transformers.md | 4 ++-- jenkins/6-forecast.md | 4 ++-- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/azure_devops/2-audit.md b/azure_devops/2-audit.md index 1a2d327..fd1147a 100644 --- a/azure_devops/2-audit.md +++ b/azure_devops/2-audit.md @@ -28,7 +28,7 @@ You will now perform an audit against the bootstrapped Azure DevOps project. Ans 2. Run the following command from the root directory: ```bash - gh valet audit azure-devops --output-dir tmp/audit --namespace valet + gh valet audit azure-devops --output-dir tmp/audit ``` __Note__: The Azure DevOps organization and project name can be omitted from the `audit` command because they were persisted in the `.env.local` file in the [configure lab](./1-configure.md). You can optionally provide these arguments on the command line with the `--azure-devops-organization` and `--azure-devops-project` CLI options. diff --git a/azure_devops/3-dry-run.md b/azure_devops/3-dry-run.md index da6ac9a..ac60718 100644 --- a/azure_devops/3-dry-run.md +++ b/azure_devops/3-dry-run.md @@ -13,7 +13,7 @@ In this lab you will use the `dry-run` command to convert an Azure DevOps pipeli You will perform a dry run for a pipeline in the bootstrapped Azure DevOps project. Answer the following questions before running this command: 1. What is the id of the pipeline to convert? - - __:id__. This id can be found by: + - __:pipeline_id__. This id can be found by: - Navigating to the build pipelines in the bootstrapped Azure DevOps project - Selecting the pipeline with the name "valet-pipeline1" - Inspecting the URL to locate the pipeline id @@ -27,7 +27,7 @@ You will perform a dry run for a pipeline in the bootstrapped Azure DevOps proje 2. Run the following command from the root directory: ```bash - gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id -o tmp/dry-run-lab + gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run-lab ``` 3. The command will list all the files written to disk when the command succeeds. diff --git a/azure_devops/4-custom-transformers.md b/azure_devops/4-custom-transformers.md index e3edce9..cec9e8a 100644 --- a/azure_devops/4-custom-transformers.md +++ b/azure_devops/4-custom-transformers.md @@ -33,7 +33,7 @@ You will perform a dry-run for a pipeline in the bootstrapped Azure DevOps proje 2. Run the following command from the root directory: ```bash - gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id -o tmp/dry-run-lab + gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run-lab ``` 3. The command will list all the files written to disk when the command succeeds. @@ -127,7 +127,7 @@ This method can use any valid ruby syntax and should return a `Hash` that repres Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: ```bash -gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id -o tmp/dry-run-lab --custom-transformers transformers.rb +gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run-lab --custom-transformers transformers.rb ``` Open the workflow that is generated and inspect the contents. Now the `DotnetCoreCLI@2` steps are converted using the customized behavior! diff --git a/azure_devops/6-forecast.md b/azure_devops/6-forecast.md index 0937dba..e9a9e9c 100644 --- a/azure_devops/6-forecast.md +++ b/azure_devops/6-forecast.md @@ -40,7 +40,7 @@ Answer the following questions before running the `forecast` command: 5. Run the following `forecast` command while specifying the path to the sample json files: ```bash - gh valet forecast azure-devops -o ./tmp/forecast_reports --source-file-path azure_devops/bootstrap/jobs.json + gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --source-file-path azure_devops/bootstrap/jobs.json ``` 6. The command will list all the files written to disk when the command succeeds. diff --git a/gitlab/6-forecast.md b/gitlab/6-forecast.md index e28a7ef..897270d 100644 --- a/gitlab/6-forecast.md +++ b/gitlab/6-forecast.md @@ -92,7 +92,7 @@ You can use the `--source-file-path` CLI option to combine data from multiple re Run the following command from within the codespace terminal: ```bash -gh valet forecast --source-file-path tmp/**/jobs/*.json -o tmp/combined-forecast +gh valet forecast --source-file-path tmp/**/jobs/*.json --output-dir tmp/combined-forecast ``` You can now inspect the output of the command to see a forecast report using all of the files matching the `tmp/**/jobs/*.json` pattern. diff --git a/jenkins/3-dry-run.md b/jenkins/3-dry-run.md index 4706216..19f5145 100644 --- a/jenkins/3-dry-run.md +++ b/jenkins/3-dry-run.md @@ -27,7 +27,7 @@ You will be performing a dry run against a pipeline in your preconfigured Jenkin 2. Run the following command from the root directory: ```bash - gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline -o .tmp/jenkins/dry-run + gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir .tmp/jenkins/dry-run ``` 3. The command will list all the files written to disk when the command succeeds. diff --git a/jenkins/4-custom-transformers.md b/jenkins/4-custom-transformers.md index dfcbd52..e345308 100644 --- a/jenkins/4-custom-transformers.md +++ b/jenkins/4-custom-transformers.md @@ -18,7 +18,7 @@ In this lab you will build upon the `dry-run` command to override Valet's defaul You will be performing a `dry-run` command to inspect the workflow that is converted by default. Run the following command within the codespace terminal: ```bash -gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline -o tmp/jenkins/dry-run +gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/jenkins/dry-run ``` The converted workflow that is generated by the above command can be seen below: @@ -114,7 +114,7 @@ This method can use any valid ruby syntax and should return a `Hash` that repres Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: ```bash -gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline -o tmp/jenkins/dry-run --custom-transformers transformers.rb +gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/jenkins/dry-run --custom-transformers transformers.rb ``` Open the workflow that is generated and inspect the contents. Now the `sleep` step is converted and uses the customized behavior! diff --git a/jenkins/6-forecast.md b/jenkins/6-forecast.md index 8506a23..a6fca52 100644 --- a/jenkins/6-forecast.md +++ b/jenkins/6-forecast.md @@ -94,11 +94,11 @@ You can use the `--source-file-path` CLI option to combine data from multiple re Run the following command from within the codespace terminal: ```bash -gh valet forecast --source-file-path tmp/**/jobs/*.json -o tmp/combined-forecast +gh valet forecast --source-file-path tmp/**/jobs/*.json --output-dir tmp/combined-forecast ``` You can now inspect the output of the command to see a forecast report using all of the files matching the `tmp/**/jobs/*.json` pattern. ## Next steps -This concludes all labs for migrating Jenkins pipelines to Actions with Valet! \ No newline at end of file +This concludes all labs for migrating Jenkins pipelines to Actions with Valet! From 424bada4f3814bbc8d52639bb3757054c6550493 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 14 Sep 2022 10:26:58 -0700 Subject: [PATCH 53/69] Remove --azure-devops-project from forecast command --- azure_devops/6-forecast.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/azure_devops/6-forecast.md b/azure_devops/6-forecast.md index e9a9e9c..48e6d84 100644 --- a/azure_devops/6-forecast.md +++ b/azure_devops/6-forecast.md @@ -26,9 +26,11 @@ Answer the following questions before running the `forecast` command: 2. Run the following command from the root directory: ```bash - gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --azure-devops-project :project + gh valet forecast azure-devops --output-dir ./tmp/forecast_reports ``` + __Note__: The Azure DevOps organization and project name can be omitted from the `forecast` command because they were persisted in the `.env.local` file in the [configure lab](./1-configure.md). You can optionally provide these arguments on the command line with the `--azure-devops-organization` and `--azure-devops-project` CLI options. + 3. The command will output a message that says "No jobs found" because no jobs have been executed in your bootstrapped project. ![img](https://user-images.githubusercontent.com/18723510/187690315-6312088d-9888-4c55-9bbf-c6f2687fa547.png) From b1f13f800b29285740b1d2769d9086014fa705ce Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 14 Sep 2022 11:27:10 -0700 Subject: [PATCH 54/69] Read azure devops assets from tarball --- azure_devops/bootstrap/azure_devops.tgz | Bin 0 -> 4775 bytes azure_devops/bootstrap/code/Bootcamp.sln | 56 - .../bootstrap/code/src/Attendee/Attendee.cs | 15 - .../code/src/Attendee/Attendee.csproj | 7 - .../code/test/AttendeeTest/AttendeeExists.cs | 18 - .../test/AttendeeTest/AttendeeTest.csproj | 26 - azure_devops/bootstrap/jobs.json | 1262 ----------------- .../pipelines/classic/valet-classic1.json | 243 ---- .../pipelines/classic/valet-classic2.json | 243 ---- azure_devops/bootstrap/pipelines/readme.md | 10 - .../yml/valet-custom-transformer-example.yml | 26 - .../pipelines/yml/valet-pipeline1.yml | 19 - .../pipelines/yml/valet-pipeline2.yml | 18 - azure_devops/bootstrap/setup | 61 +- 14 files changed, 34 insertions(+), 1970 deletions(-) create mode 100644 azure_devops/bootstrap/azure_devops.tgz delete mode 100644 azure_devops/bootstrap/code/Bootcamp.sln delete mode 100644 azure_devops/bootstrap/code/src/Attendee/Attendee.cs delete mode 100644 azure_devops/bootstrap/code/src/Attendee/Attendee.csproj delete mode 100644 azure_devops/bootstrap/code/test/AttendeeTest/AttendeeExists.cs delete mode 100644 azure_devops/bootstrap/code/test/AttendeeTest/AttendeeTest.csproj delete mode 100644 azure_devops/bootstrap/jobs.json delete mode 100644 azure_devops/bootstrap/pipelines/classic/valet-classic1.json delete mode 100644 azure_devops/bootstrap/pipelines/classic/valet-classic2.json delete mode 100644 azure_devops/bootstrap/pipelines/readme.md delete mode 100644 azure_devops/bootstrap/pipelines/yml/valet-custom-transformer-example.yml delete mode 100644 azure_devops/bootstrap/pipelines/yml/valet-pipeline1.yml delete mode 100644 azure_devops/bootstrap/pipelines/yml/valet-pipeline2.yml diff --git a/azure_devops/bootstrap/azure_devops.tgz b/azure_devops/bootstrap/azure_devops.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3c401f9143cfb5dea1f5fa00ba925fb17f17de50 GIT binary patch literal 4775 zcmV;Y5?JjYiwFQB93o=?1MMBzcH1_#uhmyzn4VK7V^Z8DIm@YRNvS)D?OIAZZQav> zNYG+Tkt!FvPNrWr5A#X$3v&UG6e&@Q9Y<+rh?5hW#Ki@0H{1o1rRHZJy~(oNG7Q9i zn*67%>ilQgkfLjftSd%KZXsDwWkvf886SUXpM91@F%DrVB%Wa3jaI?|nB%O$lkOw` z`6p>o(+X_zafRRx{8vrR|CXxM{NF{BnlpDsJl7}DM-zhW`7fKMsRI9XS+4beC#}eT z%fnIRS`RJb$vDeTkx>Jf5S9BL-GT!qq6;< z^Zyab`H!5yvq{((P2B8vWCebVT|YwIcS%T4k6fS5qQVd$T8u799HFUu8RD4OC=TE) zDGvY)G4?GYH5!i|JwhizOc3^Ok>h&si*0Aa<`V}Yijr~q6rmf}^XNR=O@nSG#An?v z-S}%j)3stZ@KKn+PGFz~lFn9Oqj3<#Q5@pgGPYS5yd_plmyA-=I42QVcr~X~_CAVl zy+w>=x?$*<(e7`CrzeaS5hD<~oqENY=8yAP=(}p%QsXZCFX}(w{3t%aJL$ z+9Ln2u}5Oj0;&X45%j{3oFJT%P$a+M>C7V%0Nr(t4fbEr45iF}Rcq;5ZU1-Cu5sw% zF<73120|k8@su2(!^HLMGaSN04AxgV?+-_(=l#Ps$FF*4=cnKFk48fPM+l@P0eIob zljal2im1gDig@UNqtlbY@yj>o-O=&sNpaLU@d%DcgTo4|Wlm_k4aVsL;kN_yO)&mN zVW@03ntAy4grVqO5ncd%0~8U@ z$zR7fx;lWf$|fT~^p%`;EKK?)A`Av8vZR=jmP5JzEQ#}3*uH_5a10G+#5!02&t~fd z@d=5Kf{+}&I{r$np7NXkr9!f1CM%du;dDDd;Q}biPPGUK^TpmajD9TKXN?T=nibxE z8MNW>GMNIi>2OhmL(y?B6YvY@ArI)5#1003YDN2lwrcyIy;JXF?w8s||6el~?7ysO zwg119_6Qw<2W)}=I|Mp__T`Rb;}L%azIQx97(8#^onkNV=RWLhkRS{Dh+A*>9ijg9 znCdfguWd5(f?EnjeODU-fJdln+uQc{AX&P7;3u503wQz*~};>%0AoU{t|6cb0`&Y3<;^+ z_NwJg6EAkl3*5~A_4=>uNdJvx{jdGMowWZA{V!=hD9H8nc#1DUHEvwr4sIgR!xVRJ z3bru>3N-{JJ^QlK41C#WEE<6iHvtlj-PoMkwYH7>m-LKnXAXQE*Ov zO;|8Tfhafbym9#dXF5j6WBz<40*k!UcDbA3G?D^CJ2E%!C3W06t+9VZ| zBAGejGcdn2q_4zD^T5_DxdYDV7R>lmvdK8PtVGE;xedZbic|pOJ0oH2a+>gWF}`Ff z!HM<@*vPBGGqdF<$#hJ@0c;J&0t;nrIA{)Tp}l@>+mFB43(56?6h3B)5#9#lZW2#| z(0#{fJhTGFbS3K@xl+DX&Yusm|=_rs8hY)QFtzTDv32u`mR{e@GG5|?FK zl9wb#x}-~rumBw|6GmPD2}vB@9tDXXpZZkK2H5qIkW@gz2JB4vg($HsLTqC1JzkoW zYU{xQ>2fQfTBf0NOe`9@V~aYLRk1TBZPD)7N?U7APas$j9*q@cY>T$0 zE21vj9T7X0BaSuIHY{Q~sy5yzSn9_YtTYeFkB%zhQd1OoNk)(__6k|RtYeWjbPSwB zR(u-r6N{0Oy;+8IfWB$Il!7e-xW45jHenKQ8eUeMt|_3OT+*y3o$w6DlWJ__H&{9x z!+qbL1+LGiQUT@%M;O#;`K+4r!HuXAP;z)4@y@t$cm2yXV`kX8f~Y6zxgpRZ2yd$= z2Qe52ksIF@=+YxGh%BkFMiIfGHGv(|jh!XYM3|>+r7j$q4z^+l6fa?I`NWT#tRmni zv#ZOef7uc`x}A;#FXE%B=notk06R0m1oARkS2O)A8GCNDf=x5tdBzF$8a5B-HeStp z=0T*;R0KTN;;dc4iA6Ekz=({j+j0RGA}my0maTQsnHvS!n3NYKSFb|Bz}|sQ1BbTa z_DWL&P(zS&Ze#<;S*d>K#33O8|HeK`3j=GYn3_o&I16q_IGhmALqncL{o}g>L{&7$ksT32ZyJqu6tOL< zwrHpXYorCyw^JeayLSg-5Ev5A?Ke$3RakG=TO*!jnOioLoM+JY2z?*AG2zLz0#{R? zBtjFgIMRiG;WIe#>mZ8Jg}`!w==&h_>4^&J*WE+Jnzf~zap5}L)#Tf#aZwWt0twqeI>OinZjZocQ6TxY-BOE9kF zRd+b*|NVG$blU5$^JH%Lfw-cZ=1htQ(26r4@wo;c`$ICr^x9Y!aBmD=^51_hWLf;w zL=^5B6q7JO)y#;n3kt=)E%ZFqjs?8|SAtl~4L;42bPFal=K3TT*Iy(C_g*+DBAS2b zTGW^1_^OOzhEZu$;9H%|ld z|0zzQC2v!>bmLb}G)!g`vLcTaUAeR2t#9#}D*&>KEGNuG87AXtU?)7!w+QMG@Lzgl z#?7oOlnBaC6`@RCVdO+F-ONtp%5dI4JEfO3&R%to`dMcZdPNMWi8*BHTpkSOIb2$} z$>10_78jfEs0H=J$K0vSR<7Gxk?lBe8fjM>k2! zRP=07c}96|8m}P=4a??m0=iOMyG^boOfUYjWlmiy45Gk^#W5@6PG{+wUWRx!fk1## zy!o0?W7K8XVU5_9ei&WqC)01={V@7AJ{egzua9KybaZ_4>ihn?AL+a4`Q*o!KgcK3 zH`>YDzFcj1(^|+K_MG@G1W*~PY|5%D#;LFJozQ({;4ZD=z9}>B6A>UcW!%H$b(s5- zk_)#TVka(?6o4|!47^_@AM|?SgGdKEqMF~*`J$$xn$_&h{T+7C{4A>zuTZM{PMu<- zrTgMu*H2DmBcdLAZWbHa`Z;ZxXezvRlA$WqwMFVri0+i0wJI;qB%#Z|qS&DuYO=$+ z*~>$qrozQQn5EIl#RY#(?XWuMVt&NSsY3z=hI=~Pj`2?**gg1<#a^ zkc|UFl?++_QE2@BkuNT8tp6*YsQzEy|Jg~a>;HBAAJz5$y8i#i&&<~K{{m_1`hQ*j zuj~JH{l7S-uKyR9Uf2KY`hQ*juj~JH{lBjN*Y*E7KkNGcHo;5&dtLuuz*pD*>-s-J zb^X7t|JU{Zy8bWJ_5Zs5|EI72EC0{+fA;;)lo)@2@Bhud|5*b|Qh)#7E?Ua}!&FJ> zk^SIvZ20~cQ`3|M{u`=n*7rYl(f;$Ve>YxdwtB%S%sf^!aH(6zBOR0`J&~eHvfOyI zFedLc8@z+R&t5-=4oQ|YSy6OJkqwyJcc;m81*{CPx~wW4Nok~s;XUEKsu*%#(=@R? z=pBi=+6C84Z|S1a)jEdR)6HJL{k!lO5C~Cd3H$kv_lGKUYu&D>cQr%QW%#et?|^&P z?hiU$t#9hR-tR)A?`LV~!mNXCU)K9avIvVGh>FtF#KVDpD9ZAYtPfh9{^0N^owXas z#J34ar@qLZ^I!6;J*-J>Q?#Zgnk^Z2(`m_K+vw|}+BLPKj;6K-gZ8R5-GLG;eBPh` ze6Q*4uA%mi#Fng^qTW-wV!Pct6b<80R*fU|@X%a2?>%TSD$IXTd|7%Z5~kPhwam7v zi36nr%!2IzVdRczfQ#AJz+UtWt-QdOUNFX9<8%IVNLZ3?FB9WZ%_F;#646D@LXrVB zKL5N&b7cSQ`nTxl><#pmp7Z|SOg-;|-{;qsSg=U2XFL*9FKvcwGz9URvF)NEZcSZKW>$;=f-Vf;m$lV?E_U;HD za($ci_U;JRtZ&ot&8r02eT!wsU^^=U!?ts)x85JcxRrBSvBmsF{e92dwKV>RDCOh* z4X}IUe+;G0|Lmj{_@BjLpYZQLDMqU$v;2>4)coH?tK$Dcmg0lw*pUB|Raq_TKfI{( zf4gbV((@k;?W^ZPo(Ysr`XdQm2`}iEoIgwR2e&W7Aep^jrIu$ScC%wZEAI3@&I_N! zh9p00F21MZn+pgU>V+Cl) zK2-O#!TuaiG{Y7_nH)q7UX^9H<}LmQ&hk#yGp|UeFykQb=r^EePbx5Rhj z!bp{U9Cq7*QkeKY2}?H$7m#Vfi}Y}MmX7U45s9N0FqD3}UVC zkJ;_XrwIGlyL|@;Q#ke)^IQrEG%exFW;qMpYaC~9vFA}@7hmz6H5a$GamQA0O+t^* zJA0nT?&24=s!6h>{+YH4IOpS-_jzzo88T22S{F62{&EEH(*RrX z&x?V?b>P~lEQ{yN%O8RJzqcxq$Oa&s{qh|7 - - - net5.0 - - - diff --git a/azure_devops/bootstrap/code/test/AttendeeTest/AttendeeExists.cs b/azure_devops/bootstrap/code/test/AttendeeTest/AttendeeExists.cs deleted file mode 100644 index 12134ca..0000000 --- a/azure_devops/bootstrap/code/test/AttendeeTest/AttendeeExists.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using Xunit; -using Xunit.Extensions; -using Attendees; - -namespace AttendeeTest -{ - public class AttendeeTest - { - [Fact] - public void AttendeeExistsReturnTrue() - { - Attendee attendee = new Attendee(); - bool doesExist = attendee.AddAttendee("doesnotexist"); - Assert.False(doesExist, "The attendee does not exist"); - } - } -} diff --git a/azure_devops/bootstrap/code/test/AttendeeTest/AttendeeTest.csproj b/azure_devops/bootstrap/code/test/AttendeeTest/AttendeeTest.csproj deleted file mode 100644 index 8f533dd..0000000 --- a/azure_devops/bootstrap/code/test/AttendeeTest/AttendeeTest.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - net5.0 - - false - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - diff --git a/azure_devops/bootstrap/jobs.json b/azure_devops/bootstrap/jobs.json deleted file mode 100644 index c44cdaf..0000000 --- a/azure_devops/bootstrap/jobs.json +++ /dev/null @@ -1,1262 +0,0 @@ -[ - { - "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", - "request_id": 4278, - "build_id": 4567, - "build_number": "20220405.1", - "result": "succeeded", - "queue_time": "2022-09-01T17:43:43.73Z", - "start_time": "2022-09-01T17:43:46.2405003Z", - "finish_time": "2022-09-01T17:44:41.4733333Z", - "assign_time": "2022-09-01T17:43:43.98Z", - "definition_id": 220, - "runner_name": "MacBook", - "os_description": "Darwin", - "runner_group": "Default" - }, - { - "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", - "request_id": 4273, - "build_id": 4558, - "build_number": "20220405.2", - "result": "succeeded", - "queue_time": "2022-09-01T00:29:56.47Z", - "start_time": "2022-09-01T00:29:59.3679242Z", - "finish_time": "2022-09-01T00:30:21.0533333Z", - "assign_time": "2022-09-01T00:29:56.6966667Z", - "definition_id": 217, - "runner_name": "MacBook", - "os_description": "Darwin", - "runner_group": "Default" - }, - { - "id": "011e1ec8-6569-5e69-4f06-baf193d1351e", - "request_id": 4272, - "build_id": 4556, - "build_number": "20220405.1", - "result": "succeeded", - "queue_time": "2022-09-01T00:26:22.6266667Z", - "start_time": "2022-09-01T00:26:25.2735844Z", - "finish_time": "2022-09-01T00:26:51.95Z", - "assign_time": "2022-09-01T00:26:22.6733333Z", - "definition_id": 217, - "runner_name": "MacBook", - "os_description": "Darwin", - "runner_group": "Default" - }, - { - "id": "ca395085-040a-526b-2ce8-bdc85f692774", - "request_id": 4954, - "build_id": 5151, - "build_number": "20220819.1", - "result": "failed", - "queue_time": "2022-09-01T16:58:13.8166667Z", - "start_time": "2022-09-01T16:58:25.0096333Z", - "finish_time": "2022-09-01T16:58:47.5866667Z", - "assign_time": "2022-09-01T16:58:14.25Z", - "definition_id": 51, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4953, - "build_id": 5150, - "build_number": "20220811.1", - "result": "succeeded", - "queue_time": "2022-09-01T03:00:36.7433333Z", - "start_time": "2022-09-01T03:00:48.3427295Z", - "finish_time": "2022-09-01T03:01:48.44Z", - "assign_time": "2022-09-01T03:00:36.98Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4952, - "build_id": 5149, - "build_number": "20220810.8", - "result": "succeeded", - "queue_time": "2022-09-01T22:24:17.5133333Z", - "start_time": "2022-09-01T22:28:41.8831876Z", - "finish_time": "2022-09-01T22:31:12.17Z", - "assign_time": "2022-09-01T22:28:28.5333333Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4951, - "build_id": 5145, - "build_number": "20220810.7", - "result": "succeeded", - "queue_time": "2022-09-01T22:24:16.2266667Z", - "start_time": "2022-09-01T22:24:32.7143159Z", - "finish_time": "2022-09-01T22:28:27.7133333Z", - "assign_time": "2022-09-01T22:24:16.2633333Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4950, - "build_id": 5144, - "build_number": "20220810.6", - "result": "failed", - "queue_time": "2022-09-01T22:16:23.8866667Z", - "start_time": "2022-09-01T22:18:53.7076646Z", - "finish_time": "2022-09-01T22:21:10.2933333Z", - "assign_time": "2022-09-01T22:18:36.9166667Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4949, - "build_id": 5143, - "build_number": "20220810.5", - "result": "failed", - "queue_time": "2022-09-01T22:10:05.1666667Z", - "start_time": "2022-09-01T22:15:12.6511213Z", - "finish_time": "2022-09-01T22:18:36.0266667Z", - "assign_time": "2022-09-01T22:14:53.49Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4948, - "build_id": 5139, - "build_number": "20220810.4", - "result": "failed", - "queue_time": "2022-09-01T23:09:36.2133333Z", - "start_time": "2022-09-01T23:11:57.7706354Z", - "finish_time": "2022-09-01T23:14:52.64Z", - "assign_time": "2022-09-01T23:11:41.84Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4947, - "build_id": 5135, - "build_number": "20220810.3", - "result": "failed", - "queue_time": "2022-09-01T23:08:11.87Z", - "start_time": "2022-09-01T23:09:49.6121805Z", - "finish_time": "2022-09-01T23:11:41.2033333Z", - "assign_time": "2022-09-01T22:09:38.72Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4946, - "build_id": 5131, - "build_number": "20220810.2", - "result": "failed", - "queue_time": "2022-09-01T22:07:03.78Z", - "start_time": "2022-09-01T22:07:24.865421Z", - "finish_time": "2022-09-01T22:09:37.6433333Z", - "assign_time": "2022-09-01T22:07:04.03Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4945, - "build_id": 5127, - "build_number": "20220810.1", - "result": "failed", - "queue_time": "2022-09-01T22:05:16.8433333Z", - "start_time": "2022-09-01T22:05:40.1526981Z", - "finish_time": "2022-09-01T22:06:51.0533333Z", - "assign_time": "2022-09-01T22:05:16.9066667Z", - "definition_id": 391, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4944, - "build_id": 5120, - "build_number": "20220810.2", - "result": "failed", - "queue_time": "2022-09-01T20:54:58.1433333Z", - "start_time": "2022-09-01T20:55:56.6551759Z", - "finish_time": "2022-09-01T20:56:27.06Z", - "assign_time": "2022-09-01T20:55:43.2933333Z", - "definition_id": 382, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4943, - "build_id": 5117, - "build_number": "20220810.1", - "result": "failed", - "queue_time": "2022-09-01T20:54:52.31Z", - "start_time": "2022-09-01T20:55:09.3477439Z", - "finish_time": "2022-09-01T20:55:42.0333333Z", - "assign_time": "2022-09-01T20:54:52.3666667Z", - "definition_id": 382, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4941, - "build_id": 5115, - "build_number": "20220808.1", - "result": "failed", - "queue_time": "2022-09-01T17:56:30.37Z", - "start_time": "2022-09-01T17:56:48.1800943Z", - "finish_time": "2022-09-01T17:57:29.7733333Z", - "assign_time": "2022-09-01T17:56:30.4Z", - "definition_id": 382, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4940, - "build_id": 5112, - "build_number": "5112", - "result": "succeeded", - "queue_time": "2022-09-01T17:51:29.1566667Z", - "start_time": "2022-09-01T17:51:47.1020425Z", - "finish_time": "2022-09-01T17:52:37.01Z", - "assign_time": "2022-09-01T17:51:29.22Z", - "definition_id": 389, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "cfa20e98-6997-523c-4233-f0a7302c929f", - "request_id": 4938, - "build_id": 5110, - "build_number": "5110", - "result": "succeeded", - "queue_time": "2022-09-01T23:37:25.4433333Z", - "start_time": "2022-09-01T23:39:01.1647409Z", - "finish_time": "2022-09-01T23:39:53.2166667Z", - "assign_time": "2022-09-01T23:38:49.5033333Z", - "definition_id": 381, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4937, - "build_id": 5110, - "build_number": "5110", - "result": "succeeded", - "queue_time": "2022-09-01T23:37:25.4233333Z", - "start_time": "2022-09-01T23:37:41.9972446Z", - "finish_time": "2022-09-01T23:38:48.7133333Z", - "assign_time": "2022-09-01T23:37:25.7066667Z", - "definition_id": 381, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "899a9724-4530-558a-15f1-375d2bccc79e", - "request_id": 4934, - "build_id": 5105, - "build_number": "20220725.2", - "result": "succeeded", - "queue_time": "2022-09-01T21:35:31.2933333Z", - "start_time": "2022-09-01T21:35:36.7385249Z", - "finish_time": "2022-09-01T21:36:30.7066667Z", - "assign_time": "2022-09-01T21:35:31.3466667Z", - "definition_id": 378, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "899a9724-4530-558a-15f1-375d2bccc79e", - "request_id": 4933, - "build_id": 5104, - "build_number": "20220725.1", - "result": "succeeded", - "queue_time": "2022-09-01T20:50:01.22Z", - "start_time": "2022-09-01T20:50:07.4147643Z", - "finish_time": "2022-09-01T20:50:54.54Z", - "assign_time": "2022-09-01T20:50:01.46Z", - "definition_id": 378, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4931, - "build_id": 5101, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-09-01T18:45:50.1866667Z", - "start_time": "2022-09-01T18:45:56.8851106Z", - "finish_time": "2022-09-01T18:46:10.4233333Z", - "assign_time": "2022-09-01T18:45:50.28Z", - "definition_id": 380, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "96c60851-4ac0-512f-ac8a-daf36b6a2b26", - "request_id": 4930, - "build_id": 5100, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-09-01T18:43:47.0133333Z", - "start_time": "2022-09-01T18:44:44.683617Z", - "finish_time": "2022-09-01T18:44:57.0366667Z", - "assign_time": "2022-09-01T18:44:23.9933333Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ca395085-040a-526b-2ce8-bdc85f692774", - "request_id": 4929, - "build_id": 5100, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-09-01T18:43:46.7466667Z", - "start_time": "2022-09-01T18:44:11.1374529Z", - "finish_time": "2022-09-01T18:44:23.3633333Z", - "assign_time": "2022-09-01T18:44:04.8533333Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "341b3d8e-0d13-57d4-859b-65d31dcbc29e", - "request_id": 4928, - "build_id": 5100, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-09-01T18:43:46.7433333Z", - "start_time": "2022-09-01T18:43:53.5495773Z", - "finish_time": "2022-09-01T18:44:03.7166667Z", - "assign_time": "2022-09-01T18:43:46.7733333Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4927, - "build_id": 5098, - "build_number": "20220718.1", - "result": "succeeded", - "queue_time": "2022-09-01T18:40:39.23Z", - "start_time": "2022-09-01T18:40:49.010239Z", - "finish_time": "2022-09-01T18:41:32.5133333Z", - "assign_time": "2022-09-01T18:40:39.2966667Z", - "definition_id": 379, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "899a9724-4530-558a-15f1-375d2bccc79e", - "request_id": 4925, - "build_id": 5096, - "build_number": "20220715.1", - "result": "succeeded", - "queue_time": "2022-09-01T15:54:11.64Z", - "start_time": "2022-09-01T15:54:17.2876517Z", - "finish_time": "2022-09-01T15:55:05.1266667Z", - "assign_time": "2022-09-01T15:54:11.7066667Z", - "definition_id": 378, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "899a9724-4530-558a-15f1-375d2bccc79e", - "request_id": 4923, - "build_id": 5091, - "build_number": "20220714.1", - "result": "succeeded", - "queue_time": "2022-09-01T20:44:28.6066667Z", - "start_time": "2022-09-01T20:44:37.1245218Z", - "finish_time": "2022-09-01T20:45:43.04Z", - "assign_time": "2022-09-01T20:44:28.9166667Z", - "definition_id": 378, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4921, - "build_id": 5089, - "build_number": "20220713.1", - "result": "succeeded", - "queue_time": "2022-09-01T20:25:18.7966667Z", - "start_time": "2022-09-01T20:25:28.2135186Z", - "finish_time": "2022-09-01T20:26:16.3533333Z", - "assign_time": "2022-09-01T20:25:18.9966667Z", - "definition_id": 377, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4920, - "build_id": 5084, - "build_number": "20220713.1", - "result": "succeeded", - "queue_time": "2022-09-01T13:46:02.8033333Z", - "start_time": "2022-09-01T13:47:12.5184633Z", - "finish_time": "2022-09-01T13:47:53.0966667Z", - "assign_time": "2022-09-01T13:47:03.9233333Z", - "definition_id": 373, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4919, - "build_id": 5083, - "build_number": "20220713.1", - "result": "failed", - "queue_time": "2022-09-01T13:46:01.12Z", - "start_time": "2022-09-01T13:46:13.2306562Z", - "finish_time": "2022-09-01T13:47:02.71Z", - "assign_time": "2022-09-01T13:46:01.1766667Z", - "definition_id": 372, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4918, - "build_id": 5080, - "build_number": "20220712.1", - "result": "failed", - "queue_time": "2022-09-01T17:06:15.5033333Z", - "start_time": "2022-09-01T17:06:26.1795208Z", - "finish_time": "2022-09-01T17:06:55.86Z", - "assign_time": "2022-09-01T17:06:15.74Z", - "definition_id": 376, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4917, - "build_id": 5079, - "build_number": "20220712.1", - "result": "succeeded", - "queue_time": "2022-09-01T14:48:45.8033333Z", - "start_time": "2022-09-01T14:48:52.8152685Z", - "finish_time": "2022-09-01T14:49:43.0233333Z", - "assign_time": "2022-09-01T14:48:46.3166667Z", - "definition_id": 375, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ca395085-040a-526b-2ce8-bdc85f692774", - "request_id": 4915, - "build_id": 5077, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-09-01T22:08:51.9533333Z", - "start_time": "2022-09-01T22:09:03.1483001Z", - "finish_time": "2022-09-01T22:09:24.9666667Z", - "assign_time": "2022-09-01T22:08:52.1566667Z", - "definition_id": 51, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4914, - "build_id": 5076, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-09-01T20:42:40.6Z", - "start_time": "2022-09-01T20:43:19.0923053Z", - "finish_time": "2022-09-01T20:43:30.9233333Z", - "assign_time": "2022-09-01T20:43:11.27Z", - "definition_id": 374, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "96c60851-4ac0-512f-ac8a-daf36b6a2b26", - "request_id": 4913, - "build_id": 5075, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-09-01T20:42:13.6133333Z", - "start_time": "2022-09-01T20:42:59.2918804Z", - "finish_time": "2022-09-01T20:43:10.2133333Z", - "assign_time": "2022-09-01T20:42:51.9266667Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ca395085-040a-526b-2ce8-bdc85f692774", - "request_id": 4912, - "build_id": 5075, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-09-01T20:42:13.5566667Z", - "start_time": "2022-09-01T20:42:39.2587562Z", - "finish_time": "2022-09-01T20:42:50.9533333Z", - "assign_time": "2022-09-01T20:42:30.8066667Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "341b3d8e-0d13-57d4-859b-65d31dcbc29e", - "request_id": 4911, - "build_id": 5075, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-09-01T20:42:13.5466667Z", - "start_time": "2022-09-01T20:42:20.169292Z", - "finish_time": "2022-09-01T20:42:30.1066667Z", - "assign_time": "2022-09-01T20:42:13.5933333Z", - "definition_id": 197, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4910, - "build_id": 5073, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-09-01T20:40:33.65Z", - "start_time": "2022-09-01T20:40:39.6509289Z", - "finish_time": "2022-09-01T20:41:39.77Z", - "assign_time": "2022-09-01T20:40:33.88Z", - "definition_id": 373, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4909, - "build_id": 5072, - "build_number": "20220711.1", - "result": "canceled", - "queue_time": "2022-09-01T15:02:41.43Z", - "start_time": "2022-09-01T15:02:52.8313534Z", - "finish_time": "2022-09-01T15:02:58.06Z", - "assign_time": "2022-09-01T15:02:41.4766667Z", - "definition_id": 372, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4908, - "build_id": 5071, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-09-01T14:58:14.99Z", - "start_time": "2022-09-01T14:58:21.4957133Z", - "finish_time": "2022-09-01T14:58:41.8933333Z", - "assign_time": "2022-09-01T14:58:15.0266667Z", - "definition_id": 371, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4907, - "build_id": 5070, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-09-01T14:31:09.8066667Z", - "start_time": "2022-09-01T14:31:24.8007924Z", - "finish_time": "2022-09-01T14:31:59.3633333Z", - "assign_time": "2022-09-01T14:31:09.8633333Z", - "definition_id": 370, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4906, - "build_id": 5069, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-09-01T14:28:25.6866667Z", - "start_time": "2022-09-01T14:28:32.763647Z", - "finish_time": "2022-09-01T14:28:46.5933333Z", - "assign_time": "2022-09-01T14:28:25.73Z", - "definition_id": 369, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "76ed1102-9071-5354-720f-6f09bbc9f0c0", - "request_id": 4905, - "build_id": 5068, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-09-01T14:24:10.3233333Z", - "start_time": "2022-09-01T14:25:07.2541035Z", - "finish_time": "2022-09-01T14:25:34.6333333Z", - "assign_time": "2022-09-01T14:25:00.7966667Z", - "definition_id": 368, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "00b6a206-eb91-585b-3d14-cf1a4d7b1970", - "request_id": 4904, - "build_id": 5068, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-09-01T14:24:10.15Z", - "start_time": "2022-09-01T14:24:42.1401754Z", - "finish_time": "2022-09-01T14:25:00.07Z", - "assign_time": "2022-09-01T14:24:34.3Z", - "definition_id": 368, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "19c563d8-3dcd-57d1-cd5e-9dd946b0a29b", - "request_id": 4903, - "build_id": 5068, - "build_number": "20220711.1", - "result": "failed", - "queue_time": "2022-09-01T14:24:10.14Z", - "start_time": "2022-09-01T14:24:16.1904439Z", - "finish_time": "2022-09-01T14:24:33.44Z", - "assign_time": "2022-09-01T14:24:10.17Z", - "definition_id": 368, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4902, - "build_id": 5067, - "build_number": "20220711.1", - "result": "succeeded", - "queue_time": "2022-09-01T14:18:10.19Z", - "start_time": "2022-09-01T14:18:18.3555844Z", - "finish_time": "2022-09-01T14:19:22.6266667Z", - "assign_time": "2022-09-01T14:18:10.3466667Z", - "definition_id": 367, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "6a659b14-a5ad-5ce8-05ff-9105f4d16f55", - "request_id": 4901, - "build_id": 107, - "build_number": "Release-1 / Stage 1", - "result": "succeeded", - "queue_time": "2022-09-01T20:15:02.33Z", - "start_time": "2022-09-01T20:15:43.3995066Z", - "finish_time": "2022-09-01T20:15:51.7133333Z", - "assign_time": "2022-09-01T20:15:32.3933333Z", - "definition_id": 14, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "3b770d45-ae29-59a7-a774-67c6a1476782", - "request_id": 4900, - "build_id": 108, - "build_number": "Release-1 / Stage 2", - "result": "succeeded", - "queue_time": "2022-09-01T20:14:52.4266667Z", - "start_time": "2022-09-01T20:15:10.1184454Z", - "finish_time": "2022-09-01T20:15:31.55Z", - "assign_time": "2022-09-01T20:14:52.7866667Z", - "definition_id": 14, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4899, - "build_id": 5066, - "build_number": "5066", - "result": "succeeded", - "queue_time": "2022-09-01T13:49:34.8366667Z", - "start_time": "2022-09-01T13:49:44.5760594Z", - "finish_time": "2022-09-01T13:52:18.75Z", - "assign_time": "2022-09-01T13:49:35.0133333Z", - "definition_id": 366, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4898, - "build_id": 5065, - "build_number": "5065", - "result": "succeeded", - "queue_time": "2022-09-01T13:20:41.41Z", - "start_time": "2022-09-01T13:20:48.1950176Z", - "finish_time": "2022-09-01T13:24:58.39Z", - "assign_time": "2022-09-01T13:20:41.4533333Z", - "definition_id": 365, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4897, - "build_id": 5064, - "build_number": "5064", - "result": "succeeded", - "queue_time": "2022-09-01T12:35:50.17Z", - "start_time": "2022-09-01T12:35:57.4102501Z", - "finish_time": "2022-09-01T12:39:10.7633333Z", - "assign_time": "2022-09-01T12:35:50.23Z", - "definition_id": 365, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4896, - "build_id": 5063, - "build_number": "20220630.1", - "result": "succeeded", - "queue_time": "2022-09-01T03:00:17.8733333Z", - "start_time": "2022-09-01T03:00:26.8409899Z", - "finish_time": "2022-09-01T03:01:50.0266667Z", - "assign_time": "2022-09-01T03:00:17.91Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4895, - "build_id": 5061, - "build_number": "20220629.2", - "result": "succeeded", - "queue_time": "2022-09-01T19:51:17.76Z", - "start_time": "2022-09-01T19:51:23.9334952Z", - "finish_time": "2022-09-01T19:52:46.86Z", - "assign_time": "2022-09-01T19:51:17.82Z", - "definition_id": 364, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4894, - "build_id": 5058, - "build_number": "20220629.1", - "result": "succeeded", - "queue_time": "2022-09-01T19:41:00.17Z", - "start_time": "2022-09-01T19:41:08.6550627Z", - "finish_time": "2022-09-01T19:44:41.7466667Z", - "assign_time": "2022-09-01T19:41:00.45Z", - "definition_id": 364, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4893, - "build_id": 5054, - "build_number": "20220629.1", - "result": "succeeded", - "queue_time": "2022-09-01T03:00:36.52Z", - "start_time": "2022-09-01T03:00:45.436629Z", - "finish_time": "2022-09-01T03:01:57.1366667Z", - "assign_time": "2022-09-01T03:00:36.56Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", - "request_id": 4892, - "build_id": 5052, - "build_number": "20220628.7", - "result": "succeeded", - "queue_time": "2022-09-01T19:11:13.5933333Z", - "start_time": "2022-09-01T19:11:21.6684563Z", - "finish_time": "2022-09-01T19:12:21.8866667Z", - "assign_time": "2022-09-01T19:11:13.6466667Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", - "request_id": 4891, - "build_id": 5051, - "build_number": "20220628.6", - "result": "succeeded", - "queue_time": "2022-09-01T16:45:46.73Z", - "start_time": "2022-09-01T16:45:56.8715565Z", - "finish_time": "2022-09-01T16:46:56.2666667Z", - "assign_time": "2022-09-01T16:45:46.7633333Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", - "request_id": 4890, - "build_id": 5050, - "build_number": "20220628.5", - "result": "failed", - "queue_time": "2022-09-01T16:42:49.2Z", - "start_time": "2022-09-01T16:42:54.4510649Z", - "finish_time": "2022-09-01T16:43:09.88Z", - "assign_time": "2022-09-01T16:42:49.2266667Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "bae70de3-1eac-5ef9-ecf5-c0635ec73bc0", - "request_id": 4889, - "build_id": 5049, - "build_number": "20220628.4", - "result": "failed", - "queue_time": "2022-09-01T16:38:35.2Z", - "start_time": "2022-09-01T16:38:41.1860027Z", - "finish_time": "2022-09-01T16:38:56.49Z", - "assign_time": "2022-09-01T16:38:35.2633333Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", - "request_id": 4888, - "build_id": 5048, - "build_number": "20220628.3", - "result": "succeeded", - "queue_time": "2022-09-01T16:31:50.58Z", - "start_time": "2022-09-01T16:31:56.974368Z", - "finish_time": "2022-09-01T16:32:57.4933333Z", - "assign_time": "2022-09-01T16:31:50.6066667Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", - "request_id": 4887, - "build_id": 5047, - "build_number": "20220628.2", - "result": "succeeded", - "queue_time": "2022-09-01T16:27:16.41Z", - "start_time": "2022-09-01T16:27:25.7030557Z", - "finish_time": "2022-09-01T16:28:07.04Z", - "assign_time": "2022-09-01T16:27:16.68Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", - "request_id": 4886, - "build_id": 5046, - "build_number": "20220628.1", - "result": "succeeded", - "queue_time": "2022-09-01T16:10:15.1866667Z", - "start_time": "2022-09-01T16:10:22.632602Z", - "finish_time": "2022-09-01T16:11:00.95Z", - "assign_time": "2022-09-01T16:10:15.4566667Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4885, - "build_id": 5045, - "build_number": "20220628.1", - "result": "succeeded", - "queue_time": "2022-09-01T03:00:17.8566667Z", - "start_time": "2022-09-01T03:00:30.6344983Z", - "finish_time": "2022-09-01T03:01:10.2466667Z", - "assign_time": "2022-09-01T03:00:17.8966667Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2831d33e-84dd-5533-eda0-8105954f1bc8", - "request_id": 4884, - "build_id": 5043, - "build_number": "20220627.2", - "result": "succeeded", - "queue_time": "2022-09-01T17:47:08.16Z", - "start_time": "2022-09-01T17:47:15.987734Z", - "finish_time": "2022-09-01T17:50:44.12Z", - "assign_time": "2022-09-01T17:47:08.4933333Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ca395085-040a-526b-2ce8-bdc85f692774", - "request_id": 4883, - "build_id": 5042, - "build_number": "20220627.1", - "result": "canceled", - "queue_time": "2022-09-01T17:26:33.07Z", - "start_time": "2022-09-01T17:26:39.6690274Z", - "finish_time": "2022-09-01T17:26:55.87Z", - "assign_time": "2022-09-01T17:26:33.49Z", - "definition_id": 168, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "12f1170f-54f2-53f3-20dd-22fc7dff55f9", - "request_id": 4882, - "build_id": 5035, - "build_number": "20220627.1", - "result": "succeeded", - "queue_time": "2022-09-01T16:21:06.4833333Z", - "start_time": "2022-09-01T16:21:11.8349063Z", - "finish_time": "2022-09-01T16:21:58.5633333Z", - "assign_time": "2022-09-01T16:21:06.54Z", - "definition_id": 363, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "a528ef4b-e2e0-565b-271a-65845573d880", - "request_id": 4871, - "build_id": 5032, - "build_number": "20220623.1", - "result": "canceled", - "queue_time": "2022-09-01T00:30:56.79Z", - "start_time": "2022-09-01T00:31:01.9918715Z", - "finish_time": "2022-09-01T00:31:19.5833333Z", - "assign_time": "2022-09-01T00:30:56.8533333Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4870, - "build_id": 5031, - "build_number": "5031", - "result": "succeeded", - "queue_time": "2022-09-01T18:52:57.21Z", - "start_time": "2022-09-01T18:54:41.9650756Z", - "finish_time": "2022-09-01T18:55:41.29Z", - "assign_time": "2022-09-01T18:54:25.0866667Z", - "definition_id": 361, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "cfa20e98-6997-523c-4233-f0a7302c929f", - "request_id": 4869, - "build_id": 5031, - "build_number": "5031", - "result": "succeeded", - "queue_time": "2022-09-01T18:52:57.2Z", - "start_time": "2022-09-01T18:53:14.9752109Z", - "finish_time": "2022-09-01T18:54:24.2033333Z", - "assign_time": "2022-09-01T18:52:57.2233333Z", - "definition_id": 361, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4868, - "build_id": 5029, - "build_number": "5029", - "result": "succeeded", - "queue_time": "2022-09-01T13:01:36.7433333Z", - "start_time": "2022-09-01T13:03:00.7879139Z", - "finish_time": "2022-09-01T13:03:57.8833333Z", - "assign_time": "2022-09-01T13:02:40.4833333Z", - "definition_id": 360, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "cfa20e98-6997-523c-4233-f0a7302c929f", - "request_id": 4867, - "build_id": 5029, - "build_number": "5029", - "result": "succeeded", - "queue_time": "2022-09-01T13:01:36.48Z", - "start_time": "2022-09-01T13:01:51.5040284Z", - "finish_time": "2022-09-01T13:02:39.8466667Z", - "assign_time": "2022-09-01T13:01:36.9533333Z", - "definition_id": 360, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "f8252943-765e-554e-090d-5571acebf4bb", - "request_id": 4866, - "build_id": 5028, - "build_number": "20220622.1", - "result": "succeeded", - "queue_time": "2022-09-01T03:00:34.3866667Z", - "start_time": "2022-09-01T03:00:42.8728772Z", - "finish_time": "2022-09-01T03:01:23.4566667Z", - "assign_time": "2022-09-01T03:00:34.5533333Z", - "definition_id": 135, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4865, - "build_id": 5027, - "build_number": "5027", - "result": "succeeded", - "queue_time": "2022-09-01T18:08:56.53Z", - "start_time": "2022-09-01T18:09:05.5510972Z", - "finish_time": "2022-09-01T18:09:53.5Z", - "assign_time": "2022-09-01T18:08:56.7066667Z", - "definition_id": 361, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "5daf491e-fc1d-52d4-3c36-b35e31684732", - "request_id": 4864, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-09-01T17:04:17.85Z", - "start_time": "2022-09-01T17:06:53.9745617Z", - "finish_time": "2022-09-01T17:07:25.3266667Z", - "assign_time": "2022-09-01T17:06:44.67Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ce39968d-2aee-58c0-6354-4429990bc777", - "request_id": 4863, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-09-01T17:03:33.3766667Z", - "start_time": "2022-09-01T17:06:01.1201953Z", - "finish_time": "2022-09-01T17:06:43.8966667Z", - "assign_time": "2022-09-01T17:05:54.9566667Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "2431e782-2f38-5ac4-c2f8-af294f6d514a", - "request_id": 4862, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-09-01T17:02:20.06Z", - "start_time": "2022-09-01T17:05:07.8148768Z", - "finish_time": "2022-09-01T17:05:54.32Z", - "assign_time": "2022-09-01T17:05:00.4Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "a528ef4b-e2e0-565b-271a-65845573d880", - "request_id": 4861, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-09-01T17:02:19.9Z", - "start_time": "2022-09-01T17:04:22.8635006Z", - "finish_time": "2022-09-01T17:04:59.4966667Z", - "assign_time": "2022-09-01T17:04:16.2166667Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "54beca5a-7b68-5580-ddd0-8aef5b91640f", - "request_id": 4860, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-09-01T17:02:18.9633333Z", - "start_time": "2022-09-01T17:03:35.4472694Z", - "finish_time": "2022-09-01T17:04:15.2066667Z", - "assign_time": "2022-09-01T17:03:27.2Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7cb24041-3325-5b8a-c38d-87131110a6bf", - "request_id": 4859, - "build_id": 5026, - "build_number": "20220621.2", - "result": "succeeded", - "queue_time": "2022-09-01T17:02:17.9Z", - "start_time": "2022-09-01T17:02:51.4121619Z", - "finish_time": "2022-09-01T17:03:26.3666667Z", - "assign_time": "2022-09-01T17:02:43.3566667Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "275f1d19-1bd8-5591-b06b-07d489ea915a", - "request_id": 4858, - "build_id": 5025, - "build_number": "5025", - "result": "succeeded", - "queue_time": "2022-09-01T17:01:39.48Z", - "start_time": "2022-09-01T17:01:52.5755448Z", - "finish_time": "2022-09-01T17:02:42.6633333Z", - "assign_time": "2022-09-01T17:01:39.54Z", - "definition_id": 360, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "7e70de06-f711-585d-8aa0-f04466a62cd4", - "request_id": 4857, - "build_id": 5024, - "build_number": "20220621.1", - "result": "succeeded", - "queue_time": "2022-09-01T16:59:29.8433333Z", - "start_time": "2022-09-01T17:00:18.7374553Z", - "finish_time": "2022-09-01T17:00:47.1933333Z", - "assign_time": "2022-09-01T17:00:11.0233333Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "a528ef4b-e2e0-565b-271a-65845573d880", - "request_id": 4856, - "build_id": 5024, - "build_number": "20220621.1", - "result": "succeeded", - "queue_time": "2022-09-01T16:58:34.2633333Z", - "start_time": "2022-09-01T16:59:33.2423874Z", - "finish_time": "2022-09-01T17:00:09.8933333Z", - "assign_time": "2022-09-01T16:59:27.85Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - }, - { - "id": "ce39968d-2aee-58c0-6354-4429990bc777", - "request_id": 4855, - "build_id": 5024, - "build_number": "20220621.1", - "result": "succeeded", - "queue_time": "2022-09-01T16:58:33.5866667Z", - "start_time": "2022-09-01T16:58:41.9914811Z", - "finish_time": "2022-09-01T16:59:27.19Z", - "assign_time": "2022-09-01T16:58:33.8166667Z", - "definition_id": 359, - "runner_name": "Hosted Agent", - "os_description": "Linux", - "runner_group": "Azure Pipelines" - } - ] diff --git a/azure_devops/bootstrap/pipelines/classic/valet-classic1.json b/azure_devops/bootstrap/pipelines/classic/valet-classic1.json deleted file mode 100644 index 43052b4..0000000 --- a/azure_devops/bootstrap/pipelines/classic/valet-classic1.json +++ /dev/null @@ -1,243 +0,0 @@ -{ - "options": [ - { - "enabled": true, - "definition": { - "id": "5d58cc01-7c75-450c-be18-a388ddb129ec" - }, - "inputs": { - "branchFilters": "[\"+refs/heads/*\"]", - "additionalFields": "{}" - } - }, - { - "enabled": false, - "definition": { - "id": "a9db38f9-9fdc-478c-b0f9-464221e58316" - }, - "inputs": { - "workItemType": "Task", - "assignToRequestor": "true", - "additionalFields": "{}" - } - } - ], - "variables": { - "BuildConfiguration": { - "value": "release", - "allowOverride": true - }, - "BuildPlatform": { - "value": "any cpu", - "allowOverride": true - }, - "system.debug": { - "value": "false", - "allowOverride": true - } - }, - "properties": {}, - "tags": [], - "_links": [], - "buildNumberFormat": "$(date:yyyyMMdd)$(rev:.r)", - "jobAuthorizationScope": 1, - "jobTimeoutInMinutes": 60, - "jobCancelTimeoutInMinutes": 5, - "process": { - "phases": [ - { - "steps": [ - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "Use NuGet 4.4.1", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "2c65196a-54fd-4a02-9be8-d9d1837b7c5d", - "versionSpec": "0.*", - "definitionType": "task" - }, - "inputs": { - "versionSpec": "4.4.1", - "checkLatest": "false" - } - }, - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "NuGet restore", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "333b11bd-d341-40d9-afcf-b32d5ce6f23b", - "versionSpec": "2.*", - "definitionType": "task" - }, - "inputs": { - "command": "restore", - "solution": "$(Parameters.solution)", - "selectOrConfig": "select", - "feedRestore": "", - "includeNuGetOrg": "true", - "nugetConfigPath": "", - "externalEndpoints": "", - "noCache": "false", - "disableParallelProcessing": "false", - "packagesDirectory": "", - "verbosityRestore": "Detailed", - "searchPatternPush": "$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg", - "nuGetFeedType": "internal", - "feedPublish": "", - "publishPackageMetadata": "true", - "allowPackageConflicts": "false", - "externalEndpoint": "", - "verbosityPush": "Detailed", - "searchPatternPack": "**/*.csproj", - "configurationToPack": "$(BuildConfiguration)", - "outputDir": "$(Build.ArtifactStagingDirectory)", - "versioningScheme": "off", - "includeReferencedProjects": "false", - "versionEnvVar": "", - "requestedMajorVersion": "1", - "requestedMinorVersion": "0", - "requestedPatchVersion": "0", - "packTimezone": "utc", - "includeSymbols": "false", - "toolPackage": "false", - "buildProperties": "", - "basePath": "", - "verbosityPack": "Detailed", - "arguments": "" - } - }, - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "PowerShell Script", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1", - "versionSpec": "2.*", - "definitionType": "task" - }, - "inputs": { - "targetType": "inline", - "filePath": "", - "arguments": "", - "script": "# Write your PowerShell commands here.\n\nWrite-Host \"Hello World\"\n", - "errorActionPreference": "stop", - "warningPreference": "default", - "informationPreference": "default", - "verbosePreference": "default", - "debugPreference": "default", - "failOnStderr": "false", - "showWarnings": "false", - "ignoreLASTEXITCODE": "false", - "pwsh": "false", - "workingDirectory": "", - "runScriptInSeparateScope": "false" - } - } - ], - "name": "Agent job 1", - "refName": "Job_1", - "condition": "succeeded()", - "target": { - "executionOptions": { - "type": 0 - }, - "allowScriptsAuthAccessOption": false, - "type": 1 - }, - "jobAuthorizationScope": 1 - } - ], - "target": { - "agentSpecification": { - "identifier": "windows-latest" - } - }, - "type": 1 - }, - "repository": { - "properties": { - "cleanOptions": "0", - "labelSources": "0", - "labelSourcesFormat": "$(build.buildNumber)", - "reportBuildStatus": "true", - "gitLfsSupport": "false", - "skipSyncSource": "false", - "checkoutNestedSubmodules": "false", - "fetchDepth": "0" - }, - "id": "", - "type": "TfsGit", - "name": "REPOTOREPLACE", - "url": "", - "defaultBranch": "refs/heads/main", - "clean": "false", - "checkoutSubmodules": false - }, - "processParameters": { - "inputs": [ - { - "aliases": [], - "options": {}, - "properties": {}, - "name": "solution", - "label": "Solution", - "defaultValue": "**\\*.sln", - "required": true, - "type": "filePath", - "helpMarkDown": "The path to the Visual Studio solution file or NuGet packages.config. Wildcards can be used. For example, `**\\\\*.sln` for all sln files in all sub folders." - } - ] - }, - "quality": 1, - "authoredBy": { - "displayName": "David Kalmin", - "url": "https://spsprodcus5.vssps.visualstudio.com/A8ceff4ff-6429-4de3-9c39-fd7f0b1fb05a/_apis/Identities/a886d3a4-5700-6920-a3e4-6dadf46e7614", - "_links": { - "avatar": { - "href": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" - } - }, - "id": "a886d3a4-5700-6920-a3e4-6dadf46e7614", - "uniqueName": "davidkalmin@microsoft.com", - "imageUrl": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0", - "descriptor": "aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" - }, - "drafts": [], - "queue": { - "_links": { - "self": { - "href": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126" - } - }, - "name": "Azure Pipelines", - "url": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126", - "pool": { - "name": "Azure Pipelines", - "isHosted": true - } - }, - "id": 10, - "name": "valet-classic-test-import1", - "uri": "vstfs:///Build/Definition/10", - "path": "\\", - "type": 2, - "queueStatus": 0, - "revision": 1, - "createdDate": "2022-02-17T19:05:52.500Z" -} diff --git a/azure_devops/bootstrap/pipelines/classic/valet-classic2.json b/azure_devops/bootstrap/pipelines/classic/valet-classic2.json deleted file mode 100644 index b368aa1..0000000 --- a/azure_devops/bootstrap/pipelines/classic/valet-classic2.json +++ /dev/null @@ -1,243 +0,0 @@ -{ - "options": [ - { - "enabled": true, - "definition": { - "id": "5d58cc01-7c75-450c-be18-a388ddb129ec" - }, - "inputs": { - "branchFilters": "[\"+refs/heads/*\"]", - "additionalFields": "{}" - } - }, - { - "enabled": false, - "definition": { - "id": "a9db38f9-9fdc-478c-b0f9-464221e58316" - }, - "inputs": { - "workItemType": "Task", - "assignToRequestor": "true", - "additionalFields": "{}" - } - } - ], - "variables": { - "BuildConfiguration": { - "value": "release", - "allowOverride": true - }, - "BuildPlatform": { - "value": "any cpu", - "allowOverride": true - }, - "system.debug": { - "value": "false", - "allowOverride": true - } - }, - "properties": {}, - "tags": [], - "_links": [], - "buildNumberFormat": "$(date:yyyyMMdd)$(rev:.r)", - "jobAuthorizationScope": 1, - "jobTimeoutInMinutes": 60, - "jobCancelTimeoutInMinutes": 5, - "process": { - "phases": [ - { - "steps": [ - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "Use NuGet 4.4.1", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "2c65196a-54fd-4a02-9be8-d9d1837b7c5d", - "versionSpec": "0.*", - "definitionType": "task" - }, - "inputs": { - "versionSpec": "4.4.1", - "checkLatest": "false" - } - }, - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "NuGet restore", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "333b11bd-d341-40d9-afcf-b32d5ce6f23b", - "versionSpec": "2.*", - "definitionType": "task" - }, - "inputs": { - "command": "restore", - "solution": "$(Parameters.solution)", - "selectOrConfig": "select", - "feedRestore": "", - "includeNuGetOrg": "true", - "nugetConfigPath": "", - "externalEndpoints": "", - "noCache": "false", - "disableParallelProcessing": "false", - "packagesDirectory": "", - "verbosityRestore": "Detailed", - "searchPatternPush": "$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg", - "nuGetFeedType": "internal", - "feedPublish": "", - "publishPackageMetadata": "true", - "allowPackageConflicts": "false", - "externalEndpoint": "", - "verbosityPush": "Detailed", - "searchPatternPack": "**/*.csproj", - "configurationToPack": "$(BuildConfiguration)", - "outputDir": "$(Build.ArtifactStagingDirectory)", - "versioningScheme": "off", - "includeReferencedProjects": "false", - "versionEnvVar": "", - "requestedMajorVersion": "1", - "requestedMinorVersion": "0", - "requestedPatchVersion": "0", - "packTimezone": "utc", - "includeSymbols": "false", - "toolPackage": "false", - "buildProperties": "", - "basePath": "", - "verbosityPack": "Detailed", - "arguments": "" - } - }, - { - "environment": {}, - "enabled": true, - "continueOnError": false, - "alwaysRun": false, - "displayName": "PowerShell Script", - "timeoutInMinutes": 0, - "retryCountOnTaskFailure": 0, - "condition": "succeeded()", - "task": { - "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1", - "versionSpec": "2.*", - "definitionType": "task" - }, - "inputs": { - "targetType": "inline", - "filePath": "", - "arguments": "", - "script": "# Write your PowerShell commands here.\n\nWrite-Host \"Hello World\"\n", - "errorActionPreference": "stop", - "warningPreference": "default", - "informationPreference": "default", - "verbosePreference": "default", - "debugPreference": "default", - "failOnStderr": "false", - "showWarnings": "false", - "ignoreLASTEXITCODE": "false", - "pwsh": "false", - "workingDirectory": "", - "runScriptInSeparateScope": "false" - } - } - ], - "name": "Agent job 1", - "refName": "Job_1", - "condition": "succeeded()", - "target": { - "executionOptions": { - "type": 0 - }, - "allowScriptsAuthAccessOption": false, - "type": 1 - }, - "jobAuthorizationScope": 1 - } - ], - "target": { - "agentSpecification": { - "identifier": "windows-latest" - } - }, - "type": 1 - }, - "repository": { - "properties": { - "cleanOptions": "0", - "labelSources": "0", - "labelSourcesFormat": "$(build.buildNumber)", - "reportBuildStatus": "true", - "gitLfsSupport": "false", - "skipSyncSource": "false", - "checkoutNestedSubmodules": "false", - "fetchDepth": "0" - }, - "id": "", - "type": "TfsGit", - "name": "REPOTOREPLACE", - "url": "", - "defaultBranch": "refs/heads/main", - "clean": "false", - "checkoutSubmodules": false - }, - "processParameters": { - "inputs": [ - { - "aliases": [], - "options": {}, - "properties": {}, - "name": "solution", - "label": "Solution", - "defaultValue": "**\\*.sln", - "required": true, - "type": "filePath", - "helpMarkDown": "The path to the Visual Studio solution file or NuGet packages.config. Wildcards can be used. For example, `**\\\\*.sln` for all sln files in all sub folders." - } - ] - }, - "quality": 1, - "authoredBy": { - "displayName": "David Kalmin", - "url": "https://spsprodcus5.vssps.visualstudio.com/A8ceff4ff-6429-4de3-9c39-fd7f0b1fb05a/_apis/Identities/a886d3a4-5700-6920-a3e4-6dadf46e7614", - "_links": { - "avatar": { - "href": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" - } - }, - "id": "a886d3a4-5700-6920-a3e4-6dadf46e7614", - "uniqueName": "davidkalmin@microsoft.com", - "imageUrl": "https://dev.azure.com/microsoft-bootcamp/_apis/GraphProfile/MemberAvatars/aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0", - "descriptor": "aad.YTg4NmQzYTQtNTcwMC03OTIwLWEzZTQtNmRhZGY0NmU3NjE0" - }, - "drafts": [], - "queue": { - "_links": { - "self": { - "href": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126" - } - }, - "name": "Azure Pipelines", - "url": "https://dev.azure.com/microsoft-bootcamp/_apis/build/Queues/126", - "pool": { - "name": "Azure Pipelines", - "isHosted": true - } - }, - "id": 10, - "name": "valet-classic-test-import2", - "uri": "vstfs:///Build/Definition/10", - "path": "\\", - "type": 2, - "queueStatus": 0, - "revision": 1, - "createdDate": "2022-02-17T19:05:52.500Z" -} diff --git a/azure_devops/bootstrap/pipelines/readme.md b/azure_devops/bootstrap/pipelines/readme.md deleted file mode 100644 index 40258f9..0000000 --- a/azure_devops/bootstrap/pipelines/readme.md +++ /dev/null @@ -1,10 +0,0 @@ -# pipelines folder -This folder contains Azure DevOps pipelines that gets migrated to the Azure DevOps instance. - -### Note any file added to this folder or sub folders will get migrated to the Azure DevOps instance when the GitHub Action runs to create and bootstrap the Azure DevOps project - -## classic folder -The classic folder contains classic style Azure DevOps pipelines that are pure JSON files. - -## yml folder -The yml folder contains yml Azure DevOps pipelines. diff --git a/azure_devops/bootstrap/pipelines/yml/valet-custom-transformer-example.yml b/azure_devops/bootstrap/pipelines/yml/valet-custom-transformer-example.yml deleted file mode 100644 index 7d9ba2b..0000000 --- a/azure_devops/bootstrap/pipelines/yml/valet-custom-transformer-example.yml +++ /dev/null @@ -1,26 +0,0 @@ -variables: - - name: BuildParameters.RESTOREBUILDPROJECTS - value: "**/*.csproj" - - name: BUILDCONFIGURATION - value: Release -name: "custom-transformer-example" -jobs: - - job: Job_1 - displayName: Agent job 1 - pool: "mechamachine" - steps: - - checkout: self - - task: NodeTool@0 - displayName: Use Node 10.16.3 - inputs: - versionSpec: 10.16.3 - - task: DotNetCoreCLI@2 - displayName: Restore - inputs: - command: restore - projects: "$(BuildParameters.RESTOREBUILDPROJECTS)" - - task: DotNetCoreCLI@2 - displayName: Build - inputs: - projects: "$(BuildParameters.RESTOREBUILDPROJECTS)" - arguments: "--configuration $(BUILDCONFIGURATION)" diff --git a/azure_devops/bootstrap/pipelines/yml/valet-pipeline1.yml b/azure_devops/bootstrap/pipelines/yml/valet-pipeline1.yml deleted file mode 100644 index 9c86c9a..0000000 --- a/azure_devops/bootstrap/pipelines/yml/valet-pipeline1.yml +++ /dev/null @@ -1,19 +0,0 @@ -# Bootcap Starter pipeline -# Start with a minimal pipeline that you can customize to build and deploy your code. -# Add steps that build, run tests, deploy, and more: -# https://aka.ms/yaml - -trigger: -- main - -pool: - vmImage: windows-latest - -steps: -- script: echo Hello, I am pipeline 1! - displayName: 'Run a one-line script' - -- script: | - echo Add other tasks to build, test, and deploy your project. - echo See https://aka.ms/yaml - displayName: 'Run a multi-line script' diff --git a/azure_devops/bootstrap/pipelines/yml/valet-pipeline2.yml b/azure_devops/bootstrap/pipelines/yml/valet-pipeline2.yml deleted file mode 100644 index 6f9ba13..0000000 --- a/azure_devops/bootstrap/pipelines/yml/valet-pipeline2.yml +++ /dev/null @@ -1,18 +0,0 @@ -# Bootcap Starter pipeline -# Start with a minimal pipeline that you can customize to build and deploy your code. -# Add steps that build, run tests, deploy, and more: -# https://aka.ms/yaml - -trigger: - - main - -pool: mechamachine - -steps: - - script: echo Hello, I am pipeline 2! - displayName: "Run a one-line script" - - - script: | - echo Add other tasks to build, test, and deploy your project. - echo See https://aka.ms/yaml - displayName: "Run a multi-line script" diff --git a/azure_devops/bootstrap/setup b/azure_devops/bootstrap/setup index a5dde82..ab9b90b 100755 --- a/azure_devops/bootstrap/setup +++ b/azure_devops/bootstrap/setup @@ -1,15 +1,16 @@ #!/usr/bin/env ruby +require "date" require "json" require "net/http" +require "open3" require "optparse" require "pathname" -require "date" +require "tmpdir" options = { - code_assets_dir: "code", - pipeline_assets_dir: "pipelines", + assets_file: "azure_devops.tgz", root_dir: File.join(ENV["CODESPACE_VSCODE_FOLDER"], "azure_devops/bootstrap"), - forecast_source_file: File.join(".", "azure_devops/bootstrap/jobs.json") + forecast_source_file: "jobs.json" } OptionParser.new do |opt| @@ -72,38 +73,42 @@ def create_repository(options) repository = options[:project] access_token = options[:access_token] root_dir = options[:root_dir] - directories = [options[:code_assets_dir], options[:pipeline_assets_dir]] + assets_file = options[:assets_file] - puts "Creating repository #{repository}..." - uri = URI("https://dev.azure.com/#{organization}/#{project}/_apis/git/repositories/#{repository}/pushes?api-version=7.1-preview.2") - - root = Pathname.new(root_dir) - repository_to_create = { + Dir.mktmpdir do |tmp_dir| + puts "Extracting assets..." + _, _, st = Open3.capture3("tar", "-xzf", File.join(root_dir, assets_file), "-C", tmp_dir) + abort unless st.exitstatus == 0 + + uri = URI("https://dev.azure.com/#{organization}/#{project}/_apis/git/repositories/#{repository}/pushes?api-version=7.1-preview.2") + puts "Creating repository #{repository}..." + + root = Pathname.new(root_dir) + repository_to_create = { refUpdates: [{ name: "refs/heads/main", oldObjectId: "0000000000000000000000000000000000000000" }], commits: [{ comment: "Initial commit.", - changes: directories.map do |directory| - Dir[File.join(root_dir, directory, "**/*")].reject {|f| File.directory?(f) }.map do |entry| - { - changeType: "add", - item: { - path: File.join("/", Pathname.new(entry).relative_path_from(root).to_s) - }, - newContent: { - content: File.read(entry), - contentType: "rawText" - } + changes: Dir[File.join(tmp_dir, "**/*")].reject {|f| File.directory?(f) }.map do |entry| + { + changeType: "add", + item: { + path: File.join("/", Pathname.new(entry).relative_path_from(tmp_dir).to_s) + }, + newContent: { + content: File.read(entry), + contentType: "rawText" } - end + } end.flatten }] - } + } - post_request(uri, repository_to_create, access_token) do |response| - raise "Error creating repository (#{response.code}:#{response.message})" unless response.code.start_with?("20") + post_request(uri, repository_to_create, access_token) do |response| + raise "Error creating repository (#{response.code}:#{response.message})" unless response.code.start_with?("20") + end end end @@ -172,13 +177,15 @@ end def update_forecast_source_file(options) puts "Updating forecast data" - jobs_data = File.read(options[:forecast_source_file]) + root_dir = options[:root_dir] + jobs_data_file = options[:forecast_source_file] + jobs_data = File.read(File.join(root_dir, jobs_data_file)) today = Date.today.strftime("%Y-%m-%d") jobs_data.gsub!(/20[0-2][0-9]-[0-1][0-9]-[0-3][0-9]/, today) File.write(options[:forecast_source_file], jobs_data) end -create_project(options) +# create_project(options) repository = create_repository(options) create_yaml_pipelines(options, repository) create_classic_pipelines(options, repository) From 2ae5b183f6489bfccc6730fb62a8d9f976d30e8f Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 14 Sep 2022 11:28:36 -0700 Subject: [PATCH 55/69] reorder azdo labs --- azure_devops/2-audit.md | 2 +- azure_devops/{6-forecast.md => 3-forecast.md} | 2 +- azure_devops/{3-dry-run.md => 4-dry-run.md} | 2 +- .../{4-custom-transformers.md => 5-custom-transformers.md} | 2 +- azure_devops/{5-migrate.md => 6-migrate.md} | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename azure_devops/{6-forecast.md => 3-forecast.md} (98%) rename azure_devops/{3-dry-run.md => 4-dry-run.md} (97%) rename azure_devops/{4-custom-transformers.md => 5-custom-transformers.md} (99%) rename azure_devops/{5-migrate.md => 6-migrate.md} (97%) diff --git a/azure_devops/2-audit.md b/azure_devops/2-audit.md index fd1147a..d9d58f9 100644 --- a/azure_devops/2-audit.md +++ b/azure_devops/2-audit.md @@ -172,4 +172,4 @@ Each pipeline will have a variety of files written that include: ### Next lab -[Perform a dry-run migration of an Azure DevOps pipeline](3-dry-run.md) +[Forecast potential build runner usage](3-forecast.md) diff --git a/azure_devops/6-forecast.md b/azure_devops/3-forecast.md similarity index 98% rename from azure_devops/6-forecast.md rename to azure_devops/3-forecast.md index 48e6d84..cb188a9 100644 --- a/azure_devops/6-forecast.md +++ b/azure_devops/3-forecast.md @@ -101,4 +101,4 @@ Additionally, these metrics are defined for each queue of runners defined in Azu ## Next steps -This concludes all labs for migrating Azure DevOps pipelines to Actions with Valet! +[Perform a dry-run migration of an Azure DevOps pipeline](4-dry-run.md) diff --git a/azure_devops/3-dry-run.md b/azure_devops/4-dry-run.md similarity index 97% rename from azure_devops/3-dry-run.md rename to azure_devops/4-dry-run.md index ac60718..dc15aac 100644 --- a/azure_devops/3-dry-run.md +++ b/azure_devops/4-dry-run.md @@ -90,4 +90,4 @@ Despite these two pipelines using different syntax they will function equivalent ## Next lab -[Use custom transformers to customize Valet's behavior](./4-custom-transformers.md) +[Use custom transformers to customize Valet's behavior](./5-custom-transformers.md) diff --git a/azure_devops/4-custom-transformers.md b/azure_devops/5-custom-transformers.md similarity index 99% rename from azure_devops/4-custom-transformers.md rename to azure_devops/5-custom-transformers.md index cec9e8a..c46a28b 100644 --- a/azure_devops/4-custom-transformers.md +++ b/azure_devops/5-custom-transformers.md @@ -232,4 +232,4 @@ That's it! At this point you have overridden Valet's default behavior by customi ## Next lab -[Perform a production migration of an Azure DevOps pipeline](5-migrate.md) +[Perform a production migration of an Azure DevOps pipeline](6-migrate.md) diff --git a/azure_devops/5-migrate.md b/azure_devops/6-migrate.md similarity index 97% rename from azure_devops/5-migrate.md rename to azure_devops/6-migrate.md index 43e17a1..f735447 100644 --- a/azure_devops/5-migrate.md +++ b/azure_devops/6-migrate.md @@ -57,4 +57,4 @@ At this point, the migration has completed and you have successfully migrated an ### Next lab -[Forecast potential build runner usage](6-forecast.md) +This concludes all labs for migrating Azure DevOps pipelines to Actions with Valet! From 301b0b70c6aeddc956e76219a0641b47dfa9296b Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 14 Sep 2022 11:29:53 -0700 Subject: [PATCH 56/69] Reorder gitlab labs --- gitlab/2-audit.md | 2 +- gitlab/{6-forecast.md => 3-forecast.md} | 2 +- gitlab/{3-dry-run.md => 4-dry-run.md} | 2 +- gitlab/{4-custom-transformers.md => 5-custom-transformers.md} | 2 +- gitlab/{5-migrate.md => 6-migrate.md} | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename gitlab/{6-forecast.md => 3-forecast.md} (98%) rename gitlab/{3-dry-run.md => 4-dry-run.md} (99%) rename gitlab/{4-custom-transformers.md => 5-custom-transformers.md} (98%) rename gitlab/{5-migrate.md => 6-migrate.md} (96%) diff --git a/gitlab/2-audit.md b/gitlab/2-audit.md index efe8d97..657726b 100644 --- a/gitlab/2-audit.md +++ b/gitlab/2-audit.md @@ -180,4 +180,4 @@ Each pipeline will have a variety of files written that include: ### Next lab -[Perform a dry-run migration of a GitLab pipeline](3-dry-run.md) +[Forecast potential build runner usage](3-forecast.md) diff --git a/gitlab/6-forecast.md b/gitlab/3-forecast.md similarity index 98% rename from gitlab/6-forecast.md rename to gitlab/3-forecast.md index 897270d..43c94d5 100644 --- a/gitlab/6-forecast.md +++ b/gitlab/3-forecast.md @@ -99,4 +99,4 @@ You can now inspect the output of the command to see a forecast report using all ## Next steps -This concludes all labs for migrating GitLab pipelines to Actions with Valet! +[Perform a dry-run migration of a GitLab pipeline](4-dry-run.md) diff --git a/gitlab/3-dry-run.md b/gitlab/4-dry-run.md similarity index 99% rename from gitlab/3-dry-run.md rename to gitlab/4-dry-run.md index 31f9932..dd76243 100644 --- a/gitlab/3-dry-run.md +++ b/gitlab/4-dry-run.md @@ -251,4 +251,4 @@ As an added challenge, try constructing and running the `dry-run` command yourse ## Next lab -[Use custom transformers to customize Valet's behavior](./4-custom-transformers.md) +[Use custom transformers to customize Valet's behavior](./5-custom-transformers.md) diff --git a/gitlab/4-custom-transformers.md b/gitlab/5-custom-transformers.md similarity index 98% rename from gitlab/4-custom-transformers.md rename to gitlab/5-custom-transformers.md index 9b2dbfa..0333f19 100644 --- a/gitlab/4-custom-transformers.md +++ b/gitlab/5-custom-transformers.md @@ -163,4 +163,4 @@ That's it! Congratulations, you have overridden Valet's default behavior by cust ## Next lab -[Perform a production migration of a GitLab pipeline](5-migrate.md) \ No newline at end of file +[Perform a production migration of a GitLab pipeline](6-migrate.md) diff --git a/gitlab/5-migrate.md b/gitlab/6-migrate.md similarity index 96% rename from gitlab/5-migrate.md rename to gitlab/6-migrate.md index 3c08295..0e4543d 100644 --- a/gitlab/5-migrate.md +++ b/gitlab/6-migrate.md @@ -50,4 +50,4 @@ At this point, the migration has completed and you have successfully migrated a ### Next Lab -[Forecast potential build runner usage](6-forecast.md) +This concludes all labs for migrating GitLab pipelines to Actions with Valet! From 38073eea5446ba2d1edcc841a7480c4f21cdc906 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 14 Sep 2022 12:31:02 -0700 Subject: [PATCH 57/69] Reorder jenkins labs --- jenkins/2-audit.md | 2 +- jenkins/{6-forecast.md => 3-forecast.md} | 2 +- jenkins/{3-dry-run.md => 4-dry-run.md} | 2 +- jenkins/{4-custom-transformers.md => 5-custom-transformers.md} | 2 +- jenkins/{5-migrate.md => 6-migrate.md} | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename jenkins/{6-forecast.md => 3-forecast.md} (98%) rename jenkins/{3-dry-run.md => 4-dry-run.md} (98%) rename jenkins/{4-custom-transformers.md => 5-custom-transformers.md} (99%) rename jenkins/{5-migrate.md => 6-migrate.md} (97%) diff --git a/jenkins/2-audit.md b/jenkins/2-audit.md index c3e9a6c..e2c8b35 100644 --- a/jenkins/2-audit.md +++ b/jenkins/2-audit.md @@ -108,4 +108,4 @@ Each pipeline will have a variety of files written that include: ## Next lab -[Perform a dry-run migration of a Jenkins pipeline](3-dry-run.md) +[Forecast potential build runner usage](3-forecast.md) diff --git a/jenkins/6-forecast.md b/jenkins/3-forecast.md similarity index 98% rename from jenkins/6-forecast.md rename to jenkins/3-forecast.md index a6fca52..7748a1f 100644 --- a/jenkins/6-forecast.md +++ b/jenkins/3-forecast.md @@ -101,4 +101,4 @@ You can now inspect the output of the command to see a forecast report using all ## Next steps -This concludes all labs for migrating Jenkins pipelines to Actions with Valet! +[Perform a dry-run migration of a Jenkins pipeline](4-dry-run.md) diff --git a/jenkins/3-dry-run.md b/jenkins/4-dry-run.md similarity index 98% rename from jenkins/3-dry-run.md rename to jenkins/4-dry-run.md index 19f5145..e0cd0d8 100644 --- a/jenkins/3-dry-run.md +++ b/jenkins/4-dry-run.md @@ -141,4 +141,4 @@ Try running the `dry-run` command for different pipelines in the Jenkins server. ## Next lab -[Use custom transformers to customize Valet's behavior](4-custom-transformers.md) +[Use custom transformers to customize Valet's behavior](5-custom-transformers.md) diff --git a/jenkins/4-custom-transformers.md b/jenkins/5-custom-transformers.md similarity index 99% rename from jenkins/4-custom-transformers.md rename to jenkins/5-custom-transformers.md index e345308..129509f 100644 --- a/jenkins/4-custom-transformers.md +++ b/jenkins/5-custom-transformers.md @@ -290,4 +290,4 @@ That's it! Congratulations, you have overridden Valet's default behavior by cust ## Next lab -[Perform a production migration of a Jenkins pipeline](5-migrate.md) +[Perform a production migration of a Jenkins pipeline](6-migrate.md) diff --git a/jenkins/5-migrate.md b/jenkins/6-migrate.md similarity index 97% rename from jenkins/5-migrate.md rename to jenkins/6-migrate.md index 66a8f11..325a620 100644 --- a/jenkins/5-migrate.md +++ b/jenkins/6-migrate.md @@ -52,4 +52,4 @@ At this point, the migration has completed and you have successfully migrated a ### Next lab -[Forecast potential build runner usage](6-forecast.md) +This concludes all labs for migrating Jenkins pipelines to Actions with Valet! From 5d1337db7d9b423355a95dbdbfac8419b9d6fa60 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Wed, 14 Sep 2022 13:25:27 -0700 Subject: [PATCH 58/69] More edits --- azure_devops/bootstrap/azure_devops.tgz | Bin 4775 -> 9669 bytes azure_devops/bootstrap/setup | 87 ++++++++++++------------ 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/azure_devops/bootstrap/azure_devops.tgz b/azure_devops/bootstrap/azure_devops.tgz index 3c401f9143cfb5dea1f5fa00ba925fb17f17de50..cdc27b2ec83f784e87455d87e8f9355c3f023692 100644 GIT binary patch literal 9669 zcmV;$B|6$4iwFRzI3i;J1MOYucH_pC_TT6!Fm%pIx2FNs4nST`)LNX*xRuyzW_CNXP7a_!z z($arb{+BS3|1B|CZGo zM7;y6M<|VH9D25r%C}_<{}BmMc0Wj{&m+nujeAe>8k6{+(>Tq3&@}~fz2bgTWg zaQL6&^1qjb5z?%suyPpm3o@pvkqiL)%T-mxfuN3XIbKzjAWa7sqgIl9uPPnI*hMxN zkMePWS1(_BIvT~3A4Wmm&hsFAIv&3*>y6VNqBspFgKMmd1&)Ks`@yI;U;AP*o?h#x zaT4Gd!qZ=$+$OfX30vu{!Y6_hA9d8Ua=xm3eVA)d6FUV)LWfiZaxIiRE(X31NmZRFTy2r6IsMNeldb zF8~e$?n~lH8^%7cB~yKyg|TP%qtKIy@|o+3W`KPumI0Pj(l&rS>Nf$L1cRZ8XogYu z4k&j#YKU%L1JEVJSM|YfkH+r^o(gi@Cz zwiF4oB~Q4`NEF$OC7~N7iIj=I3g-riEvfL^aVCz}1!u+%m^h%oZqyKGtl^;o<$0WX zt}?(Gs&INhnL|z3Iq!gZPQHk*me}0iGE;W}n>KND#^{QCymsSy%;NgUMl{oaG&$Rv>Fafe|&~WIZEbfd5+6|n;@%3kk^>hq{%5}F0+Yy zKw!c3jKnn*X2S856pWflYXr;%9^M3Fph!66x2c9LsMrO@tktQF7~kA&f+H$XyY);> z>AZ%3P9;;mXNt6TikZ7UE4qC08&<;_y<}{S^Q03?lLHCsrsq&&xS@vBK4>YaYi49Y z6@^9?Q6@<14g_D)(U*|+*uzD-(M?7_CS&JFGlx@Ckcsbb;ktsGf()=Rhj3$_u1HdA zc={nD-RL`^?YbE8x_G`_WH%1#oQcz07Z%W;M+i(yv!JAemE8yRe1o85PEw1$y={z{ zD-#+~-=_V@v!(Q@-6yJV6E_l`9|t~_!77X!y(N^bz!)EO@r>bUQUriX)6j;lAzX(N zMg%j_xUmXDZH!PufHg_1McMZJ?IIi|0VA>R*~<4_TQVNnf^lvqByc%lq0jte1;V`1 zY^JMLW_;Ai_sL=8F%%_?mu0Bo9}wzLC0s#_B(|<1VWFkQ-Vvzcq2(sYy0v-BT382e z=8e|#9bnBiz}iJ)7^X23W{%GsIByd_cS)DKPUGG-)}HSNI1;vyoB-BdU{gTf=B|ub zKMX_HUy*p=^G1!Ew64xB>zG->=mD1poGxj&s}av@D97cVWWtEMp^9E|7vXC`yrheZ zHHcTqRu2&IM$MbFMm7-fP62AvbO}o5+Va?{d_!T^5mdO!NF~dwNa08$_h(5>O?2El zh&!mh)KHG+;TmEh#<7aR_|@WC(W04^bg|Wm z2;5td4|rE#`zllfM!^cA#+d&9S9R&$jeHE}iQ>(yk)V)co&*WCX=BQ5-)0hU< z5b!@od0f>p3)-<37zH8RIJZbwVH^~LcJ++d9h6*%54d1xa~>5Zz~yb8ioCktz5EMqw#fj zh;P8+9PKG7eCfJIu9O@;4r=)(Jf73FCPj4Xh<8}QS(6Dy{MLl;TS1(FN$fB~unAhi zgc4@tAjKLKvy&E+*V?hpDO!{7&D|}#Ryru;tSQDt{MOuWmv-H_A<^{=(z%u|uo~;U zunQ`btEAcDEwuw3s5H(zsYqIDZ*N;Q?*ev{^+o(Os=4TFec`(5If@uA-gyn~0(`J` zQ_su<6FO`~3{9|{q_tUP+XlOf6mPP_h}W8HxOo7(q|09`%OCK%-DHdruid%Q6>*B{&;enNM@%&}wB0b35a1TdY^R5=0?Hln zjRm@{0?M7w+BG#^?QeT{&T`shjS;Ukb94pbrs2&TZZND2d}(=M=#O!tq%zr;SHOl@ zlVW%fSX(jG_{2|p$1a`gfAH}S+esgQaYYVUP?uh z+Y-cf)x!n3(dKg3tk#VnZy>wHfj|f42C`e%kRa_b-^?=#WkVHTt7hh2)0{3?;MeMB zTi(Of!IMTCEibn<3CV5VtG7XRp_lK5-5|Tr$3>J1j}u~^N6LibE7PUApo=YKRNS|n znO*q1Dbz{aHFkE#otbFoFiZ|rW=0o3pgyQruv$yQxEEC6WJ$$px4bZ!++l4@Ew&4D zhj<8Ww6NXwi1zKk3~H7#-s7QbNOWyc&m%^AJaXj7(ngYYu$h)Otevm7?kw#h#+$a{ z-WlT3GzTrOfzC|nxn`<(0UudfF4iFq62V*JMcX>!9Reb>(Xn!8h?|DM@*0dd6y~pQ z4mhAk&68FtvhI7#v&-7u=vQ&qSlPD#I62@T)TJ5LI#i(~EZ?4C#yAEak(A#Q^>3`SvWWM#_(!u0V{CWerMPPXAYE)O+!w14obi1l>l)9%0StVJsiJ1qwaky$Fy2#NkR+G(WiKQBaMOrM zvp;2x)2t)XoZ_yXMct5T6bcGyX8EzE^s$($0cfw z`>Z3}OrKY!j57{(4Ll%4aV3o6*t&*LOWIW{+BsQn3(#uI`3kOzBT5OgflVpsVp7;H z1Jz6=#P9b*KOrGm1$3j=Os&aH=?b(!!xf?SpNw67EK~*`2^m4fO83uwV`qgt|s& zWmK>cqbR2C0Omy-H*Y&f!4IVZTN*$OBQ&L{9Y!*?{V4K<>XU%^tIn$%GivTJ`*yILNuzVD{aE16mNN`0_4J^csoYrDbGVd-hl*kq zzv<-CR-AK^*6!_5TXvJEKuNz3!a0xuFf%$qiA)mPr|?HaQ~}(pz;5u1QL+l_*I*+D zX>3z#-#W{Ji`eSwF3}dOW9a^-I$MnUK1@f$oFhyTq?>Hv(^Wv<l`3uS~59bKs+nFl(2zBMeSRDGGbA#7j`TjW+Lb zRJ9~5^u8Iw1vP7S_Hec343sViH~Prbs(ev=)CpmR8=U2wvb!4LyfALVB}^J+o?sOp zg}ZC+8!Jg-_ZZ=up9k*w&2F*Q$d%%a2OVvC9yoO!&oy+IOf_r|mYpgZ6q43a{PE76N(K9fpu0f7bUKn@Ca*l_Xn=rMH3$sv$ zS)wI1Udur^YRjru7l<3(VeOw{L5REA(>_LuiJ{!i3wwA#9dvEv<@Sru>@4o?ZN)h! zNv!^i!`5-`BDWj;VzPB7M`xU?k0wZi)c)cV4$={z;~MR+E+n?=P~#o-Gm2Ipm9ce+ z-49~0o?~v)I0$VSC%zqriL^sJJvk0t-d`2W@cc&im~72DP|WLgvOn++rA;Y2Z9EM% z7pf>wHSq%!+Xnkvsl zajBHbD0roC7mmblGHmc2o`R%xLFtDKc4OXH``367?3@_;W+P}nu7~lLve;8Koq4UWMW3IDV@A90pa#?a74y`RlA^_p{J$xz8+~G;HDZZacQc~#d~S?08~HwU zVSO?rCtypMfz3QjNHIDcp`u2$C*gwI$Z<9%$zA= zRublSlD-z@GumzRi}5w=+<1_UF+1m+n>gQ|t~9HUpUJ z{dlfq)aXkc1!Q7_uOH4RT6g%^wo&fD$EwjS##XsL@lhv~wZXH=XXdd6*E?i9*QaLb z`??AM=NZdvtfCKDSyUO8vEK6jx-J~u=ob6(t}(X8)7|kDvcmZx9B%3wE0PZw7)lImXcOO9?k)k1anakgHv2$0 za^30fTX&aq5aNvvvX$RB#YY{NYNDe{(nNlH`t&gg0KiIZ1an>mPk}dErE_A|p834( zRa!ryJ=^C7!kP#)W}nU2SIWS zUP;5RbGZ8R#?s;DTd;I5_z92}oVRUNg)#Sivpj5KzCTI*Kqc>5odza*!7sr5)Ps} z2!$Q8#Iu70mhePHl8Tk0yU{^*2Z-xarHGlQo9K=39tE@CEG}Il#|>TGL~o{U@rrF5 z;SOFg)#w$w6NIVnnCza_avl^w5I>TbeMC!Fk-j4~;%2=Kd+}45_YP|*`f(V@z;^oz z6)}(4Q4|r|3*tofeX0amX<;>b#qI`c&+(P1O`S`8{5Gn~l-b_896sqV<74IWURd3u zbMLTr!#)#4P@8imZQ1t%JLIr*doJaaQWB{CDy(Irf9!6sc1`(OpWG=Z@EkSroaB(H zrO%1Cqs;U+?0dgT-`v2G&0ezA+bCJLZIrHdQ}||{6J1y`N4io9VY)suG`*F1?5ZTG zHFmXSr-`dGK#8&wm+CWWfRTfM*a;CrsX(zXS`~_x&AzcUn>D%~asd{TkDvVZjJ=_* z&i?Qm7e9$-ta%gt;d1jN!Mqo`blUs9~Ick{dos;C< zGcA1Y`@K(g*XEbAe_f8_emF$n!~NUtgAf9$g{A+h{4cOh{PvRiDik++ImivJ5P(rN6--RCw z_`^#4iA8Rij>hX>9RE+P3V$mZ52JXpcYZl2|80fiQ5FnFsg=vz$Fw{1}(EL z;w-hU1{ae6C3`l8yYYMlXd%OlEN5@;(@#IOUW~KY3PvBSWH5w(L{V97*70~^rPF@# zE4AJahC}SftQ+h7WjxZ4zaC_Nf@TgwTv#kvNK&jA!c5l`L{@)1&eCiWTranFJsJNP zhZ&M=6{2xAMDfC{*+`Z5)9k}=vBmju3*gB$KK}FB%NKeqQawP{hpS<|r`gY0FL+qyf&BrLXn;Pzmsbb|98PK&g>9IWqf4=UyRaZJh_S|cKlOtbv=w7 zD70xGYvezE@^c=42F5Ah$^W~!-UX9E&y zd{M7e90a(Rm+h^dbG^ME$Nhpp_}78;=W+iBs+)=i>Gd%9@Ip7CZ3--5RS;gnB=6}5V1Zog_VBW;@G=hHj;GmymBz!Qx}62-+XGmuqWByd`XebGEOh#9 z8tXC^9w?|BUX>b*uBTbmi+*nyOIU`^uH*1vp?KNb@i==CXGh~neDuw;KeFa7UxQ%^ zC0cq4$5&Udx*b@Pg`!rus--Y6zkg%`^yA)5Xw)sYPcz#-_rXXsP{ z6|=;C@6-Gi=-%0-6@cbF8e9d#>Upliei%=!Fc?|6^d9^iqkgU3VOqV8;_Kn~1C~PF zH39?RQ|mB_atWNbpbI}i-Q3DRTBT2lN>6kHS0H8%pweZQfymz958ejO6-?FOYPh$T zO$HYi@g!dvu0Su|+skEsUF7fWRpQ>ZawpS)1<%LUpW@+g{KR@@1y{4TV*j?hu=HL7 zae*}+#kMY!x6<32Yx2Jf`J|i1cN~L7G0`$Jtp??Ze#a+EV^fGjr{2a{95=r9D)O$T z!)!25;ClSq`Jdhq|I20m-|2sMa{V^=e~$ZsLEc?Gy9zFVHQoiT(dzqVqKQe+wHh|HYgi)A6X&9Bb!)s+3?0 z{7y#wnXdiMQNEJM9`gtj5ZbF#@aep23^1$*GhFO^HcLLMCtx#Z+hSNp3KSzQKYE~hNpvg80jj%{95(3SL?Ci6_a3?n!aP;M}6)kzU?Pb zXbabacO>vrz+7fDmL8|d>>b~aCvTr+@zwcfHYd5sUUl6IKybc)35M-t5XHqbsSk7B@GB6% zXwo;fiGJYldb&ZI=?4(wS56f7rx%S)Y9vh>EW^Y-5Wd&(Bpc*olHbdM3(XSwp#1f*YoF5^!WFWCh@xiXYyDR)BADUKb&Tl zJ;rC@Sc6W>r{{yKcs$LXjh+ui(@YbS=fvQ{BfY1&p@=MBA&k=+rq`DM)r_gF`mEFI zVC~WTC@a})9~V$pquO)tw_z7Y`(|Zuesju`_#&(RpBgq022$$qdukm$d0(6 zwjhyj2T7RNea<2o#wuaFzjk7=k3X>rKV-giGz~6_qVaHA4#@8x)x3b^gT=AII}3V(FpOca}>gFusMq6pJkv7>vTY{McsaRfSY3;Pqv-{DJ+Z@AL3Y{PTKp4` z4$JV#D7qdGMtW2lijBrc0kG5ZS~bIAkRlV{a14j>@Kr9{2cwIYI@dw?7ObB1crbyn z7*9SlcMj8_KTZePhuXLt$65X0$+@8pCgCN#F}~QVX?oe4xon+7STd6!%80n>H<@Kruw z&*9}^-40e`uQiCGG){rxAk3j%fyCl8SOY{ktfnXcA-#pD%d)htD|6@LvQB};oT}Hr zU?A^+rvV`&v{#B6D0K$&JQuR#Bw5LRuj3@1#Gv0quZqAx%jg!3pN!u9HJCIHZIQkg zN6&*F$CJP26|iW-x;8627|oR>EoA|U@Up!uvLkA1KaWTH{ij*D^8L^9x!>~A*?2rG zW?)Mxt(Cs2E3*xQ(+9n9wFsNd%3{i_o|RP?Mz{3aPz7F%-^Y`)%Xm1n&T=p6{Z|KK zMtPFp0b8*8gEi_?+anD32*&}BU9i5BhIxPY>Ock)CeCK^8{JL~(t9v$nV$1=Zdp*~ zn8CA8t?wp-EY6*4HB<|oB(*L<;y7ks(#!Gt@A8*ylV5`i5U%kzhiB&}|M~3v=;iTAnIFD@ zD0BwNAY61cX^{rc;aQ$ZKkvYAbmi5_%{@1h_!?KRd}fs1kU0-eNlZA5gWAZ}mhs*& z=*Pn|5FTON_Neas(W|dh^9;@K)ig~qtw@3XlugqmZL@bV$i7L^v*|UKZ17{HZwJ?B zA4Xx`b3=hLk>!O}QO>6Qt8p~V{d|i>lNj`uLn&?y!z(w=%jo&oeb+O6e8xScIW2CVCBQbz)e|Bqp?VA^;UE5qf6}7+;=#o zXU5|U_i8n2@PY-yLFpo^^ZCpjUe`yOe1yf5ax5xSw)RZV6?}Ns@UR$|zm|^6&pvze z1`MI$XkM=Ta|)7fSqZ9;saDL|Gg#}cp9hn-$K&^UNHLN08p@Q3vwt0=(*SgwY#I&5 zR!MoDkvpCgj<(XGbaHFLvA%=p8wL|tJu&FlkF9AMM~-Cy7g$BM))VW$@HL7T`7a9= zGz%n<1wZl}S8FiJZ_M(0oq5Loz5@22KqIK4z0yY-Xvq^tPivgLpuimm?*@_eAHncy zHnEENSO(M5Yc!goaGFZzT?)UPcX~8ZJs9w^SNn%v7$=EH5?cx8+X6of;fLI}lgLd- zpC)}GgZ&?Z>p{BzOiL`B82f?esfY){mM$T-@)@x~0~5B2f+!Ixb``C55LO=LnP_|m zR_J7299{yi)M=06cTRwbznaXeK{y$w<0P~DI*faDUC{LPB)Gl=LjXs7|9OnU=uo!~ zGzO9LxAP0};_5Fy|Ly!Q*^Be={qrNjU!FgE|IK$NKmQ%?UA?~i``3RXFRs4jFMd2B z&4Raxg>3N7)6oD7s1m9Op?a&4`eXGb_+Dl40Y-7Zod<7A15k;wT*J)cFgG2_d~!#V zAjxVW1-%h$Hm{fG2c{?9%Iwff)c#+vzjU86)eLW??=0-MYG$gNc3rfFq5Jx~ws($m zBh9yx^%?^@`I%gK?4)dJF0O5(K4A~8aIMX^)WZu6bg?u`@P+pEV!eM{nLztAp9a0_ z!a8~LCjVW?VKzgtTH;Bekbr>6HJx0Jf#r$@az-jNJ9SJ+xzt+ zCoZmy|I;nS|9AO6cXI9G|GW6VwTu7n;{W&GGrNob*M?>n|KG*`ck%yS{J&mj7yqw; zzKj3w;{Ut&|1SQ&i~sN9|GW7A49{Ks-^6&S{=JL;FSNId|L@}embHuj@8bWv`2Q~c z-`mCick%xRAOENS%JF|ZmSGXNb+|scMr>8}kL&)Bz3w5fe zYA=6~-!E@}2@f3Na6+kYD3Q?jXmB;XT2YojSwR@}9lBRIh9C8QVN{Y6&bjTK9v|6) z9fE2mTw&8g?n`wn)bWY;Yws~M&`T#_?@9INm!}LK^TR`19CB$30{`((d{FPalT-hY zpD1yB{A+LTWK_DLYrUQxo)B?zL~J1b)TZ>9+fPr$Q=5<@B2HcZ}|4zpH;#UVEU4dDyJtwsHx)jqeiMlPAJvhl(HhoVll`-YS|l7zu4YKbiggg$wUc zvXdj*B|_Qam>$}mcl^|r@+o2Rh&_F(R`z>?u{f{w|E7L(?nixKj!%wV#A3uMFf^#_fLbU`l%1H{L(r-{O0Uree1=rw~Q+&Xtkcqrn)mX-VS`FHn&F`Hg;QddFmGFg2p=2wJ_V~s9WZQ8#X$lvU8J*$lgkWw@Kdu z!ne|3D}6?icoV+8NrNr(aFgcN^6jRL-4B(MUOMc*W|*?!0HStFZsUO8IE+pPTr9 zB;EOc?&PZBU)o_?{QeV_u1mE4N5~!icX2i0zu=|l+{YUKA7O;e^FQ3!`Ty?b`l49> zt+VLum%Yjp=)5>Nci>j^Q}UJLcnjHHtIokT3QZ z?_>S_g$DNY9qjk3-9o+9YYqS3N+0X^pG�{=1y*&VRm>>;L}ef2X*uz&g{L>OSAo zpW{idgD|$rd64eqQCXceALbu8s~+knvxsz2ravAJ@dWg;)T1<;U@!VxZ;z|e^OG4XAXW@+#7ToJq`aWsH$-J_+Q%CCPZeE=|1w6&ZvX$CTz8=V<;9<+diP3y7=NYZ z^B4QIJB>ObR)Qs|-e<7^rrIrJJ1S^I07`e`~EWVM=1 zZ-+Il=;U9kp35j)XpHy1Di)_Nin@ns8fWQOP!)HVe4c+O{-SPGRc81Mr H04@OlzaE0# literal 4775 zcmV;Y5?JjYiwFQB93o=?1MMBzcH1_#uhmyzn4VK7V^Z8DIm@YRNvS)D?OIAZZQav> zNYG+Tkt!FvPNrWr5A#X$3v&UG6e&@Q9Y<+rh?5hW#Ki@0H{1o1rRHZJy~(oNG7Q9i zn*67%>ilQgkfLjftSd%KZXsDwWkvf886SUXpM91@F%DrVB%Wa3jaI?|nB%O$lkOw` z`6p>o(+X_zafRRx{8vrR|CXxM{NF{BnlpDsJl7}DM-zhW`7fKMsRI9XS+4beC#}eT z%fnIRS`RJb$vDeTkx>Jf5S9BL-GT!qq6;< z^Zyab`H!5yvq{((P2B8vWCebVT|YwIcS%T4k6fS5qQVd$T8u799HFUu8RD4OC=TE) zDGvY)G4?GYH5!i|JwhizOc3^Ok>h&si*0Aa<`V}Yijr~q6rmf}^XNR=O@nSG#An?v z-S}%j)3stZ@KKn+PGFz~lFn9Oqj3<#Q5@pgGPYS5yd_plmyA-=I42QVcr~X~_CAVl zy+w>=x?$*<(e7`CrzeaS5hD<~oqENY=8yAP=(}p%QsXZCFX}(w{3t%aJL$ z+9Ln2u}5Oj0;&X45%j{3oFJT%P$a+M>C7V%0Nr(t4fbEr45iF}Rcq;5ZU1-Cu5sw% zF<73120|k8@su2(!^HLMGaSN04AxgV?+-_(=l#Ps$FF*4=cnKFk48fPM+l@P0eIob zljal2im1gDig@UNqtlbY@yj>o-O=&sNpaLU@d%DcgTo4|Wlm_k4aVsL;kN_yO)&mN zVW@03ntAy4grVqO5ncd%0~8U@ z$zR7fx;lWf$|fT~^p%`;EKK?)A`Av8vZR=jmP5JzEQ#}3*uH_5a10G+#5!02&t~fd z@d=5Kf{+}&I{r$np7NXkr9!f1CM%du;dDDd;Q}biPPGUK^TpmajD9TKXN?T=nibxE z8MNW>GMNIi>2OhmL(y?B6YvY@ArI)5#1003YDN2lwrcyIy;JXF?w8s||6el~?7ysO zwg119_6Qw<2W)}=I|Mp__T`Rb;}L%azIQx97(8#^onkNV=RWLhkRS{Dh+A*>9ijg9 znCdfguWd5(f?EnjeODU-fJdln+uQc{AX&P7;3u503wQz*~};>%0AoU{t|6cb0`&Y3<;^+ z_NwJg6EAkl3*5~A_4=>uNdJvx{jdGMowWZA{V!=hD9H8nc#1DUHEvwr4sIgR!xVRJ z3bru>3N-{JJ^QlK41C#WEE<6iHvtlj-PoMkwYH7>m-LKnXAXQE*Ov zO;|8Tfhafbym9#dXF5j6WBz<40*k!UcDbA3G?D^CJ2E%!C3W06t+9VZ| zBAGejGcdn2q_4zD^T5_DxdYDV7R>lmvdK8PtVGE;xedZbic|pOJ0oH2a+>gWF}`Ff z!HM<@*vPBGGqdF<$#hJ@0c;J&0t;nrIA{)Tp}l@>+mFB43(56?6h3B)5#9#lZW2#| z(0#{fJhTGFbS3K@xl+DX&Yusm|=_rs8hY)QFtzTDv32u`mR{e@GG5|?FK zl9wb#x}-~rumBw|6GmPD2}vB@9tDXXpZZkK2H5qIkW@gz2JB4vg($HsLTqC1JzkoW zYU{xQ>2fQfTBf0NOe`9@V~aYLRk1TBZPD)7N?U7APas$j9*q@cY>T$0 zE21vj9T7X0BaSuIHY{Q~sy5yzSn9_YtTYeFkB%zhQd1OoNk)(__6k|RtYeWjbPSwB zR(u-r6N{0Oy;+8IfWB$Il!7e-xW45jHenKQ8eUeMt|_3OT+*y3o$w6DlWJ__H&{9x z!+qbL1+LGiQUT@%M;O#;`K+4r!HuXAP;z)4@y@t$cm2yXV`kX8f~Y6zxgpRZ2yd$= z2Qe52ksIF@=+YxGh%BkFMiIfGHGv(|jh!XYM3|>+r7j$q4z^+l6fa?I`NWT#tRmni zv#ZOef7uc`x}A;#FXE%B=notk06R0m1oARkS2O)A8GCNDf=x5tdBzF$8a5B-HeStp z=0T*;R0KTN;;dc4iA6Ekz=({j+j0RGA}my0maTQsnHvS!n3NYKSFb|Bz}|sQ1BbTa z_DWL&P(zS&Ze#<;S*d>K#33O8|HeK`3j=GYn3_o&I16q_IGhmALqncL{o}g>L{&7$ksT32ZyJqu6tOL< zwrHpXYorCyw^JeayLSg-5Ev5A?Ke$3RakG=TO*!jnOioLoM+JY2z?*AG2zLz0#{R? zBtjFgIMRiG;WIe#>mZ8Jg}`!w==&h_>4^&J*WE+Jnzf~zap5}L)#Tf#aZwWt0twqeI>OinZjZocQ6TxY-BOE9kF zRd+b*|NVG$blU5$^JH%Lfw-cZ=1htQ(26r4@wo;c`$ICr^x9Y!aBmD=^51_hWLf;w zL=^5B6q7JO)y#;n3kt=)E%ZFqjs?8|SAtl~4L;42bPFal=K3TT*Iy(C_g*+DBAS2b zTGW^1_^OOzhEZu$;9H%|ld z|0zzQC2v!>bmLb}G)!g`vLcTaUAeR2t#9#}D*&>KEGNuG87AXtU?)7!w+QMG@Lzgl z#?7oOlnBaC6`@RCVdO+F-ONtp%5dI4JEfO3&R%to`dMcZdPNMWi8*BHTpkSOIb2$} z$>10_78jfEs0H=J$K0vSR<7Gxk?lBe8fjM>k2! zRP=07c}96|8m}P=4a??m0=iOMyG^boOfUYjWlmiy45Gk^#W5@6PG{+wUWRx!fk1## zy!o0?W7K8XVU5_9ei&WqC)01={V@7AJ{egzua9KybaZ_4>ihn?AL+a4`Q*o!KgcK3 zH`>YDzFcj1(^|+K_MG@G1W*~PY|5%D#;LFJozQ({;4ZD=z9}>B6A>UcW!%H$b(s5- zk_)#TVka(?6o4|!47^_@AM|?SgGdKEqMF~*`J$$xn$_&h{T+7C{4A>zuTZM{PMu<- zrTgMu*H2DmBcdLAZWbHa`Z;ZxXezvRlA$WqwMFVri0+i0wJI;qB%#Z|qS&DuYO=$+ z*~>$qrozQQn5EIl#RY#(?XWuMVt&NSsY3z=hI=~Pj`2?**gg1<#a^ zkc|UFl?++_QE2@BkuNT8tp6*YsQzEy|Jg~a>;HBAAJz5$y8i#i&&<~K{{m_1`hQ*j zuj~JH{l7S-uKyR9Uf2KY`hQ*juj~JH{lBjN*Y*E7KkNGcHo;5&dtLuuz*pD*>-s-J zb^X7t|JU{Zy8bWJ_5Zs5|EI72EC0{+fA;;)lo)@2@Bhud|5*b|Qh)#7E?Ua}!&FJ> zk^SIvZ20~cQ`3|M{u`=n*7rYl(f;$Ve>YxdwtB%S%sf^!aH(6zBOR0`J&~eHvfOyI zFedLc8@z+R&t5-=4oQ|YSy6OJkqwyJcc;m81*{CPx~wW4Nok~s;XUEKsu*%#(=@R? z=pBi=+6C84Z|S1a)jEdR)6HJL{k!lO5C~Cd3H$kv_lGKUYu&D>cQr%QW%#et?|^&P z?hiU$t#9hR-tR)A?`LV~!mNXCU)K9avIvVGh>FtF#KVDpD9ZAYtPfh9{^0N^owXas z#J34ar@qLZ^I!6;J*-J>Q?#Zgnk^Z2(`m_K+vw|}+BLPKj;6K-gZ8R5-GLG;eBPh` ze6Q*4uA%mi#Fng^qTW-wV!Pct6b<80R*fU|@X%a2?>%TSD$IXTd|7%Z5~kPhwam7v zi36nr%!2IzVdRczfQ#AJz+UtWt-QdOUNFX9<8%IVNLZ3?FB9WZ%_F;#646D@LXrVB zKL5N&b7cSQ`nTxl><#pmp7Z|SOg-;|-{;qsSg=U2XFL*9FKvcwGz9URvF)NEZcSZKW>$;=f-Vf;m$lV?E_U;HD za($ci_U;JRtZ&ot&8r02eT!wsU^^=U!?ts)x85JcxRrBSvBmsF{e92dwKV>RDCOh* z4X}IUe+;G0|Lmj{_@BjLpYZQLDMqU$v;2>4)coH?tK$Dcmg0lw*pUB|Raq_TKfI{( zf4gbV((@k;?W^ZPo(Ysr`XdQm2`}iEoIgwR2e&W7Aep^jrIu$ScC%wZEAI3@&I_N! zh9p00F21MZn+pgU>V+Cl) zK2-O#!TuaiG{Y7_nH)q7UX^9H<}LmQ&hk#yGp|UeFykQb=r^EePbx5Rhj z!bp{U9Cq7*QkeKY2}?H$7m#Vfi}Y}MmX7U45s9N0FqD3}UVC zkJ;_XrwIGlyL|@;Q#ke)^IQrEG%exFW;qMpYaC~9vFA}@7hmz6H5a$GamQA0O+t^* zJA0nT?&24=s!6h>{+YH4IOpS-_jzzo88T22S{F62{&EEH(*RrX z&x?V?b>P~lEQ{yN%O8RJzqcxq$Oa&s{qh|7 Date: Fri, 16 Sep 2022 12:34:38 -0700 Subject: [PATCH 59/69] Update Jenkins labs --- .gitignore | 359 +------------------------------ jenkins/1-configure.md | 3 +- jenkins/2-audit.md | 127 ++++++++++- jenkins/3-forecast.md | 89 +++++--- jenkins/4-dry-run.md | 17 +- jenkins/5-custom-transformers.md | 22 +- jenkins/6-migrate.md | 26 ++- jenkins/readme.md | 65 +++--- 8 files changed, 259 insertions(+), 449 deletions(-) diff --git a/.gitignore b/.gitignore index c05f815..46e2c04 100644 --- a/.gitignore +++ b/.gitignore @@ -1,356 +1,3 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# valet files -.env*local -credentials_file.yaml - -.vscode \ No newline at end of file +.env.local +.cache/ +tmp/ diff --git a/jenkins/1-configure.md b/jenkins/1-configure.md index 0e1fabe..8128140 100644 --- a/jenkins/1-configure.md +++ b/jenkins/1-configure.md @@ -54,7 +54,8 @@ To verify your environment is configured correctly, run the `update` CLI command 2. You should see a confirmation that you were logged into the GitHub Container Registry and Valet was updated to the latest version. - ```bash + ```console + $ gh valet update Login Succeeded latest: Pulling from valet-customers/valet-cli Digest: sha256:a7d00dee8a37e25da59daeed44b1543f476b00fa2c41c47f48deeaf34a215bbb diff --git a/jenkins/2-audit.md b/jenkins/2-audit.md index e2c8b35..1fcc5cc 100644 --- a/jenkins/2-audit.md +++ b/jenkins/2-audit.md @@ -17,7 +17,7 @@ You will be performing an audit against your preconfigured Jenkins server. Answe - In this example you will audit the entire Jenkins instance, but in the future if you wanted to configure a specific folder to be audited add the `-f ` flag to the `audit` command. 2. Where do you want to store the result? - - __./tmp/audit__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/audit__. This can be any path within the working directory from which Valet commands are executed. ### Steps @@ -30,7 +30,30 @@ You will be performing an audit against your preconfigured Jenkins server. Answe 3. The command will list all the files written to disk in green when the command succeeds. - ![img](https://user-images.githubusercontent.com/19557880/184682347-b19760fa-36a6-423e-a445-bb30eda5ac59.png) + ```console + $ gh valet audit jenkins --output-dir tmp/audit + [2022-08-20 22:08:20] Logs: 'tmp/audit/log/valet-20220916-015817.log' + [2022-08-20 22:08:20] Auditing 'http://localhost:8080/' + [2022-08-20 22:08:20] Output file(s):==========================================| + [2022-08-20 22:08:20] tmp/audit/demo_pipeline.yml + [2022-08-20 22:08:20] tmp/audit/demo_pipeline.config.json + [2022-08-20 22:08:20] tmp/audit/demo_pipeline.jenkinsfile + [2022-08-20 22:08:20] tmp/audit/groovy_script.error.txt + [2022-08-20 22:08:20] tmp/audit/groovy_script.config.json + [2022-08-20 22:08:20] tmp/audit/monas_dev_work/monas_freestyle.yml + [2022-08-20 22:08:20] tmp/audit/monas_dev_work/monas_freestyle.config.json + [2022-08-20 22:08:20] tmp/audit/monas_dev_work/monas_pipeline.yml + [2022-08-20 22:08:20] tmp/audit/monas_dev_work/monas_pipeline.config.json + [2022-08-20 22:08:20] tmp/audit/monas_dev_work/monas_pipeline.jenkinsfile + [2022-08-20 22:08:20] tmp/audit/test_freestyle_project.yml + [2022-08-20 22:08:20] tmp/audit/test_freestyle_project.config.json + [2022-08-20 22:08:20] tmp/audit/test_mutlibranch_pipeline.config.json + [2022-08-20 22:08:20] tmp/audit/test_pipeline.yml + [2022-08-20 22:08:20] tmp/audit/test_pipeline.config.json + [2022-08-20 22:08:20] tmp/audit/test_pipeline.jenkinsfile + [2022-08-20 22:08:20] tmp/audit/workflow_usage.csv + [2022-08-20 22:08:20] tmp/audit/audit_summary.md + ``` ## Inspect the output files @@ -46,7 +69,24 @@ The audit summary, logs, config files, jenkinsfiles, and transformed workflows w The pipeline summary section contains high level statistics regarding the conversion rate done by Valet: - ![img](https://user-images.githubusercontent.com/19557880/184683664-81985baf-5c03-4765-a067-f4023416e3ea.png) +> Total: __7__ +> +> - Successful: __3 (42%)__ +> - Partially successful: __3 (42%)__ +> - Unsupported: __1 (14%)__ +> - Failed: __0 (0%)__ +> +> ### Job types +> +> Supported: __6 (85%)__ +> +> - flow-definition: __3__ +> - project: __2__ +> - org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject: __1__ +> +> Unsupported: __1 (14%)__ +> +> - scripted: __1__ Here are some key terms in the “Pipelines” section in the above example: @@ -67,7 +107,31 @@ The "Job types" section will summarize which types of pipelines are being used a The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by Valet. - ![img](https://user-images.githubusercontent.com/19557880/184684062-69ab0bde-5e32-45f8-a7dd-ed4655872975.png) +> Total: __17__ +> +> Known: __13 (76%)__ +> +> - echo: __6__ +> - hudson.tasks.Shell: __3__ +> - junit: __2__ +> - archiveArtifacts: __1__ +> - sh: __1__ +> +> Unknown: __3 (17%)__ +> +> - sleep: __2__ +> - hudson.plugins.git.GitPublisher: __1__ +> +> Unsupported: __1 (5%)__ +> +> - hudson.tasks.Mailer: __1__ +> +> Actions: __22__ +> +> - run: __10__ +> - actions/checkout@v2: __9__ +> - EnricoMi/publish-unit-test-result-action@v1.7: __2__ +> - actions/upload-artifact@v2: __1__ Here are some key terms in the "Build steps" section in the above example: @@ -86,7 +150,17 @@ There is an equivalent breakdown of build triggers, environment variables, and o The manual tasks summary section presents an overview of the manual tasks that you will need to perform that Valet is not able to complete automatically. - ![img](https://user-images.githubusercontent.com/19557880/184684249-9accfd94-c2df-4891-af56-dcff66beb557.png) +> Total: __9__ +> +> Secrets: __2__ +> +> - `${{ secrets.SECRET_TEST_EXPRESSION_VAR }}`: __1__ +> - `${{ secrets.EXPRESSION_FIRST_VAR }}`: __1__ +> +> Self hosted runners: __7__ +> +> - `TeamARunner`: __6__ +> - `DemoRunner`: __1__ Here are some key terms in the “Manual tasks” section in the above example: @@ -97,7 +171,48 @@ Here are some key terms in the “Manual tasks” section in the above example: The final section of the audit report provides a manifest of all of the files that are written to disk during the audit. These files include: - ![img](https://user-images.githubusercontent.com/19557880/184684416-b3db774e-4ab8-46e0-91ad-e503632df5cb.png) +> ### Successful +> +> #### demo_pipeline +> +> - [demo_pipeline.yml](demo_pipeline.yml) +> - [demo_pipeline.config.json](demo_pipeline.config.json) +> - [demo_pipeline.jenkinsfile](demo_pipeline.jenkinsfile) +> +> #### monas_dev_work/monas_freestyle +> +> - [monas_dev_work/monas_freestyle.yml](monas_dev_work/monas_freestyle.yml) +> - [monas_dev_work/monas_freestyle.config.json](monas_dev_work/monas_freestyle.config.json) +> +> #### test_mutlibranch_pipeline +> +> - [test_mutlibranch_pipeline.config.json](test_mutlibranch_pipeline.config.json) +> +> ### Partially successful +> +> #### monas_dev_work/monas_pipeline +> +> - [monas_dev_work/monas_pipeline.yml](monas_dev_work/monas_pipeline.yml) +> - [monas_dev_work/monas_pipeline.config.json](monas_dev_work/monas_pipeline.config.json) +> - [monas_dev_work/monas_pipeline.jenkinsfile](monas_dev_work/monas_pipeline.jenkinsfile) +> +> #### test_freestyle_project +> +> - [test_freestyle_project.yml](test_freestyle_project.yml) +> - [test_freestyle_project.config.json](test_freestyle_project.config.json) +> +> #### test_pipeline +> +> - [test_pipeline.yml](test_pipeline.yml) +> - [test_pipeline.config.json](test_pipeline.config.json) +> - [test_pipeline.jenkinsfile](test_pipeline.jenkinsfile) +> +> ### Failed +> +> #### groovy_script +> +> - [groovy_script.error.txt](groovy_script.error.txt) +> - [groovy_script.config.json](groovy_script.config.json) Each pipeline will have a variety of files written that include: diff --git a/jenkins/3-forecast.md b/jenkins/3-forecast.md index 7748a1f..7344c0a 100644 --- a/jenkins/3-forecast.md +++ b/jenkins/3-forecast.md @@ -5,7 +5,7 @@ In this lab you will use the `forecast` command to forecast potential GitHub Act ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a Jenkins server. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). ## Perform a forecast @@ -18,7 +18,7 @@ Answer the following questions before running the `forecast` command: - __2022-08-02__. This date is needed as it is prior to when the data was seeded in Jenkins for these labs. This value defaults to the date one week ago, however, you should use a start date that will show a representative view of typical usage. 3. Where do you want to store the results? - - `./tmp/forecast_reports` + - `tmp/forecast` ### Steps @@ -26,16 +26,23 @@ Answer the following questions before running the `forecast` command: 2. Run the following command from the root directory: ```bash - gh valet forecast jenkins --output-dir ./tmp/forecast_reports --start-date 2022-08-02 + gh valet forecast jenkins --output-dir tmp/forecast --start-date 2022-08-02 ``` 3. The command will list all the files written to disk when the command succeeds. - ![img](https://user-images.githubusercontent.com/19557880/186223037-18556c82-5a29-4434-bc17-4b906d704967.png) + ```console + $ gh valet forecast jenkins --output-dir tmp/forecast --start-date 2022-08-02 + [2022-08-20 22:08:20] Logs: 'tmp/forecast/log/valet-20220916-021004.log' + [2022-08-20 22:08:20] Forecasting 'http://localhost:8080/' + [2022-08-20 22:08:20] Output file(s): + [2022-08-20 22:08:20] tmp/forecast/jobs/09-16-2022-02-10_jobs_0.json + [2022-08-20 22:08:20] tmp/forecast/forecast_report.md + ``` ## Review the forecast report -The forecast report, logs, and completed job data will be located within the `tmp/forecast_reports` folder. +The forecast report, logs, and completed job data will be located within the `tmp/forecast` folder. 1. Find the `forecast_report.md` file in the file explorer. 2. Right-click the `forecast_report.md` file and select `Open Preview`. @@ -45,32 +52,30 @@ The forecast report, logs, and completed job data will be located within the `tm The "Total" section of the forecast report contains high level statistics related to all the jobs completed after the `--start-date` CLI option: -```md -- Job count: __73__ -- Pipeline count: __6__ - -- Execution time - - - Total: __27,057 minutes__ - - Median: __2 minutes__ - - P90: __19 minutes__ - - Min: __0 minutes__ - - Max: __15,625 minutes__ - -- Queue time - - - Median: __0 minutes__ - - P90: __0 minutes__ - - Min: __0 minutes__ - - Max: __0 minutes__ - -- Concurrent jobs - - - Median: __1__ - - P90: __3__ - - Min: __0__ - - Max: __29__ -``` +> - Job count: __73__ +> - Pipeline count: __6__ +> +> - Execution time +> +> - Total: __27,057 minutes__ +> - Median: __2 minutes__ +> - P90: __19 minutes__ +> - Min: __0 minutes__ +> - Max: __15,625 minutes__ +> +> - Queue time +> +> - Median: __0 minutes__ +> - P90: __0 minutes__ +> - Min: __0 minutes__ +> - Max: __0 minutes__ +> +> - Concurrent jobs +> +> - Median: __1__ +> - P90: __3__ +> - Min: __0__ +> - Max: __29__ Here are some key terms of items defined in the forecast report: @@ -85,16 +90,32 @@ Additionally, these metrics are defined for each queue of runners defined in Jen ## Forecasting multiple providers -You can examine the available options for the `forecast` command by running `gh valet forecast --help`. When you do this you will see the `--source-file-path` option: +You can examine the available options for the `forecast` command by running `gh valet forecast jenkins --help`. When you do this you will see the `--source-file-path` option: -![img](https://user-images.githubusercontent.com/19557880/186263140-f02c6cab-7979-417c-bdfe-b9590e9c5597.png) +```console +$ gh valet forecast jenkins --help +Options: + -u, --jenkins-instance-url The URL of the Jenkins CI instance. + -n, --jenkins-username Username for the Jenkins instance. + -t, --jenkins-access-token Access token for the Jenkins instance. + -f, --folders Folders to forecast in the instance + --source-file-path The file path(s) to existing jobs data. + -o, --output-dir (REQUIRED) The location for any output files. + --start-date The start date of the forecast analysis in YYYY-MM-DD format. [default: 9/9/2022 2:14:15 AM] + --time-slice The time slice in seconds to use for computing concurrency metrics. [default: 60] + --credentials-file The file containing the credentials to use. + --no-telemetry Boolean value to disallow telemetry. + --no-ssl-verify Disable ssl certificate verification. + --no-http-cache Disable caching of http responses. + -?, -h, --help Show help and usage information +``` You can use the `--source-file-path` CLI option to combine data from multiple reports into a single report. This becomes useful if you use multiple CI/CD providers and wanted to get a holistic view of the runner usage. This works by using the `.json` files generated by `forecast` commands as space-delimited values for the `--source-file-path` CLI option. Optionally, this value could be a glob pattern to dynamically specify the list of files (e.g. `**/*.json`). Run the following command from within the codespace terminal: ```bash -gh valet forecast --source-file-path tmp/**/jobs/*.json --output-dir tmp/combined-forecast +gh valet forecast --source-file-path tmp/**/jobs/*.json --output-dir tmp/forecast-combined ``` You can now inspect the output of the command to see a forecast report using all of the files matching the `tmp/**/jobs/*.json` pattern. diff --git a/jenkins/4-dry-run.md b/jenkins/4-dry-run.md index e0cd0d8..e24f7cd 100644 --- a/jenkins/4-dry-run.md +++ b/jenkins/4-dry-run.md @@ -5,7 +5,7 @@ In this lab you will use the `dry-run` command to convert a Jenkins pipeline to ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a Jenkins server. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). 3. Completed the [audit lab](./2-audit.md). ## Perform a dry run @@ -19,7 +19,7 @@ You will be performing a dry run against a pipeline in your preconfigured Jenkin - ____ 3. Where do you want to store the result? - - __./tmp/dry-run-lab__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/dry-run__. This can be any path within the working directory from which Valet commands are executed. ### Steps @@ -27,15 +27,20 @@ You will be performing a dry run against a pipeline in your preconfigured Jenkin 2. Run the following command from the root directory: ```bash - gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir .tmp/jenkins/dry-run + gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/dry-run ``` 3. The command will list all the files written to disk when the command succeeds. - ![img](https://user-images.githubusercontent.com/19557880/184935603-5c2d4dfe-66ef-4cb1-9398-e96954ca72e3.png) + ```console + $ gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/dry-run + [2022-08-20 22:08:20] Logs: 'tmp/dry-run/log/valet-20220916-022338.log' + [2022-08-20 22:08:20] Output file(s): + [2022-08-20 22:08:20] tmp/dry-run/test_pipeline.yml + ``` 4. View the converted workflow: - - Find `./tmp/dry-run` in the file explorer pane in your codespace. + - Find `tmp/dry-run` in the file explorer pane in your codespace. - Click `test_pipeline.yml` to open ## Inspect the output files @@ -66,7 +71,7 @@ pipeline { } stage('test') { steps{ - junit '**/target/*.xml' + junit '**/target/*.xml' } } } diff --git a/jenkins/5-custom-transformers.md b/jenkins/5-custom-transformers.md index 129509f..91a9f6e 100644 --- a/jenkins/5-custom-transformers.md +++ b/jenkins/5-custom-transformers.md @@ -10,15 +10,15 @@ In this lab you will build upon the `dry-run` command to override Valet's defaul ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a Jenkins server. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). -3. Completed the [dry-run lab](./3-dry-run.md). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). +3. Completed the [dry-run lab](./4-dry-run.md). ## Perform a dry-run You will be performing a `dry-run` command to inspect the workflow that is converted by default. Run the following command within the codespace terminal: ```bash -gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/jenkins/dry-run +gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/dry-run ``` The converted workflow that is generated by the above command can be seen below: @@ -71,7 +71,7 @@ jobs: -_Note_: You can refer to the previous [lab](./3-dry-run.md) to learn about the fundamentals of the `dry-run` command. +_Note_: You can refer to the previous [lab](./4-dry-run.md) to learn about the fundamentals of the `dry-run` command. ## Custom transformers for an unknown step @@ -114,7 +114,7 @@ This method can use any valid ruby syntax and should return a `Hash` that repres Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: ```bash -gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/jenkins/dry-run --custom-transformers transformers.rb +gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/dry-run --custom-transformers transformers.rb ``` Open the workflow that is generated and inspect the contents. Now the `sleep` step is converted and uses the customized behavior! @@ -160,7 +160,13 @@ end Now, we can perform another `dry-run` command with the `--custom-transformers` CLI option. The output of the `dry-run` command should look similar to this: -![img](https://user-images.githubusercontent.com/19557880/186782050-65ece0c4-52a3-4f88-818f-0f860c50c2b7.png) +```console +$ gh valet dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/dry-run --custom-transformers transformers.rb +[2022-08-20 22:08:20] Logs: 'tmp/dry-run/log/valet-20220916-022628.log' +This is the item: {"name"=>"junit", "arguments"=>[{"key"=>"testResults", "value"=>{"isLiteral"=>true, "value"=>"**/target/*.xml"}}]} +[2022-08-20 22:08:20] Output file(s): +[2022-08-20 22:08:20] tmp/dry-run/test_pipeline.yml +``` Now that you know the data structure of `item`, you can access the file path programmatically by editing the custom transformer to the following: @@ -207,7 +213,7 @@ env "DB_ENGINE", "mongodb" In this example, the first parameter to the `env` method is the environment variable name and the second is the updated value. -Now you can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `DB_ENGINE` environment variable will be set to `mongodb`: +Now you can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `DB_ENGINE` environment variable will be set to `mongodb`: ```diff env: @@ -234,7 +240,7 @@ runner "TeamARunner", "ubuntu-latest" In this example, the first parameter to the `runner` method is the Jenkins label and the second is the Actions runner label. -Now you can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `runs-on` statement will use the customized runner label: +Now you can perform another `dry-run` command with the `--custom-transformers` CLI option. When you open the converted workflow the `runs-on` statement will use the customized runner label: ```diff runs-on: diff --git a/jenkins/6-migrate.md b/jenkins/6-migrate.md index 325a620..e922bec 100644 --- a/jenkins/6-migrate.md +++ b/jenkins/6-migrate.md @@ -5,9 +5,9 @@ In this lab, you will use the `migrate` command to convert a Jenkins pipeline an ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a Jenkins server. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). -3. Completed the [dry-run lab](./3-dry-run.md). -4. Completed the [custom transformers lab](./4-custom-transformers.md). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). +3. Completed the [dry-run lab](./4-dry-run.md). +4. Completed the [custom transformers lab](./5-custom-transformers.md). ## Performing a migration @@ -16,7 +16,7 @@ Answer the following questions before running a `migrate` command: 1. What is the source URL of the pipeline you want to convert? - ____ 2. Where do you want to store the logs? - - __./tmp/migrate__ + - __tmp/migrate__ 3. What is the URL for the GitHub repository to add the workflow to? - __this repository__. The URL should follow the pattern with `:owner` and `:repo` replaced with your values. @@ -25,12 +25,16 @@ Answer the following questions before running a `migrate` command: 1. Run the following `migrate` command in your codespace terminal: ```bash - gh valet migrate jenkins --target-url https://github.com/:owner/:repo --output-dir ./tmp/migrate --source-url http://localhost:8080/job/monas_dev_work/job/monas_freestyle + gh valet migrate jenkins --target-url https://github.com/:owner/:repo --output-dir tmp/migrate --source-url http://localhost:8080/job/monas_dev_work/job/monas_freestyle ``` 2. The command will write the URL to the pull request that was created when the command succeeds. - ![img](https://user-images.githubusercontent.com/19557880/185509412-ab64d92d-2a56-4d5a-bbb4-35a41a2ca48c.png) + ```console + $ gh valet migrate jenkins --target-url https://github.com/:owner/:repo --output-dir tmp/migrate --source-url http://localhost:8080/job/monas_dev_work/job/monas_freestyle + [2022-08-20 22:08:20] Logs: 'tmp/migrate/log/valet-20220916-014033.log' + [2022-08-20 22:08:20] Pull request: 'https://github.com/:owner/:repo/pull/1' + ``` 3. Open the generated pull request in a new browser tab. @@ -38,7 +42,15 @@ Answer the following questions before running a `migrate` command: The first thing we should notice about the pull request is that there is a list of manual steps to complete: -![img](https://user-images.githubusercontent.com/19557880/186784161-b7882ac4-ac99-4462-b69f-f49b9202527b.png) +> Pipeline migrated from [Jenkins](http://localhost:8080/job/monas_dev_work/job/monas_freestyle) 🎉 +> +> ## Manual steps +> +> Perform the follow steps to complete the migration: +> +> ### monas_dev_work/monas_freestyle +> +> - [ ] Ensure secret is available: `${{ secrets.SECRET_TEST_EXPRESSION_VAR }}` Next, review the workflow you are adding by clicking on the `Files changed` tab. This is where you double check that everything looks good. If it didn't, you could push commits with the required changes, prior to merging. diff --git a/jenkins/readme.md b/jenkins/readme.md index a8e78c7..aa4ab40 100644 --- a/jenkins/readme.md +++ b/jenkins/readme.md @@ -12,48 +12,50 @@ These steps **must** be completed prior to starting other labs. 1. Start a new codespace. -- Click the `Code` button on your repository's landing page. -- Click the `Codespaces` tab. -- Click `Create codespaces on main` to create the codespace. -- After the codespace has initialized there will be a terminal present. + - Click the `Code` button on your repository's landing page. + - Click the `Codespaces` tab. + - Click `Create codespaces on main` to create the codespace. + - After the codespace has initialized there will be a terminal present. 2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). -- Run the following command in the codespace's terminal: + - Run the following command in the codespace's terminal: - ```bash - gh valet version - ``` + ```bash + gh valet version + ``` -- Verify the output is similar to below. - - ```bash - gh version 2.14.3 (2022-07-26) - gh valet github/gh-valet v0.1.12 - valet-cli unknown - ``` + - Verify the output is similar to below. - - If `gh valet version` did not produce similar output, refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). + ```console + $ gh valet version + gh version 2.14.3 (2022-07-26) + gh valet github/gh-valet v0.1.12 + valet-cli unknown + ``` + + - If `gh valet version` did not produce similar output, refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). ## Bootstrap a Jenkins server - 1. Execute the Jenkins setup script that will start a container with a Jenkins server running inside of it. This script should be executed when starting a new codespace or restarting an existing one. +1. Execute the Jenkins setup script that will start a container with a Jenkins server running inside of it. This script should be executed when starting a new codespace or restarting an existing one. -- Run the following command from the codespace's terminal to start a Jenkins server: + - Run the following command from the codespace's terminal to start a Jenkins server: - ```bash - ./jenkins/bootstrap/setup.sh - ``` + ```bash + ./jenkins/bootstrap/setup.sh + ``` -- After some time, a pop-up box should appear with a link to the URL for your Jenkins server. - - You can also access the URL by going to the `Ports` tab in your terminal. Right-click the URL listed under the `Local Address` and click the `Open in Browser` tab. + - After some time, a pop-up box should appear with a link to the URL for your Jenkins server. + + - You can also access the URL by going to the `Ports` tab in your terminal. Right-click the URL listed under the `Local Address` and click the `Open in Browser` tab. 2. Open the Jenkins server in your browser and use the following credentials to authenticate: - - Username: `admin` - - Password: `password` + - Username: `admin` + - Password: `password` -- Once authenticated, you should see a Jenkins server with a few predefined pipelines. +3. Once authenticated, you should see a Jenkins server with a few predefined pipelines. ## Labs for Jenkins @@ -61,10 +63,10 @@ Perform the following labs to learn more about Actions migrations with Valet: 1. [Configure credentials for Valet](1-configure.md) 2. [Perform an audit of a Jenkins server](2-audit.md) -3. [Perform a dry-run migration of a Jenkins pipeline](3-dry-run.md) -4. [Use custom transformers to customize Valet's behavior](4-custom-transformers.md) -5. [Perform a production migration of a Jenkins pipeline](5-migrate.md) -6. [Forecast potential build runner usage](6-forecast.md) +3. [Forecast potential build runner usage](3-forecast.md) +4. [Perform a dry-run migration of a Jenkins pipeline](4-dry-run.md) +5. [Use custom transformers to customize Valet's behavior](5-custom-transformers.md) +6. [Perform a production migration of a Jenkins pipeline](6-migrate.md) ## Troubleshoot the Valet CLI @@ -79,7 +81,8 @@ The CLI extension for Valet can be manually installed by following these steps: - Verify the result of the install contains: - ```bash + ```console + $ gh extension install github/gh-valet ✓ Installed extension github/gh-valet ``` From 0e2823c6e371223caf857c07c3ec4ce51b6d8b7e Mon Sep 17 00:00:00 2001 From: Matisse Hack Date: Fri, 16 Sep 2022 12:35:07 -0700 Subject: [PATCH 60/69] Consistency across labs --- azure_devops/1-configure.md | 5 ++- azure_devops/2-audit.md | 2 +- azure_devops/3-forecast.md | 10 ++--- azure_devops/4-dry-run.md | 12 ++--- azure_devops/5-custom-transformers.md | 14 +++--- azure_devops/6-migrate.md | 16 +++---- azure_devops/readme.md | 44 +++++++++--------- gitlab/1-configure.md | 4 +- gitlab/2-audit.md | 2 +- gitlab/3-forecast.md | 10 ++--- gitlab/4-dry-run.md | 13 +++--- gitlab/5-custom-transformers.md | 6 +-- gitlab/6-migrate.md | 12 ++--- gitlab/readme.md | 65 ++++++++++++++------------- 14 files changed, 112 insertions(+), 103 deletions(-) diff --git a/azure_devops/1-configure.md b/azure_devops/1-configure.md index 0549334..0f0fc00 100644 --- a/azure_devops/1-configure.md +++ b/azure_devops/1-configure.md @@ -7,7 +7,7 @@ You will need to complete all of the setup instructions [here](./readme.md#confi ## Configuring credentials 1. Create an Azure DevOps personal access token (PAT). - + __Note__: you can skip this step if you still have the PAT created during the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization). - Navigate to your existing organization () in your browser. - In the top right corner of your screen, click `User settings`. @@ -62,7 +62,8 @@ To verify our environment is configured correctly, run the `update` CLI command. 2. You should see a confirmation that you were logged into the GitHub Container Registry and Valet was updated to the latest version. - ```bash + ```console + $ gh valet update Login Succeeded latest: Pulling from valet-customers/valet-cli Digest: sha256:a7d00dee8a37e25da59daeed44b1543f476b00fa2c41c47f48deeaf34a215bbb diff --git a/azure_devops/2-audit.md b/azure_devops/2-audit.md index d9d58f9..07c6613 100644 --- a/azure_devops/2-audit.md +++ b/azure_devops/2-audit.md @@ -20,7 +20,7 @@ You will now perform an audit against the bootstrapped Azure DevOps project. Ans - __:project__. This should be the same project name used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization) 3. Where do you want to store the result? - - __./tmp/audit__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/audit__. This can be any path within the working directory from which Valet commands are executed. ### Steps diff --git a/azure_devops/3-forecast.md b/azure_devops/3-forecast.md index cb188a9..6d0bd7d 100644 --- a/azure_devops/3-forecast.md +++ b/azure_devops/3-forecast.md @@ -5,7 +5,7 @@ In this lab you will use the `forecast` command to forecast potential GitHub Act ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and bootstrap an Azure DevOps project. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). ## Perform a forecast @@ -18,7 +18,7 @@ Answer the following questions before running the `forecast` command: - __:project__. This should be the same project name used in the setup steps [here](./readme.md#bootstrap-your-azure-devops-organization) 3. Where do you want to store the results? - - `./tmp/forecast_reports` + - `tmp/forecast` ### Steps @@ -26,7 +26,7 @@ Answer the following questions before running the `forecast` command: 2. Run the following command from the root directory: ```bash - gh valet forecast azure-devops --output-dir ./tmp/forecast_reports + gh valet forecast azure-devops --output-dir tmp/forecast ``` __Note__: The Azure DevOps organization and project name can be omitted from the `forecast` command because they were persisted in the `.env.local` file in the [configure lab](./1-configure.md). You can optionally provide these arguments on the command line with the `--azure-devops-organization` and `--azure-devops-project` CLI options. @@ -42,7 +42,7 @@ Answer the following questions before running the `forecast` command: 5. Run the following `forecast` command while specifying the path to the sample json files: ```bash - gh valet forecast azure-devops --output-dir ./tmp/forecast_reports --source-file-path azure_devops/bootstrap/jobs.json + gh valet forecast azure-devops --output-dir tmp/forecast --source-file-path azure_devops/bootstrap/jobs.json ``` 6. The command will list all the files written to disk when the command succeeds. @@ -51,7 +51,7 @@ Answer the following questions before running the `forecast` command: ## Review the forecast report -The forecast report, logs, and completed job data will be located within the `tmp/forecast_reports` folder. +The forecast report, logs, and completed job data will be located within the `tmp/forecast` folder. 1. Find the `forecast_report.md` file in the file explorer. 2. Right-click the `forecast_report.md` file and select `Open Preview`. diff --git a/azure_devops/4-dry-run.md b/azure_devops/4-dry-run.md index dc15aac..388e50b 100644 --- a/azure_devops/4-dry-run.md +++ b/azure_devops/4-dry-run.md @@ -5,7 +5,7 @@ In this lab you will use the `dry-run` command to convert an Azure DevOps pipeli ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and bootstrap an Azure DevOps project. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). 3. Completed the [audit lab](./2-audit.md). ## Perform a dry run @@ -19,7 +19,7 @@ You will perform a dry run for a pipeline in the bootstrapped Azure DevOps proje - Inspecting the URL to locate the pipeline id 2. Where do you want to store the result? - - __./tmp/dry-run-lab__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/dry-run__. This can be any path within the working directory from which Valet commands are executed. ### Steps @@ -27,14 +27,14 @@ You will perform a dry run for a pipeline in the bootstrapped Azure DevOps proje 2. Run the following command from the root directory: ```bash - gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run-lab + gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run ``` 3. The command will list all the files written to disk when the command succeeds. 4. View the converted workflow: - - Find `./tmp/dry-run-lab` in the file explorer pane in your codespace. + - Find `tmp/dry-run` in the file explorer pane in your codespace. - Click `valet-pipeline1.yml` to open. - + ## Inspect the output files The files generated from the `dry-run` command represent the equivalent Actions workflow for the given Azure DevOps pipeline. The Azure DevOps pipeline and converted workflow can be seen below: @@ -63,7 +63,7 @@ steps:
Converted workflow 👇 - + ```yaml name: valet-bootstrap/pipelines/valet-pipeline1 on: diff --git a/azure_devops/5-custom-transformers.md b/azure_devops/5-custom-transformers.md index c46a28b..8b2658a 100644 --- a/azure_devops/5-custom-transformers.md +++ b/azure_devops/5-custom-transformers.md @@ -10,9 +10,9 @@ In this lab we will build upon the `dry-run` command to override Valet's default ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and bootstrap an Azure DevOps project. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). 3. Completed the [audit lab](./2-audit.md). -4. Completed the [dry-run lab](./3-dry-run.md). +4. Completed the [dry-run lab](./4-dry-run.md). ## Perform a dry run @@ -25,7 +25,7 @@ You will perform a dry-run for a pipeline in the bootstrapped Azure DevOps proje - Inspecting the URL to locate the pipeline id 2. Where do you want to store the result? - - __./tmp/dry-run-lab__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/dry-run__. This can be any path within the working directory from which Valet commands are executed. ### Steps @@ -33,12 +33,12 @@ You will perform a dry-run for a pipeline in the bootstrapped Azure DevOps proje 2. Run the following command from the root directory: ```bash - gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run-lab + gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run ``` 3. The command will list all the files written to disk when the command succeeds. 4. View the converted workflow: - - Find `./tmp/dry-run-lab` in the file explorer pane in your codespace. + - Find `tmp/dry-run` in the file explorer pane in your codespace. - Click `valet-custom-transformer-example.yml` to open. The converted workflow that is generated can be seen below: @@ -77,7 +77,7 @@ jobs:
-_Note_: You can refer to the previous [lab](./3-dry-run.md) to learn about the fundamentals of the `dry-run` command. +_Note_: You can refer to the previous [lab](./4-dry-run.md) to learn about the fundamentals of the `dry-run` command. ## Custom transformers for build steps @@ -127,7 +127,7 @@ This method can use any valid ruby syntax and should return a `Hash` that repres Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: ```bash -gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run-lab --custom-transformers transformers.rb +gh valet dry-run azure-devops pipeline --pipeline-id :pipeline_id --output-dir tmp/dry-run --custom-transformers transformers.rb ``` Open the workflow that is generated and inspect the contents. Now the `DotnetCoreCLI@2` steps are converted using the customized behavior! diff --git a/azure_devops/6-migrate.md b/azure_devops/6-migrate.md index f735447..551f5af 100644 --- a/azure_devops/6-migrate.md +++ b/azure_devops/6-migrate.md @@ -5,9 +5,9 @@ In this lab, you will use the `migrate` command to convert an Azure DevOps pipel ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and bootstrap an Azure DevOps project. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). -3. Completed the [dry-run lab](./3-dry-run.md). -4. Completed the [custom transformers lab](./4-custom-transformers.md). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). +3. Completed the [dry-run lab](./4-dry-run.md). +4. Completed the [custom transformers lab](./5-custom-transformers.md). ## Performing a migration @@ -19,7 +19,7 @@ Answer the following questions before running a `migrate` command: - Selecting the pipeline with the name "valet-pipeline2" - Inspecting the URL to locate the pipeline id 2. Where do you want to store the logs? - - __./tmp/migrate__ + - __tmp/migrate__ 3. What is the URL for the GitHub repository to add the workflow to? - __this repository__. The URL should follow the pattern with `:owner` and `:repo` replaced with your values. @@ -28,14 +28,14 @@ Answer the following questions before running a `migrate` command: 1. Run the following `migrate` command in the codespace terminal: ```bash - gh valet migrate azure-devops pipeline --pipeline-id :pipeline_id --target-url https://github.com/:owner/:repo --output-dir ./tmp/migrate + gh valet migrate azure-devops pipeline --pipeline-id :pipeline_id --target-url https://github.com/:owner/:repo --output-dir tmp/migrate ``` 2. The command will write the URL to the pull request that was created when the command succeeds. - ```bash - ➜ gh valet migrate azure-devops pipeline --pipeline-id 8 --target-url https://github.com/ethanis/labs --output-dir ./tmp/migrate - [2022-09-07 20:25:08] Logs: 'tmp/dry-run-lab/log/valet-20220907-202508.log' + ```console + $ gh valet migrate azure-devops pipeline --pipeline-id 8 --target-url https://github.com/ethanis/labs --output-dir tmp/migrate + [2022-09-07 20:25:08] Logs: 'tmp/dry-run/log/valet-20220907-202508.log' [2022-09-07 20:25:13] Pull request: 'https://github.com/ethanis/labs/pull/42' ``` diff --git a/azure_devops/readme.md b/azure_devops/readme.md index a924ca6..ca3805e 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -12,28 +12,29 @@ These steps **must** be completed prior to starting other labs. 1. Start a new codespace. -- Click the `Code` button on your repository's landing page. -- Click the `Codespaces` tab. -- Click `Create codespaces on main` to create the codespace. -- After the codespace has initialized there will be a terminal present. + - Click the `Code` button on your repository's landing page. + - Click the `Codespaces` tab. + - Click `Create codespaces on main` to create the codespace. + - After the codespace has initialized there will be a terminal present. 2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). -- Run the following command in the codespace terminal: + - Run the following command in the codespace terminal: - ```bash - gh valet version - ``` + ```bash + gh valet version + ``` -- Verify the output is similar to below. - - ```bash - gh version 2.14.3 (2022-07-26) - gh valet github/gh-valet v0.1.12 - valet-cli unknown - ``` + - Verify the output is similar to below. - - If `gh valet version` did not produce similar output, please refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). + ```console + $ gh valet version + gh version 2.14.3 (2022-07-26) + gh valet github/gh-valet v0.1.12 + valet-cli unknown + ``` + + - If `gh valet version` did not produce similar output, please refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). ## Bootstrap your Azure DevOps organization @@ -77,10 +78,10 @@ Perform the following labs to learn how to migrate Azure DevOps pipelines to Git 1. [Configure credentials for Valet](1-configure.md) 2. [Perform an audit of an Azure DevOps project](2-audit.md) -3. [Perform a dry-run migration of an Azure DevOps pipeline](3-dry-run.md) -4. [Use custom transformers to customize Valet's behavior](4-custom-transformers.md) -5. [Perform a production migration of a Azure DevOps pipeline](5-migrate.md) -6. [Forecast potential build runner usage](6-forecast.md) +3. [Forecast potential build runner usage](3-forecast.md) +4. [Perform a dry-run migration of an Azure DevOps pipeline](4-dry-run.md) +5. [Use custom transformers to customize Valet's behavior](5-custom-transformers.md) +6. [Perform a production migration of a Azure DevOps pipeline](6-migrate.md) ## Troubleshoot the Valet CLI @@ -95,7 +96,8 @@ The CLI extension for Valet can be manually installed by following these steps: - Verify the result of the install contains: - ```bash + ```console + $ gh extension install github/gh-valet ✓ Installed extension github/gh-valet ``` diff --git a/gitlab/1-configure.md b/gitlab/1-configure.md index 2fe886f..6a00435 100644 --- a/gitlab/1-configure.md +++ b/gitlab/1-configure.md @@ -7,6 +7,7 @@ You will need to complete all of the setup instructions [here](./readme.md#confi ## Configuring credentials 1. Run the setup script in the codespace terminal to ensure the GitLab server is ready: + ```bash ./gitlab/bootstrap/setup.sh ``` @@ -59,7 +60,8 @@ To verify your environment is configured correctly, run the `update` CLI command 2. You should see a confirmation that you were logged into the GitHub Container Registry and Valet was updated to the latest version. - ```bash + ```console + $ gh valet update Login Succeeded latest: Pulling from valet-customers/valet-cli Digest: sha256:a7d00dee8a37e25da59daeed44b1543f476b00fa2c41c47f48deeaf34a215bbb diff --git a/gitlab/2-audit.md b/gitlab/2-audit.md index 657726b..614e88a 100644 --- a/gitlab/2-audit.md +++ b/gitlab/2-audit.md @@ -17,7 +17,7 @@ You will be performing an audit against your preconfigured GitLab server. Answer - __valet__. In this example you will be auditing the `valet` group. In the future, you could add additional groups and subgroups to the audit command. 2. Where do you want to store the result? - - __./tmp/audit__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/audit__. This can be any path within the working directory from which Valet commands are executed. ### Steps diff --git a/gitlab/3-forecast.md b/gitlab/3-forecast.md index 43c94d5..172ad98 100644 --- a/gitlab/3-forecast.md +++ b/gitlab/3-forecast.md @@ -5,7 +5,7 @@ In this lab you will use the `forecast` command to forecast potential GitHub Act ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a GitLab server. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). ## Perform a forecast @@ -16,7 +16,7 @@ Answer the following questions before running the `forecast` command: 2. What is the date you want to start forecasting from? - **2022-08-02**. This date is needed as it is prior to when the data was seeded in GitLab for these labs. This value defaults to the date one week ago, however, you should use a start date that will show a representative view of typical usage. 3. Where do you want to store the results? - - **./tmp/forecast_reports** + - **tmp/forecast** ### Steps @@ -24,7 +24,7 @@ Answer the following questions before running the `forecast` command: 2. Run the following command from the root directory: ```bash - gh valet forecast gitlab --output-dir ./tmp/forecast_reports --namespace valet --start-date 2022-08-02 + gh valet forecast gitlab --output-dir tmp/forecast --namespace valet --start-date 2022-08-02 ``` 3. The command will list all the files written to disk when the command succeeds. @@ -33,7 +33,7 @@ Answer the following questions before running the `forecast` command: ## Review the forecast report -The forecast report, logs, and completed job data will be located within the `tmp/forecast_reports` folder. +The forecast report, logs, and completed job data will be located within the `tmp/forecast` folder. 1. Find the `forecast_report.md` file in the file explorer. 2. Right-click the `forecast_report.md` file and select `Open Preview`. @@ -92,7 +92,7 @@ You can use the `--source-file-path` CLI option to combine data from multiple re Run the following command from within the codespace terminal: ```bash -gh valet forecast --source-file-path tmp/**/jobs/*.json --output-dir tmp/combined-forecast +gh valet forecast --source-file-path tmp/**/jobs/*.json --output-dir tmp/forecast-combined ``` You can now inspect the output of the command to see a forecast report using all of the files matching the `tmp/**/jobs/*.json` pattern. diff --git a/gitlab/4-dry-run.md b/gitlab/4-dry-run.md index dd76243..169e925 100644 --- a/gitlab/4-dry-run.md +++ b/gitlab/4-dry-run.md @@ -5,7 +5,7 @@ In this lab you will use the `dry-run` command to convert a GitLab pipeline to i ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment and start a GitLab server. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). 3. Completed the [audit lab](./2-audit.md). ## Perform a dry run @@ -19,7 +19,7 @@ You will be performing a dry run against a pipeline in your preconfigured GitLab - __Valet__ 3. Where do you want to store the result? - - __./tmp/dry-run-lab__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/dry-run__. This can be any path within the working directory from which Valet commands are executed. ### Steps @@ -27,7 +27,7 @@ You will be performing a dry run against a pipeline in your preconfigured GitLab 2. Run the following command from the root directory: ```bash - gh valet dry-run gitlab --output-dir ./tmp/dry-run-lab --namespace valet --project basic-pipeline-example + gh valet dry-run gitlab --output-dir tmp/dry-run --namespace valet --project basic-pipeline-example ``` 3. The command will list all the files written to disk when the command succeeds. @@ -35,9 +35,9 @@ You will be performing a dry run against a pipeline in your preconfigured GitLab ![img](https://user-images.githubusercontent.com/18723510/184173635-aec28d1c-8c61-4dcf-a743-f86cbdc836c5.png) 4. View the converted workflow: - - Find `./tmp/dry-run/valet` in the file explorer pane in your codespace. + - Find `tmp/dry-run/valet` in the file explorer pane in your codespace. - Click `basic-pipeline-example.yml` to open. - + ## Inspect the output files The files generated from the `dry-run` command represent the equivalent Actions workflow for the given GitLab pipeline. The GitLab pipeline and converted workflow can be seen below: @@ -98,7 +98,7 @@ deploy_b:
Converted workflow 👇 - + ```yaml name: valet/basic-pipeline-example on: @@ -196,6 +196,7 @@ jobs: - run: echo "test stage complete. It will start at about the same time as deploy_a." - run: sleep 400 ``` +
Despite these two pipelines using different syntax they will function equivalently. diff --git a/gitlab/5-custom-transformers.md b/gitlab/5-custom-transformers.md index 0333f19..7466dc9 100644 --- a/gitlab/5-custom-transformers.md +++ b/gitlab/5-custom-transformers.md @@ -10,8 +10,8 @@ In this lab you will build upon the `dry-run` command to override Valet's defaul ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start you GitLab server. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). -3. Completed the [dry-run lab](./3-dry-run.md). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). +3. Completed the [dry-run lab](./4-dry-run.md). ## Perform a dry-run @@ -53,7 +53,7 @@ jobs: -_Note_: You can refer to the previous [lab](./3-dry-run.md) to learn about the fundamentals of the `dry-run` command. +_Note_: You can refer to the previous [lab](./4-dry-run.md) to learn about the fundamentals of the `dry-run` command. ## Custom transformers for an unknown step diff --git a/gitlab/6-migrate.md b/gitlab/6-migrate.md index 0e4543d..3dcd734 100644 --- a/gitlab/6-migrate.md +++ b/gitlab/6-migrate.md @@ -5,9 +5,9 @@ In this lab, you will use the `migrate` command to convert a GitLab pipeline and ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment and start a GitLab server. -2. Completed the [configure lab](./1-configure-lab.md#configuring-credentials). -3. Completed the [dry-run lab](./3-dry-run.md). -4. Completed the [custom transformers lab](./4-custom-transformers.md). +2. Completed the [configure lab](./1-configure.md#configuring-credentials). +3. Completed the [dry-run lab](./4-dry-run.md). +4. Completed the [custom transformers lab](./5-custom-transformers.md). ## Performing a migration @@ -18,7 +18,7 @@ Answer the following questions before running a `migrate` command: 2. What is the namespace for that project? - __Valet__ 3. Where do you want to store the logs? - - __./tmp/migrate__ + - __tmp/migrate__ 4. What is the URL for the GitHub repository to add the workflow to? - __this repository__. The URL should should follow the pattern with `:owner` and `:repo` replaced with your values. @@ -27,7 +27,7 @@ Answer the following questions before running a `migrate` command: 1. Run the following `migrate` command in the codespace terminal: ```bash - gh valet migrate gitlab --target-url https://github.com/:owner/:repo --output-dir ./tmp/migrate --namespace valet --project rails-example + gh valet migrate gitlab --target-url https://github.com/:owner/:repo --output-dir tmp/migrate --namespace valet --project rails-example ``` 2. The command will write the URL to the pull request that was created when the command succeeds. @@ -43,7 +43,7 @@ The first thing to notice about the pull request is that there is a list of manu Next, you can inspect the "Files changed" in this pull request and see the converted workflow that is being added. Any additional changes or code reviews that were needed should be done in this pull request. Finally, you can merge the pull request once your review has completed. You can then view the workflow running by selecting the "Actions" menu in the top navigation bar in GitHub. - + ![img](https://user-images.githubusercontent.com/18723510/184960870-590b1a28-422f-4350-9ec0-0423bf7ad445.png) At this point, the migration has completed and you have successfully migrated a GitLab pipeline to Actions! diff --git a/gitlab/readme.md b/gitlab/readme.md index 96cd78f..ad3d2a0 100644 --- a/gitlab/readme.md +++ b/gitlab/readme.md @@ -12,48 +12,50 @@ These steps **must** be completed prior to starting other labs. 1. Start a new codespace -- Click the `Code` button on your repository's landing page. -- Click the `Codespaces` tab. -- Click `Create codespaces on main` to create the codespace. -- After the codespace has initialized there will be a terminal present. + - Click the `Code` button on your repository's landing page. + - Click the `Codespaces` tab. + - Click `Create codespaces on main` to create the codespace. + - After the codespace has initialized there will be a terminal present. 2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). -- Run the following command in the codespace terminal: + - Run the following command in the codespace terminal: - ```bash - gh valet version - ``` + ```bash + gh valet version + ``` -- Verify the output is similar to below. - - ```bash - gh version 2.14.3 (2022-07-26) - gh valet github/gh-valet v0.1.12 - valet-cli unknown - ``` + - Verify the output is similar to below. - - If `gh valet version` did not produce similar output, please refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). + ```console + $ gh valet version + gh version 2.14.3 (2022-07-26) + gh valet github/gh-valet v0.1.12 + valet-cli unknown + ``` + + - If `gh valet version` did not produce similar output, please refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). ## Bootstrap a GitLab server 1. Execute the GitLab setup script that will start a container with GitLab running inside of it. The script should be executed when starting a new codespace or restarting an existing one. -- Run the following command from the codespace terminal: - - ```bash - ./gitlab/bootstrap/setup.sh - ``` + - Run the following command from the codespace terminal: -- After some time, a pop-up box should appear with a link to the URL for your GitLab server. - - You can also access the URL by going to the `Ports` tab in your terminal. Right-click the URL listed under the `Local Address` and click the `Open in Browser` tab. + ```bash + ./gitlab/bootstrap/setup.sh + ``` + + - After some time, a pop-up box should appear with a link to the URL for your GitLab server. + + - You can also access the URL by going to the `Ports` tab in your terminal. Right-click the URL listed under the `Local Address` and click the `Open in Browser` tab. 2. Open the GitLab server in your browser and use the following credentials to authenticate: - - Username: `root` - - Password: `valet-labs!` + - Username: `root` + - Password: `valet-labs!` -- Once authenticated, you should see a GitLab server with a few predefined pipelines in the `valet` group. +3. Once authenticated, you should see a GitLab server with a few predefined pipelines in the `valet` group. ## Labs for GitLab @@ -61,10 +63,10 @@ Perform the following labs to learn more about Actions migrations with Valet: 1. [Configure credentials for Valet](1-configure.md) 2. [Perform an audit on GitLab pipelines](2-audit.md) -3. [Perform a dry-run migration of a GitLab pipeline](3-dry-run.md) -4. [Use custom transformers to customize Valet's behavior](4-custom-transformers.md) -5. [Perform a production migration of a GitLab pipeline](5-migrate.md) -6. [Forecast potential build runner usage](6-forecast.md) +3. [Forecast potential build runner usage](3-forecast.md) +4. [Perform a dry-run migration of a GitLab pipeline](4-dry-run.md) +5. [Use custom transformers to customize Valet's behavior](5-custom-transformers.md) +6. [Perform a production migration of a GitLab pipeline](6-migrate.md) ## Troubleshoot the Valet CLI @@ -79,7 +81,8 @@ The CLI extension for Valet can be manually installed by following these steps: - Verify the result of the install contains: - ```bash + ```console + $ gh extension install github/gh-valet ✓ Installed extension github/gh-valet ``` From 90838a009f66e4caa6567a08e0244599b2823528 Mon Sep 17 00:00:00 2001 From: Matisse Hack Date: Fri, 16 Sep 2022 15:51:48 -0700 Subject: [PATCH 61/69] Revert to PR screenshot --- jenkins/6-migrate.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/jenkins/6-migrate.md b/jenkins/6-migrate.md index e922bec..773b929 100644 --- a/jenkins/6-migrate.md +++ b/jenkins/6-migrate.md @@ -42,15 +42,7 @@ Answer the following questions before running a `migrate` command: The first thing we should notice about the pull request is that there is a list of manual steps to complete: -> Pipeline migrated from [Jenkins](http://localhost:8080/job/monas_dev_work/job/monas_freestyle) 🎉 -> -> ## Manual steps -> -> Perform the follow steps to complete the migration: -> -> ### monas_dev_work/monas_freestyle -> -> - [ ] Ensure secret is available: `${{ secrets.SECRET_TEST_EXPRESSION_VAR }}` +![img](https://user-images.githubusercontent.com/19557880/186784161-b7882ac4-ac99-4462-b69f-f49b9202527b.png) Next, review the workflow you are adding by clicking on the `Files changed` tab. This is where you double check that everything looks good. If it didn't, you could push commits with the required changes, prior to merging. From c104913e5040ec469d172c157f77589d679ab9db Mon Sep 17 00:00:00 2001 From: Matisse Hack Date: Fri, 16 Sep 2022 15:51:59 -0700 Subject: [PATCH 62/69] Use code block for markdown --- jenkins/2-audit.md | 206 ++++++++++++++++++++++++--------------------- 1 file changed, 110 insertions(+), 96 deletions(-) diff --git a/jenkins/2-audit.md b/jenkins/2-audit.md index 1fcc5cc..f637503 100644 --- a/jenkins/2-audit.md +++ b/jenkins/2-audit.md @@ -69,24 +69,28 @@ The audit summary, logs, config files, jenkinsfiles, and transformed workflows w The pipeline summary section contains high level statistics regarding the conversion rate done by Valet: -> Total: __7__ -> -> - Successful: __3 (42%)__ -> - Partially successful: __3 (42%)__ -> - Unsupported: __1 (14%)__ -> - Failed: __0 (0%)__ -> -> ### Job types -> -> Supported: __6 (85%)__ -> -> - flow-definition: __3__ -> - project: __2__ -> - org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject: __1__ -> -> Unsupported: __1 (14%)__ -> -> - scripted: __1__ +```md +## Pipelines + +Total: **7** + +- Successful: **3 (42%)** +- Partially successful: **3 (42%)** +- Unsupported: **1 (14%)** +- Failed: **0 (0%)** + +### Job types + +Supported: **6 (85%)** + +- flow-definition: **3** +- project: **2** +- org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject: **1** + +Unsupported: **1 (14%)** + +- scripted: **1** +``` Here are some key terms in the “Pipelines” section in the above example: @@ -107,31 +111,35 @@ The "Job types" section will summarize which types of pipelines are being used a The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by Valet. -> Total: __17__ -> -> Known: __13 (76%)__ -> -> - echo: __6__ -> - hudson.tasks.Shell: __3__ -> - junit: __2__ -> - archiveArtifacts: __1__ -> - sh: __1__ -> -> Unknown: __3 (17%)__ -> -> - sleep: __2__ -> - hudson.plugins.git.GitPublisher: __1__ -> -> Unsupported: __1 (5%)__ -> -> - hudson.tasks.Mailer: __1__ -> -> Actions: __22__ -> -> - run: __10__ -> - actions/checkout@v2: __9__ -> - EnricoMi/publish-unit-test-result-action@v1.7: __2__ -> - actions/upload-artifact@v2: __1__ +```md +### Build steps + +Total: **17** + +Known: **13 (76%)** + +- echo: **6** +- hudson.tasks.Shell: **3** +- junit: **2** +- archiveArtifacts: **1** +- sh: **1** + +Unknown: **3 (17%)** + +- sleep: **2** +- hudson.plugins.git.GitPublisher: **1** + +Unsupported: **1 (5%)** + +- hudson.tasks.Mailer: **1** + +Actions: **22** + +- run: **10** +- actions/checkout@v2: **9** +- EnricoMi/publish-unit-test-result-action@v1.7: **2** +- actions/upload-artifact@v2: **1** +``` Here are some key terms in the "Build steps" section in the above example: @@ -150,17 +158,21 @@ There is an equivalent breakdown of build triggers, environment variables, and o The manual tasks summary section presents an overview of the manual tasks that you will need to perform that Valet is not able to complete automatically. -> Total: __9__ -> -> Secrets: __2__ -> -> - `${{ secrets.SECRET_TEST_EXPRESSION_VAR }}`: __1__ -> - `${{ secrets.EXPRESSION_FIRST_VAR }}`: __1__ -> -> Self hosted runners: __7__ -> -> - `TeamARunner`: __6__ -> - `DemoRunner`: __1__ +```md +### Manual tasks + +Total: **9** + +Secrets: **2** + +- `${{ secrets.SECRET_TEST_EXPRESSION_VAR }}`: **1** +- `${{ secrets.EXPRESSION_FIRST_VAR }}`: **1** + +Self hosted runners: **7** + +- `TeamARunner`: **6** +- `DemoRunner`: **1** +``` Here are some key terms in the “Manual tasks” section in the above example: @@ -171,48 +183,50 @@ Here are some key terms in the “Manual tasks” section in the above example: The final section of the audit report provides a manifest of all of the files that are written to disk during the audit. These files include: -> ### Successful -> -> #### demo_pipeline -> -> - [demo_pipeline.yml](demo_pipeline.yml) -> - [demo_pipeline.config.json](demo_pipeline.config.json) -> - [demo_pipeline.jenkinsfile](demo_pipeline.jenkinsfile) -> -> #### monas_dev_work/monas_freestyle -> -> - [monas_dev_work/monas_freestyle.yml](monas_dev_work/monas_freestyle.yml) -> - [monas_dev_work/monas_freestyle.config.json](monas_dev_work/monas_freestyle.config.json) -> -> #### test_mutlibranch_pipeline -> -> - [test_mutlibranch_pipeline.config.json](test_mutlibranch_pipeline.config.json) -> -> ### Partially successful -> -> #### monas_dev_work/monas_pipeline -> -> - [monas_dev_work/monas_pipeline.yml](monas_dev_work/monas_pipeline.yml) -> - [monas_dev_work/monas_pipeline.config.json](monas_dev_work/monas_pipeline.config.json) -> - [monas_dev_work/monas_pipeline.jenkinsfile](monas_dev_work/monas_pipeline.jenkinsfile) -> -> #### test_freestyle_project -> -> - [test_freestyle_project.yml](test_freestyle_project.yml) -> - [test_freestyle_project.config.json](test_freestyle_project.config.json) -> -> #### test_pipeline -> -> - [test_pipeline.yml](test_pipeline.yml) -> - [test_pipeline.config.json](test_pipeline.config.json) -> - [test_pipeline.jenkinsfile](test_pipeline.jenkinsfile) -> -> ### Failed -> -> #### groovy_script -> -> - [groovy_script.error.txt](groovy_script.error.txt) -> - [groovy_script.config.json](groovy_script.config.json) +```md +### Successful + +#### demo_pipeline + +- [demo_pipeline.yml](demo_pipeline.yml) +- [demo_pipeline.config.json](demo_pipeline.config.json) +- [demo_pipeline.jenkinsfile](demo_pipeline.jenkinsfile) + +#### monas_dev_work/monas_freestyle + +- [monas_dev_work/monas_freestyle.yml](monas_dev_work/monas_freestyle.yml) +- [monas_dev_work/monas_freestyle.config.json](monas_dev_work/monas_freestyle.config.json) + +#### test_mutlibranch_pipeline + +- [test_mutlibranch_pipeline.config.json](test_mutlibranch_pipeline.config.json) + +### Partially successful + +#### monas_dev_work/monas_pipeline + +- [monas_dev_work/monas_pipeline.yml](monas_dev_work/monas_pipeline.yml) +- [monas_dev_work/monas_pipeline.config.json](monas_dev_work/monas_pipeline.config.json) +- [monas_dev_work/monas_pipeline.jenkinsfile](monas_dev_work/monas_pipeline.jenkinsfile) + +#### test_freestyle_project + +- [test_freestyle_project.yml](test_freestyle_project.yml) +- [test_freestyle_project.config.json](test_freestyle_project.config.json) + +#### test_pipeline + +- [test_pipeline.yml](test_pipeline.yml) +- [test_pipeline.config.json](test_pipeline.config.json) +- [test_pipeline.jenkinsfile](test_pipeline.jenkinsfile) + +### Failed + +#### groovy_script + +- [groovy_script.error.txt](groovy_script.error.txt) +- [groovy_script.config.json](groovy_script.config.json) +``` Each pipeline will have a variety of files written that include: From 230c4e2f57392a52554c998093f9f28f778c5c39 Mon Sep 17 00:00:00 2001 From: Matisse Hack Date: Fri, 16 Sep 2022 15:57:25 -0700 Subject: [PATCH 63/69] Fix forecast markdown block --- jenkins/3-forecast.md | 50 ++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/jenkins/3-forecast.md b/jenkins/3-forecast.md index 7344c0a..7196536 100644 --- a/jenkins/3-forecast.md +++ b/jenkins/3-forecast.md @@ -52,30 +52,32 @@ The forecast report, logs, and completed job data will be located within the `tm The "Total" section of the forecast report contains high level statistics related to all the jobs completed after the `--start-date` CLI option: -> - Job count: __73__ -> - Pipeline count: __6__ -> -> - Execution time -> -> - Total: __27,057 minutes__ -> - Median: __2 minutes__ -> - P90: __19 minutes__ -> - Min: __0 minutes__ -> - Max: __15,625 minutes__ -> -> - Queue time -> -> - Median: __0 minutes__ -> - P90: __0 minutes__ -> - Min: __0 minutes__ -> - Max: __0 minutes__ -> -> - Concurrent jobs -> -> - Median: __1__ -> - P90: __3__ -> - Min: __0__ -> - Max: __29__ +```md +- Job count: **73** +- Pipeline count: **6** + +- Execution time + + - Total: **27,057 minutes** + - Median: **2 minutes** + - P90: **19 minutes** + - Min: **0 minutes** + - Max: **15,625 minutes** + +- Queue time + + - Median: **0 minutes** + - P90: **0 minutes** + - Min: **0 minutes** + - Max: **0 minutes** + +- Concurrent jobs + + - Median: **1** + - P90: **3** + - Min: **0** + - Max: **29** +``` Here are some key terms of items defined in the forecast report: From f848c682f3192a7dbb932535c649d101734d4b09 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Mon, 19 Sep 2022 12:55:34 -0700 Subject: [PATCH 64/69] Set DOCKER_ARGS variable in codespace --- .devcontainer/devcontainer.json | 3 +++ gitlab/bootstrap/setup.sh | 4 ---- jenkins/bootstrap/setup.sh | 4 ---- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f1f0b7a..40f6a92 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -13,6 +13,9 @@ "--privileged", "--init" ], + "remoteEnv": { + "DOCKER_ARGS": "--network=host" + }, // Add the IDs of extensions you want installed when the container is created. "extensions": [ "ms-azuretools.vscode-docker" diff --git a/gitlab/bootstrap/setup.sh b/gitlab/bootstrap/setup.sh index 021ce64..27006ba 100755 --- a/gitlab/bootstrap/setup.sh +++ b/gitlab/bootstrap/setup.sh @@ -33,10 +33,6 @@ else docker exec -it gitlab update-permissions &> /dev/null fi -# allow valet to talk to GitLab by removing network isolation between containers -export DOCKER_ARGS="--network=host" -`grep -q "export DOCKER_ARGS=" ~/.bashrc || echo 'export DOCKER_ARGS="--network=host"' >> ~/.bashrc` - echo -e "Waiting for GitLab to be ready. This might take a while \U23F0" until $(curl --output /dev/null --silent --head --fail http://localhost); do printf '.' diff --git a/jenkins/bootstrap/setup.sh b/jenkins/bootstrap/setup.sh index 5947fa4..e843745 100755 --- a/jenkins/bootstrap/setup.sh +++ b/jenkins/bootstrap/setup.sh @@ -18,10 +18,6 @@ else docker run -d --name jenkins -p 8080:8080 --env JENKINS_ADMIN_ID=$username --env JENKINS_ADMIN_PASSWORD=$password jenkins:$container_name fi -# allow valet to talk to Jenkins by removing network isolation between containers -export DOCKER_ARGS="--network=host" -grep -q "export DOCKER_ARGS=" ~/.bashrc || echo 'export DOCKER_ARGS="--network=host"' >> ~/.bashrc - echo -e "\nWaiting for Jenkins to start..." while ! curl -s http://localhost:8080/ > /dev/null; do printf "." From cf5156055a957a4cfb3c56565dce7acc74863e3b Mon Sep 17 00:00:00 2001 From: Nate Rickard Date: Mon, 19 Sep 2022 16:58:24 -0400 Subject: [PATCH 65/69] output to tmp/dry-run for consistency --- gitlab/5-custom-transformers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gitlab/5-custom-transformers.md b/gitlab/5-custom-transformers.md index 7466dc9..cce52f3 100644 --- a/gitlab/5-custom-transformers.md +++ b/gitlab/5-custom-transformers.md @@ -18,7 +18,7 @@ In this lab you will build upon the `dry-run` command to override Valet's defaul You will be performing a `dry-run` command to inspect the workflow that is converted by default. Run the following command within the codespace terminal: ```bash -gh valet dry-run gitlab --output-dir tmp --namespace valet --project terraform-example +gh valet dry-run gitlab --output-dir tmp/dry-run --namespace valet --project terraform-example ``` The converted workflow that is generated by the above command can be seen below: @@ -95,7 +95,7 @@ This method can use any valid ruby syntax and should return a `Hash` that repres Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: ```bash -gh valet dry-run gitlab --output-dir tmp --namespace valet --project terraform-example --custom-transformers transformers.rb +gh valet dry-run gitlab --output-dir tmp/dry-run --namespace valet --project terraform-example --custom-transformers transformers.rb ``` The converted workflow that is generated by the above command will now use the custom logic for the `artifacts.terraform` step. From f7a72f901ddbdf54bbcd97fe5cf39973c6ff884b Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Mon, 19 Sep 2022 14:02:05 -0700 Subject: [PATCH 66/69] Add default settings in codespace --- .devcontainer/devcontainer.json | 44 +++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 40f6a92..4f970ad 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,23 +2,29 @@ "name": "Codespace to perform Valet Labs", "image": "mcr.microsoft.com/vscode/devcontainers/universal:linux", "remoteUser": "codespace", - "overrideCommand": false, - "mounts": [ - "source=codespaces-linux-var-lib-docker,target=/var/lib/docker,type=volume" - ], - "runArgs": [ - "--cap-add=SYS_PTRACE", - "--security-opt", - "seccomp=unconfined", - "--privileged", - "--init" - ], - "remoteEnv": { + "overrideCommand": false, + "mounts": [ + "source=codespaces-linux-var-lib-docker,target=/var/lib/docker,type=volume" + ], + "runArgs": [ + "--cap-add=SYS_PTRACE", + "--security-opt", + "seccomp=unconfined", + "--privileged", + "--init" + ], + "remoteEnv": { "DOCKER_ARGS": "--network=host" - }, - // Add the IDs of extensions you want installed when the container is created. - "extensions": [ - "ms-azuretools.vscode-docker" - ], - "postCreateCommand": "gh extension install github/gh-valet || echo 'Could not auto-build. Skipping.' " -} + }, + "customizations": { + "vscode": { + "settings": { + "files.autoSave": "onFocusChange" + }, + "extensions": [ + "ms-azuretools.vscode-docker" + ] + } + }, + "postCreateCommand": "gh extension install github/gh-valet || echo 'Could not auto-build. Skipping.' " +} \ No newline at end of file From aa600253560d3fa58ad58c264d015a1980ea1c54 Mon Sep 17 00:00:00 2001 From: Nate Rickard Date: Mon, 19 Sep 2022 17:03:40 -0400 Subject: [PATCH 67/69] clarify placement of env --- azure_devops/5-custom-transformers.md | 2 +- gitlab/5-custom-transformers.md | 2 +- jenkins/5-custom-transformers.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/azure_devops/5-custom-transformers.md b/azure_devops/5-custom-transformers.md index 8b2658a..5b72d1f 100644 --- a/azure_devops/5-custom-transformers.md +++ b/azure_devops/5-custom-transformers.md @@ -149,7 +149,7 @@ Open the workflow that is generated and inspect the contents. Now the `DotnetCor You can also use custom transformers to edit the values of environment variables in converted workflows. In this example, you will be updating the `BUILDCONFIGURATION` environment variable to be `Debug` instead of `Release`. -To do this, add the following code to the `transformers.rb` file. +To do this, add the following code at the top of the `transformers.rb` file. ```ruby env "BUILDCONFIGURATION", "Debug" diff --git a/gitlab/5-custom-transformers.md b/gitlab/5-custom-transformers.md index cce52f3..77a5fca 100644 --- a/gitlab/5-custom-transformers.md +++ b/gitlab/5-custom-transformers.md @@ -119,7 +119,7 @@ end You can also use custom transformers to edit the values of environment variables in converted workflows. In this example, you will update the `PLAN_JSON` environment variable to be `custom_plan.json` instead of `plan.json`. -To do this, add the following code to the `transformers.rb` file. +To do this, add the following code at the top of the `transformers.rb` file. ```ruby env "PLAN_JSON", "custom_plan.json" diff --git a/jenkins/5-custom-transformers.md b/jenkins/5-custom-transformers.md index 91a9f6e..913fab4 100644 --- a/jenkins/5-custom-transformers.md +++ b/jenkins/5-custom-transformers.md @@ -205,7 +205,7 @@ Now you can perform another `dry-run` command with the `--custom-transformers` C You can also use custom transformers to edit the values of environment variables in converted workflows. In this example, you will be updating the `DB_ENGINE` environment variable to be `mongodb` instead of `sqlite`. -To do this, add the following code to the `transformers.rb` file. +To do this, add the following code at the top of the `transformers.rb` file. ```ruby env "DB_ENGINE", "mongodb" From 216b844d6bd75485acdfbb192a0b73c003360f4b Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Mon, 19 Sep 2022 15:19:57 -0700 Subject: [PATCH 68/69] Set installation_type to labs --- .devcontainer/devcontainer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4f970ad..ba5c350 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -14,7 +14,8 @@ "--init" ], "remoteEnv": { - "DOCKER_ARGS": "--network=host" + "DOCKER_ARGS": "--network=host", + "INSTALLATION_TYPE": "labs" }, "customizations": { "vscode": { From 59b717f5460cf60b1a56239276a9866a75ee8d78 Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Mon, 19 Sep 2022 16:46:46 -0700 Subject: [PATCH 69/69] Update .devcontainer/devcontainer.json Co-authored-by: Luke Cheung Engle <99493186+luke-engle@users.noreply.github.com> --- .devcontainer/devcontainer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ba5c350..7145591 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -20,7 +20,8 @@ "customizations": { "vscode": { "settings": { - "files.autoSave": "onFocusChange" + "files.autoSave": "onFocusChange", + "editor.tabSize": 2 }, "extensions": [ "ms-azuretools.vscode-docker"