Merge pull request #54 from valet-customers/fixup-azdo-labs
Address feedback on AzDO labs
This commit is contained in:
@@ -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.
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||

|
||||
@@ -40,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 -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.
|
||||
@@ -99,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)
|
||||
@@ -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 <https://dev.azure.com/:organization/:project/_build>
|
||||
- Selecting the pipeline with the name "valet-pipeline1"
|
||||
- Inspecting the URL to locate the pipeline id <https://dev.azure.com/:organization/:project/_build?definitionId=: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.
|
||||
@@ -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)
|
||||
@@ -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!
|
||||
@@ -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)
|
||||
@@ -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!
|
||||
Binary file not shown.
@@ -1,56 +0,0 @@
|
||||
|
||||
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
|
||||
@@ -1,15 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Attendees
|
||||
{
|
||||
public class Attendee
|
||||
{
|
||||
public bool AddAttendee(string added)
|
||||
{
|
||||
if (added == "exists")
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
|
||||
<PackageReference Include="xunit" Version="2.4.1" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="coverlet.collector" Version="3.0.2">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\Attendee\Attendee.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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)"
|
||||
@@ -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'
|
||||
@@ -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"
|
||||
@@ -1,15 +1,17 @@
|
||||
#!/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",
|
||||
assets_file: "azure_devops.tgz",
|
||||
pipeline_assets_dir: "pipelines",
|
||||
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,55 +74,59 @@ 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}..."
|
||||
tmp_dir = Dir.mktmpdir
|
||||
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"
|
||||
}
|
||||
}
|
||||
end
|
||||
end.flatten
|
||||
}]
|
||||
refUpdates: [{
|
||||
name: "refs/heads/main",
|
||||
oldObjectId: "0000000000000000000000000000000000000000"
|
||||
}],
|
||||
commits: [{
|
||||
comment: "Initial commit.",
|
||||
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.flatten
|
||||
}]
|
||||
}
|
||||
|
||||
post_request(uri, repository_to_create, access_token) do |response|
|
||||
result = 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
|
||||
|
||||
[result, tmp_dir]
|
||||
end
|
||||
|
||||
def create_yaml_pipelines(options, repository)
|
||||
def create_yaml_pipelines(options, repository, tmp_dir)
|
||||
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|
|
||||
root = Pathname.new(tmp_dir)
|
||||
Dir[File.join(tmp_dir, pipeline_assets_dir, "yml", "*")].each do |entry|
|
||||
puts "Creating pipeline #{entry}..."
|
||||
|
||||
pipeline_to_create = {
|
||||
@@ -170,18 +176,20 @@ def create_classic_pipelines(options, repository)
|
||||
end
|
||||
end
|
||||
|
||||
def update_forecast_source_file(options)
|
||||
def update_forecast_source_file(options, tmp_dir)
|
||||
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(tmp_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)
|
||||
File.write(File.join(root_dir, jobs_data_file), jobs_data)
|
||||
end
|
||||
|
||||
create_project(options)
|
||||
repository = create_repository(options)
|
||||
create_yaml_pipelines(options, repository)
|
||||
repository, tmp_dir = create_repository(options)
|
||||
create_yaml_pipelines(options, repository, tmp_dir)
|
||||
create_classic_pipelines(options, repository)
|
||||
update_forecast_source_file(options)
|
||||
update_forecast_source_file(options, tmp_dir)
|
||||
|
||||
puts "Success!"
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
@@ -92,11 +92,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 GitLab pipelines to Actions with Valet!
|
||||
[Perform a dry-run migration of a GitLab pipeline](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)
|
||||
@@ -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)
|
||||
[Perform a production migration of a GitLab pipeline](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!
|
||||
+1
-1
@@ -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)
|
||||
|
||||
@@ -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!
|
||||
[Perform a dry-run migration of a Jenkins pipeline](4-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.
|
||||
@@ -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)
|
||||
@@ -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!
|
||||
@@ -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)
|
||||
@@ -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!
|
||||
Reference in New Issue
Block a user