Skip to content

Commit b52ea77

Browse files
authored
Migrate to OneLocBuild (#204)
* Add OneLocBuild task * Update eng/common files
1 parent a21a401 commit b52ea77

File tree

3 files changed

+185
-0
lines changed

3 files changed

+185
-0
lines changed

azure-pipelines.yml

+6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ stages:
1818
- stage: build
1919
displayName: Build
2020
jobs:
21+
- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
22+
- template: /eng/common/templates/job/onelocbuild.yml
23+
parameters:
24+
CreatePr: false
25+
LclSource: lclFilesfromPackage
26+
LclPackageId: 'LCL-JUNO-PROD-SYMREADER'
2127
- template: /eng/common/templates/jobs/jobs.yml
2228
parameters:
2329
enableMicrobuild: true

eng/common/generate-locproject.ps1

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
Param(
2+
[Parameter(Mandatory=$true)][string] $SourcesDirectory, # Directory where source files live; if using a Localize directory it should live in here
3+
[string] $LanguageSet = 'VS_Main_Languages', # Language set to be used in the LocProject.json
4+
[switch] $UseCheckedInLocProjectJson, # When set, generates a LocProject.json and compares it to one that already exists in the repo; otherwise just generates one
5+
[switch] $CreateNeutralXlfs # Creates neutral xlf files. Only set to false when running locally
6+
)
7+
8+
# Generates LocProject.json files for the OneLocBuild task. OneLocBuildTask is described here:
9+
# https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task
10+
11+
Set-StrictMode -Version 2.0
12+
$ErrorActionPreference = "Stop"
13+
. $PSScriptRoot\tools.ps1
14+
15+
Import-Module -Name (Join-Path $PSScriptRoot 'native\CommonLibrary.psm1')
16+
17+
$exclusionsFilePath = "$SourcesDirectory\Localize\LocExclusions.json"
18+
$exclusions = @{ Exclusions = @() }
19+
if (Test-Path -Path $exclusionsFilePath)
20+
{
21+
$exclusions = Get-Content "$exclusionsFilePath" | ConvertFrom-Json
22+
}
23+
24+
Push-Location "$SourcesDirectory" # push location for Resolve-Path -Relative to work
25+
26+
# Template files
27+
$jsonFiles = @()
28+
$jsonFiles += Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\.template\.config\\localize\\en\..+\.json" } # .NET templating pattern
29+
$jsonFiles += Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "en\\strings\.json" } # current winforms pattern
30+
31+
$xlfFiles = @()
32+
33+
$allXlfFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory\*\*.xlf"
34+
$langXlfFiles = @()
35+
if ($allXlfFiles) {
36+
$null = $allXlfFiles[0].FullName -Match "\.([\w-]+)\.xlf" # matches '[langcode].xlf'
37+
$firstLangCode = $Matches.1
38+
$langXlfFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory\*\*.$firstLangCode.xlf"
39+
}
40+
$langXlfFiles | ForEach-Object {
41+
$null = $_.Name -Match "(.+)\.[\w-]+\.xlf" # matches '[filename].[langcode].xlf
42+
43+
$destinationFile = "$($_.Directory.FullName)\$($Matches.1).xlf"
44+
$xlfFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru
45+
}
46+
47+
$locFiles = $jsonFiles + $xlfFiles
48+
49+
$locJson = @{
50+
Projects = @(
51+
@{
52+
LanguageSet = $LanguageSet
53+
LocItems = @(
54+
$locFiles | ForEach-Object {
55+
$outputPath = "$(($_.DirectoryName | Resolve-Path -Relative) + "\")"
56+
$continue = $true
57+
foreach ($exclusion in $exclusions.Exclusions) {
58+
if ($outputPath.Contains($exclusion))
59+
{
60+
$continue = $false
61+
}
62+
}
63+
$sourceFile = ($_.FullName | Resolve-Path -Relative)
64+
if (!$CreateNeutralXlfs -and $_.Extension -eq '.xlf') {
65+
Remove-Item -Path $sourceFile
66+
}
67+
if ($continue)
68+
{
69+
return @{
70+
SourceFile = $sourceFile
71+
CopyOption = "LangIDOnName"
72+
OutputPath = $outputPath
73+
}
74+
}
75+
}
76+
)
77+
}
78+
)
79+
}
80+
81+
$json = ConvertTo-Json $locJson -Depth 5
82+
Write-Host "LocProject.json generated:`n`n$json`n`n"
83+
Pop-Location
84+
85+
if (!$UseCheckedInLocProjectJson) {
86+
New-Item "$SourcesDirectory\Localize\LocProject.json" -Force # Need this to make sure the Localize directory is created
87+
Set-Content "$SourcesDirectory\Localize\LocProject.json" $json
88+
}
89+
else {
90+
New-Item "$SourcesDirectory\Localize\LocProject-generated.json" -Force # Need this to make sure the Localize directory is created
91+
Set-Content "$SourcesDirectory\Localize\LocProject-generated.json" $json
92+
93+
if ((Get-FileHash "$SourcesDirectory\Localize\LocProject-generated.json").Hash -ne (Get-FileHash "$SourcesDirectory\Localize\LocProject.json").Hash) {
94+
Write-PipelineTelemetryError -Category "OneLocBuild" -Message "Existing LocProject.json differs from generated LocProject.json. Download LocProject-generated.json and compare them."
95+
96+
exit 1
97+
}
98+
else {
99+
Write-Host "Generated LocProject.json and current LocProject.json are identical."
100+
}
101+
}
+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
parameters:
2+
# Optional: dependencies of the job
3+
dependsOn: ''
4+
5+
# Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool
6+
pool:
7+
vmImage: vs2017-win2016
8+
9+
CeapexPat: $(dn-bot-ceapex-package-r) # PAT for the loc AzDO instance https://dev.azure.com/ceapex
10+
GithubPat: $(BotAccount-dotnet-bot-repo-PAT)
11+
12+
SourcesDirectory: $(Build.SourcesDirectory)
13+
CreatePr: true
14+
UseCheckedInLocProjectJson: false
15+
LanguageSet: VS_Main_Languages
16+
LclSource: lclFilesInRepo
17+
LclPackageId: ''
18+
RepoType: gitHub
19+
20+
jobs:
21+
- job: OneLocBuild
22+
23+
dependsOn: ${{ parameters.dependsOn }}
24+
25+
displayName: OneLocBuild
26+
27+
pool: ${{ parameters.pool }}
28+
29+
variables:
30+
- group: OneLocBuildVariables # Contains the CeapexPat and GithubPat
31+
- name: _GenerateLocProjectArguments
32+
value: -SourcesDirectory ${{ parameters.SourcesDirectory }}
33+
-LanguageSet "${{ parameters.LanguageSet }}"
34+
-CreateNeutralXlfs
35+
- ${{ if eq(parameters.UseCheckedInLocProjectJson, 'true') }}:
36+
- name: _GenerateLocProjectArguments
37+
value: ${{ variables._GenerateLocProjectArguments }} -UseCheckedInLocProjectJson
38+
39+
40+
steps:
41+
- task: Powershell@2
42+
inputs:
43+
filePath: $(Build.SourcesDirectory)/eng/common/generate-locproject.ps1
44+
arguments: $(_GenerateLocProjectArguments)
45+
displayName: Generate LocProject.json
46+
47+
- task: OneLocBuild@2
48+
displayName: OneLocBuild
49+
env:
50+
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
51+
inputs:
52+
locProj: Localize/LocProject.json
53+
outDir: $(Build.ArtifactStagingDirectory)
54+
lclSource: ${{ parameters.LclSource }}
55+
lclPackageId: ${{ parameters.LclPackageId }}
56+
isCreatePrSelected: ${{ parameters.CreatePr }}
57+
packageSourceAuth: patAuth
58+
patVariable: ${{ parameters.CeapexPat }}
59+
${{ if eq(parameters.RepoType, 'gitHub') }}:
60+
repoType: ${{ parameters.RepoType }}
61+
gitHubPatVariable: "${{ parameters.GithubPat }}"
62+
condition: always()
63+
64+
- task: PublishBuildArtifacts@1
65+
displayName: Publish Localization Files
66+
inputs:
67+
PathtoPublish: '$(Build.ArtifactStagingDirectory)/loc'
68+
PublishLocation: Container
69+
ArtifactName: Loc
70+
condition: always()
71+
72+
- task: PublishBuildArtifacts@1
73+
displayName: Publish LocProject.json
74+
inputs:
75+
PathtoPublish: '$(Build.SourcesDirectory)/Localize/'
76+
PublishLocation: Container
77+
ArtifactName: Loc
78+
condition: always()

0 commit comments

Comments
 (0)