Skip to content

Commit 2c02206

Browse files
authored
Update CLI versioning & CI pipelines (#4499)
1 parent d37b3dd commit 2c02206

File tree

12 files changed

+232
-41
lines changed

12 files changed

+232
-41
lines changed

eng/build/Version.props

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<Project>
2+
3+
<!--
4+
Import the first 'Directory.Version.props' seen from project being built up.
5+
This allows each directory cone to set its own versioning at the time this file needs it set.
6+
-->
7+
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), Directory.Version.props))/Directory.Version.props"
8+
Condition="'$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), Directory.Version.props))' != ''" />
9+
10+
<PropertyGroup>
11+
<CI>false</CI>
12+
<CI Condition="'$(TF_BUILD)' == 'true'">true</CI>
13+
<ContinuousIntegrationBuild>$(CI)</ContinuousIntegrationBuild>
14+
<TreatWarningsAsErrors Condition="'$(CI)' == 'true'">true</TreatWarningsAsErrors>
15+
16+
<BuildReason>dev</BuildReason>
17+
<BuildReason Condition="'$(BUILD_REASON)' != ''">ci</BuildReason>
18+
<BuildReason Condition="'$(BUILD_REASON)' == 'PullRequest'">pr</BuildReason>
19+
20+
<!-- Only set public release if this is a release tag or a release branch -->
21+
<!-- tag must be either 'v{Version}' or {name}-v{Version} for a match -->
22+
<!-- release branch must be refs/heads/release/* -->
23+
<PublicReleaseTag Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(BUILD_SOURCEBRANCH), `refs/tags/(?:.*-)?v.*`))">$(BUILD_SOURCEBRANCHNAME)</PublicReleaseTag>
24+
<PublicRelease>false</PublicRelease>
25+
<PublicRelease Condition="'$(PublicReleaseTag)' != ''">true</PublicRelease>
26+
<PublicRelease Condition="'$(BUILD_SOURCEBRANCH)' != '' AND $(BUILD_SOURCEBRANCH.StartsWith('refs/heads/release/'))">true</PublicRelease>
27+
</PropertyGroup>
28+
29+
<PropertyGroup>
30+
<VersionPrefix Condition="'$(VersionPrefix)' == ''">1.0.0</VersionPrefix>
31+
<_BuildNumber>$([System.DateTime]::Now.ToString(yyyyMMdd))</_BuildNumber>
32+
<_BuildNumberYY>$(_BuildNumber.Substring(2, 2))</_BuildNumberYY>
33+
<_BuildNumberMM>$(_BuildNumber.Substring(4, 2))</_BuildNumberMM>
34+
<_BuildNumberDD>$(_BuildNumber.Substring(6, 2))</_BuildNumberDD>
35+
36+
<!-- The build number should be < 65,535 (Windows limitation). We convert into a short date to accommodate that. -->
37+
<!-- SHORT_DATE := yy * 1000 + MM * 50 + dd -->
38+
<BuildNumber>$([MSBuild]::Add($([MSBuild]::Add($([MSBuild]::Multiply($(_BuildNumberYY), 1000)), $([MSBuild]::Multiply($(_BuildNumberMM), 50)))), $(_BuildNumberDD)))</BuildNumber>
39+
<BuildCounter Condition="'$(BUILD_COUNTER)' != ''">$(BUILD_COUNTER)</BuildCounter>
40+
<BuildCounter Condition="'$(BuildCounter)' == ''">0</BuildCounter>
41+
42+
<!-- Major.Minor.Patch -> Major.Minor.0.0 -->
43+
<AssemblyVersion>$(VersionPrefix.Substring(0, $(VersionPrefix.LastIndexOf('.')))).0.0</AssemblyVersion>
44+
</PropertyGroup>
45+
46+
<PropertyGroup Condition="'$(CI)' != 'true'">
47+
<!-- Constant file version for local dev. -->
48+
<FileVersion>42.42.42.4242</FileVersion>
49+
</PropertyGroup>
50+
51+
<PropertyGroup Condition="'$(CI)' == 'true'">
52+
<FileVersion>$(VersionPrefix).$(BuildNumber)</FileVersion>
53+
</PropertyGroup>
54+
55+
</Project>

eng/build/Version.targets

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<Project>
2+
3+
<!-- Local build versioning. By default we keep it simple. -->
4+
<PropertyGroup Condition="'$(CI)' != 'true'">
5+
<VersionSuffix Condition="'$(VersionSuffix)' != ''">$(VersionSuffix).$(BuildReason)</VersionSuffix>
6+
<VersionSuffix Condition="'$(VersionSuffix)' == ''">$(BuildReason)</VersionSuffix>
7+
<Version>$(VersionPrefix)-$(VersionSuffix)</Version>
8+
</PropertyGroup>
9+
10+
<!-- CI versioning steps -->
11+
<PropertyGroup Condition="'$(CI)' == 'true' AND '$(PublicRelease)' != 'true'">
12+
<VersionSuffix Condition="'$(VersionSuffix)' != ''">$(VersionSuffix).$(BuildReason).$(BuildNumber).$(BuildCounter)</VersionSuffix>
13+
<VersionSuffix Condition="'$(VersionSuffix)' == ''">$(BuildReason).$(BuildNumber).$(BuildCounter)</VersionSuffix>
14+
<Version>$(VersionPrefix)-$(VersionSuffix)</Version>
15+
</PropertyGroup>
16+
17+
<!-- When building in Azure pipelines, update the build number. -->
18+
<!-- Specifically use '$(TF_BUILD)' and not '$(CI)' to ensure we are in Azure pipelines. -->
19+
<Target Name="UpdateAzDoBuildNumber" Condition="'$(TF_BUILD)' == 'true' AND '$(UpdateBuildNumber)' == 'true'" BeforeTargets="BeforeBuild">
20+
<Message Importance="high" Text="##vso[build.updatebuildnumber]inproc_$(Version)" />
21+
</Target>
22+
23+
</Project>
File renamed without changes.

eng/ci/official-build.yml

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ extends:
4242
compiled:
4343
enabled: true
4444
runSourceLanguagesInSourceAnalysis: true
45-
stages:
45+
stages:
4646
- stage: BuildAndTest
4747
jobs:
4848
- template: /eng/ci/templates/official/jobs/build-test.yml@self
@@ -52,4 +52,38 @@ extends:
5252
- template: /eng/ci/templates/official/jobs/build-test.yml@self
5353
parameters:
5454
artifactTargetFramework: inproc8
55-
jobTitle: BuildInproc8
55+
jobTitle: BuildInproc8
56+
57+
- stage: Merge
58+
dependsOn: 'BuildAndTest'
59+
60+
jobs:
61+
- job: MergeArtifacts
62+
displayName: 'Merge artifacts'
63+
64+
templateContext:
65+
type: artifactJob
66+
67+
inputs:
68+
- input: pipelineArtifact
69+
artifactName: func-cli-inproc6
70+
targetPath: $(Build.ArtifactStagingDirectory)/func-cli-inproc/inproc6
71+
72+
- input: pipelineArtifact
73+
artifactName: func-cli-inproc8
74+
targetPath: $(Build.ArtifactStagingDirectory)/func-cli-inproc/inproc8
75+
76+
outputs:
77+
- output: pipelineArtifact
78+
targetPath: $(Build.ArtifactStagingDirectory)/func-cli-inproc
79+
artifactName: 'func-cli-inproc'
80+
81+
- stage: UploadToNightlyFeed
82+
dependsOn: 'Merge'
83+
condition: and(succeeded(), eq(variables['Build.Reason'], 'schedule'))
84+
85+
jobs:
86+
- template: /eng/ci/templates/official/jobs/upload-artifact-to-feed.yml@self
87+
parameters:
88+
artifactName: 'func-cli-inproc'
89+
packageName: 'func-cli-inproc'

eng/ci/templates/official/jobs/build-test.yml

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ jobs:
1818
steps:
1919
- pwsh: . "tools/start-emulators.ps1" -NoWait
2020
displayName: "Start emulators (NoWait)"
21+
2122
- pwsh: |
2223
$simulateReleaseBuild = $null
2324
if (-not([bool]::TryParse($env:SimulateReleaseBuild, [ref] $simulateReleaseBuild)))
@@ -37,6 +38,7 @@ jobs:
3738
env:
3839
BuildSourceBranchName: $(Build.SourceBranchName)
3940
SimulateReleaseBuild: $(SimulateReleaseBuild)
41+
4042
- pwsh: |
4143
$isIntegrationBuild = $false
4244
if ($env:INTEGRATIONBUILDNUMBER -like "PreRelease*-*")
@@ -46,20 +48,25 @@ jobs:
4648
Write-Host "##vso[task.setvariable variable=IsIntegrationBuild]$isIntegrationBuild"
4749
Write-Host "IsIntegrationBuild: $isIntegrationBuild"
4850
displayName: 'Set IsIntegrationBuild variable'
51+
4952
- pwsh: |
5053
Write-Host "Target branch: '$(DEVOPS_REPO_BRANCH)'"
5154
displayName: Set up environment variables
55+
5256
- task: NodeTool@0
5357
inputs:
5458
versionSpec: '18.x'
59+
5560
- pwsh: |
5661
Import-Module ".\pipelineUtilities.psm1" -Force
5762
Install-Dotnet
5863
displayName: 'Install .NET 6.0 and 3.1'
64+
5965
- task: NuGetToolInstaller@1
6066
inputs:
6167
versionSpec:
6268
displayName: Install Nuget tool
69+
6370
- task: AzureCLI@2
6471
displayName: Login via Azure CLI to acquire access token
6572
inputs:
@@ -71,15 +78,18 @@ jobs:
7178
# acquire access token from Azure CLI and export it to AZURE_MANAGEMENT_ACCESS_TOKEN
7279
$accessToken = (az account get-access-token --query "accessToken" | % { $_.Trim('"') })
7380
echo "##vso[task.setvariable variable=azure_management_access_token]$accessToken"
81+
7482
- pwsh: |
7583
.\validateWorkerVersions.ps1
7684
displayName: 'Validate worker versions'
7785
condition: ne(variables['skipWorkerVersionValidation'], 'true')
86+
7887
- task: PowerShell@2
7988
displayName: "Run Check Vulnerabilities Script"
8089
inputs:
8190
filePath: '$(Build.SourcesDirectory)/check-vulnerabilities.ps1'
8291
workingDirectory: '$(Build.SourcesDirectory)'
92+
8393
- pwsh: |
8494
.\build.ps1
8595
env:
@@ -92,6 +102,13 @@ jobs:
92102
IntegrationBuildNumber: $(INTEGRATIONBUILDNUMBER)
93103
displayName: 'Executing build script'
94104
105+
- task: PublishTestResults@2
106+
inputs:
107+
testResultsFormat: 'VSTest'
108+
testResultsFiles: '**/*.trx'
109+
failTaskOnFailedTests: true
110+
condition: succeededOrFailed()
111+
95112
- template: ci/sign-files.yml@eng
96113
parameters:
97114
displayName: 'Authenticode signing (dll)'
@@ -122,13 +139,6 @@ jobs:
122139
}
123140
]
124141
125-
- task: PublishTestResults@2
126-
inputs:
127-
testResultsFormat: 'VSTest'
128-
testResultsFiles: '**/*.trx'
129-
failTaskOnFailedTests: true
130-
condition: succeededOrFailed()
131-
132142
- template: ci/sign-files.yml@eng
133143
parameters:
134144
displayName: 'Third party signing (dll)'
@@ -251,34 +261,16 @@ jobs:
251261
IntegrationBuildNumber: $(INTEGRATIONBUILDNUMBER)
252262
displayName: 'Move artifacts'
253263
254-
- ${{ if eq(variables['Build.Reason'], 'Schedule') }}:
255-
- task: PowerShell@2
256-
displayName: 'Generate nightly build package version for feed'
257-
inputs:
258-
targetType: filePath
259-
filePath: '$(Build.SourcesDirectory)/generateNightlyBuildPackageVersion.ps1'
260-
261-
- task: UniversalPackages@0
262-
displayName: Publish
263-
inputs:
264-
command: publish
265-
publishDirectory: '$(Build.ArtifactStagingDirectory)'
266-
vstsFeedPublish: 'internal/core-tools-nightly-build'
267-
vstsFeedPackagePublish: 'func-cli-${{ parameters.artifactTargetFramework }}'
268-
versionOption: custom
269-
versionPublish: '$(NightlyBuildVersion)'
270-
packagePublishDescription: 'Core tools ${{ parameters.artifactTargetFramework }} nightly build'
271-
272264
- task: 1ES.PublishPipelineArtifact@1
273265
inputs:
274266
targetPath: '$(Build.ArtifactStagingDirectory)'
275267
artifactName: 'func-cli-${{ parameters.artifactTargetFramework }}'
276268
artifactType: 'pipeline'
277-
269+
278270
- pwsh: |
279271
.\uploadContentToStorageAccount.ps1 -StorageAccountName $env:IntegrationTestsStorageAccountName -StorageAccountKey $env:IntegrationTestsStorageAccountKey -SourcePath '$(Build.ArtifactStagingDirectory)'
280272
env:
281273
IntegrationTestsStorageAccountName: $(IntegrationTestsStorageAccountName)
282274
IntegrationTestsStorageAccountKey: $(IntegrationTestsStorageAccountKey)
283275
displayName: 'Upload Core Tools build to the storage account for Integration Tests'
284-
condition: eq(variables.IsIntegrationBuild, 'true')
276+
condition: eq(variables.IsIntegrationBuild, 'true')
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
parameters:
2+
- name: artifactName
3+
type: string
4+
- name: packageName
5+
type: string
6+
7+
jobs:
8+
- job: UploadArtifactToFeed
9+
displayName: 'Upload artifact to Feed'
10+
timeoutInMinutes: "180"
11+
12+
pool:
13+
name: 1es-pool-azfunc-public
14+
image: 1es-windows-2022
15+
os: windows
16+
17+
steps:
18+
- task: DownloadPipelineArtifact@2
19+
displayName: Download artifact
20+
inputs:
21+
artifact: '{{ parameters.artifactName }}'
22+
path: $(Build.ArtifactStagingDirectory)/drop
23+
24+
- task: UniversalPackages@0
25+
displayName: Publish to feed
26+
inputs:
27+
command: publish
28+
publishDirectory: '$(Build.ArtifactStagingDirectory)/drop'
29+
vstsFeedPublish: 'internal/core-tools-nightly-build'
30+
vstsFeedPackagePublish: '{{ parameters.packageName }}'
31+
versionOption: custom
32+
versionPublish: '$(Build.BuildNumber)'
33+
packagePublishDescription: 'Core tools default nightly build'

src/Azure.Functions.Cli/Azure.Functions.Cli.csproj

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,6 @@
44
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
55
<AssemblyName>func</AssemblyName>
66
<RuntimeIdentifiers>win-x64;win-x86;win-arm64;linux-x64;osx-x64;osx-arm64</RuntimeIdentifiers>
7-
<BuildNumber Condition=" '$(BuildNumber)' == '' ">1</BuildNumber>
8-
<MajorMinorProductVersion>4.0</MajorMinorProductVersion>
9-
<Version>$(MajorMinorProductVersion).$(BuildNumber)</Version>
10-
<AssemblyVersion>$(MajorMinorProductVersion).$(BuildNumber)</AssemblyVersion>
11-
<FileVersion>$(MajorMinorProductVersion).$(BuildNumber)</FileVersion>
12-
<CommitHash Condition="$(CommitHash) == ''">N/A</CommitHash>
13-
<IntegrationBuildNumberInfo Condition="$(IntegrationBuildNumber) != ''">Integration build number: $(IntegrationBuildNumber)</IntegrationBuildNumberInfo>
14-
<InformationalVersion>$(FileVersion) Commit hash: $(CommitHash) $(IntegrationBuildNumberInfo)</InformationalVersion>
157
<Company>Microsoft</Company>
168
<Authors>Microsoft</Authors>
179
<Title>Azure Functions Cli</Title>

src/Azure.Functions.Cli/Common/Constants.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.ObjectModel;
33
using System.Reflection;
44
using Azure.Functions.Cli.Helpers;
5+
using Azure.Functions.Cli.Extensions;
56

67
namespace Azure.Functions.Cli.Common
78
{
@@ -96,10 +97,9 @@ internal static class Constants
9697
public const string AzureDevSessionsPortSuffixPlaceholder = "<port>";
9798
// Sample format https://n12abc3t-<port>.asse.devtunnels.ms/
9899

100+
public static string CliVersion => typeof(Constants).Assembly.GetCliVersion();
99101

100-
public static string CliVersion => typeof(Constants).GetTypeInfo().Assembly.GetName().Version.ToString(3);
101-
102-
public static string CliDetailedVersion = typeof(Constants).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? string.Empty;
102+
public static string CliDetailedVersion => typeof(Constants).Assembly.GetInformationalVersion();
103103

104104
public static string CliUserAgent = $"functions-core-tools/{Constants.CliVersion}";
105105

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<Project>
2+
3+
<Import Project="$(MSBuildThisFileDirectory)../../eng/build/Version.props" />
4+
5+
</Project>
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<Project>
22

3-
<Import Project="$(MSBuildThisFileDirectory)Workers.Python.Workaround.targets" Condition="'$(RuntimeIdentifier)' == 'win-arm64'" />
3+
<Import Project="$(MSBuildThisFileDirectory)../../eng/build/Workers.Python.Workaround.targets" Condition="'$(RuntimeIdentifier)' == 'win-arm64'" />
4+
<Import Project="$(MSBuildThisFileDirectory)../../eng/build/Version.targets" />
45

56
</Project>

0 commit comments

Comments
 (0)