Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions eng/build/Version.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<Project>

<!--
Import the first 'Directory.Version.props' seen from project being built up.
This allows each directory cone to set its own versioning at the time this file needs it set.
-->
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), Directory.Version.props))/Directory.Version.props"
Condition="'$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), Directory.Version.props))' != ''" />

<PropertyGroup>
<CI>false</CI>
<CI Condition="'$(TF_BUILD)' == 'true'">true</CI>
<ContinuousIntegrationBuild>$(CI)</ContinuousIntegrationBuild>
<TreatWarningsAsErrors Condition="'$(CI)' == 'true'">true</TreatWarningsAsErrors>

<BuildReason>dev</BuildReason>
<BuildReason Condition="'$(BUILD_REASON)' != ''">ci</BuildReason>
<BuildReason Condition="'$(BUILD_REASON)' == 'PullRequest'">pr</BuildReason>

<!-- Only set public release if this is a release tag or a release branch -->
<!-- tag must be either 'v{Version}' or {name}-v{Version} for a match -->
<!-- release branch must be refs/heads/release/* -->
<PublicReleaseTag Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(BUILD_SOURCEBRANCH), `refs/tags/(?:.*-)?v.*`))">$(BUILD_SOURCEBRANCHNAME)</PublicReleaseTag>
<PublicRelease>false</PublicRelease>
<PublicRelease Condition="'$(PublicReleaseTag)' != ''">true</PublicRelease>
<PublicRelease Condition="'$(BUILD_SOURCEBRANCH)' != '' AND $(BUILD_SOURCEBRANCH.StartsWith('refs/heads/release/'))">true</PublicRelease>
</PropertyGroup>

<PropertyGroup>
<VersionPrefix Condition="'$(VersionPrefix)' == ''">1.0.0</VersionPrefix>
<_BuildNumber>$([System.DateTime]::Now.ToString(yyyyMMdd))</_BuildNumber>
<_BuildNumberYY>$(_BuildNumber.Substring(2, 2))</_BuildNumberYY>
<_BuildNumberMM>$(_BuildNumber.Substring(4, 2))</_BuildNumberMM>
<_BuildNumberDD>$(_BuildNumber.Substring(6, 2))</_BuildNumberDD>

<!-- The build number should be < 65,535 (Windows limitation). We convert into a short date to accommodate that. -->
<!-- SHORT_DATE := yy * 1000 + MM * 50 + dd -->
<BuildNumber>$([MSBuild]::Add($([MSBuild]::Add($([MSBuild]::Multiply($(_BuildNumberYY), 1000)), $([MSBuild]::Multiply($(_BuildNumberMM), 50)))), $(_BuildNumberDD)))</BuildNumber>
<BuildCounter Condition="'$(BUILD_COUNTER)' != ''">$(BUILD_COUNTER)</BuildCounter>
<BuildCounter Condition="'$(BuildCounter)' == ''">0</BuildCounter>

<!-- Major.Minor.Patch -> Major.Minor.0.0 -->
<AssemblyVersion>$(VersionPrefix.Substring(0, $(VersionPrefix.LastIndexOf('.')))).0.0</AssemblyVersion>
</PropertyGroup>

<PropertyGroup Condition="'$(CI)' != 'true'">
<!-- Constant file version for local dev. -->
<FileVersion>42.42.42.4242</FileVersion>
</PropertyGroup>

<PropertyGroup Condition="'$(CI)' == 'true'">
<FileVersion>$(VersionPrefix).$(BuildNumber)</FileVersion>
</PropertyGroup>

</Project>
23 changes: 23 additions & 0 deletions eng/build/Version.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<Project>

<!-- Local build versioning. By default we keep it simple. -->
<PropertyGroup Condition="'$(CI)' != 'true'">
<VersionSuffix Condition="'$(VersionSuffix)' != ''">$(VersionSuffix).$(BuildReason)</VersionSuffix>
<VersionSuffix Condition="'$(VersionSuffix)' == ''">$(BuildReason)</VersionSuffix>
<Version>$(VersionPrefix)-$(VersionSuffix)</Version>
</PropertyGroup>

<!-- CI versioning steps -->
<PropertyGroup Condition="'$(CI)' == 'true' AND '$(PublicRelease)' != 'true'">
<VersionSuffix Condition="'$(VersionSuffix)' != ''">$(VersionSuffix).$(BuildReason).$(BuildNumber).$(BuildCounter)</VersionSuffix>
<VersionSuffix Condition="'$(VersionSuffix)' == ''">$(BuildReason).$(BuildNumber).$(BuildCounter)</VersionSuffix>
<Version>$(VersionPrefix)-$(VersionSuffix)</Version>
</PropertyGroup>

<!-- When building in Azure pipelines, update the build number. -->
<!-- Specifically use '$(TF_BUILD)' and not '$(CI)' to ensure we are in Azure pipelines. -->
<Target Name="UpdateAzDoBuildNumber" Condition="'$(TF_BUILD)' == 'true' AND '$(UpdateBuildNumber)' == 'true'" BeforeTargets="BeforeBuild">
<Message Importance="high" Text="##vso[build.updatebuildnumber]inproc_$(Version)" />
</Target>

</Project>
38 changes: 36 additions & 2 deletions eng/ci/official-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ extends:
compiled:
enabled: true
runSourceLanguagesInSourceAnalysis: true
stages:
stages:
- stage: BuildAndTest
jobs:
- template: /eng/ci/templates/official/jobs/build-test.yml@self
Expand All @@ -52,4 +52,38 @@ extends:
- template: /eng/ci/templates/official/jobs/build-test.yml@self
parameters:
artifactTargetFramework: inproc8
jobTitle: BuildInproc8
jobTitle: BuildInproc8

- stage: Merge
dependsOn: 'BuildAndTest'

jobs:
- job: MergeArtifacts
displayName: 'Merge artifacts'

templateContext:
type: artifactJob

inputs:
- input: pipelineArtifact
artifactName: func-cli-inproc6
targetPath: $(Build.ArtifactStagingDirectory)/func-cli-inproc/inproc6

- input: pipelineArtifact
artifactName: func-cli-inproc8
targetPath: $(Build.ArtifactStagingDirectory)/func-cli-inproc/inproc8

outputs:
- output: pipelineArtifact
targetPath: $(Build.ArtifactStagingDirectory)/func-cli-inproc
artifactName: 'func-cli-inproc'

- stage: UploadToNightlyFeed
dependsOn: 'Merge'
condition: and(succeeded(), eq(variables['Build.Reason'], 'schedule'))

jobs:
- template: /eng/ci/templates/official/jobs/upload-artifact-to-feed.yml@self
parameters:
artifactName: 'func-cli-inproc'
packageName: 'func-cli-inproc'
46 changes: 19 additions & 27 deletions eng/ci/templates/official/jobs/build-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ jobs:
steps:
- pwsh: . "tools/start-emulators.ps1" -NoWait
displayName: "Start emulators (NoWait)"

- pwsh: |
$simulateReleaseBuild = $null
if (-not([bool]::TryParse($env:SimulateReleaseBuild, [ref] $simulateReleaseBuild)))
Expand All @@ -37,6 +38,7 @@ jobs:
env:
BuildSourceBranchName: $(Build.SourceBranchName)
SimulateReleaseBuild: $(SimulateReleaseBuild)

- pwsh: |
$isIntegrationBuild = $false
if ($env:INTEGRATIONBUILDNUMBER -like "PreRelease*-*")
Expand All @@ -46,20 +48,25 @@ jobs:
Write-Host "##vso[task.setvariable variable=IsIntegrationBuild]$isIntegrationBuild"
Write-Host "IsIntegrationBuild: $isIntegrationBuild"
displayName: 'Set IsIntegrationBuild variable'

- pwsh: |
Write-Host "Target branch: '$(DEVOPS_REPO_BRANCH)'"
displayName: Set up environment variables

- task: NodeTool@0
inputs:
versionSpec: '18.x'

- pwsh: |
Import-Module ".\pipelineUtilities.psm1" -Force
Install-Dotnet
displayName: 'Install .NET 6.0 and 3.1'

- task: NuGetToolInstaller@1
inputs:
versionSpec:
displayName: Install Nuget tool

- task: AzureCLI@2
displayName: Login via Azure CLI to acquire access token
inputs:
Expand All @@ -71,15 +78,18 @@ jobs:
# acquire access token from Azure CLI and export it to AZURE_MANAGEMENT_ACCESS_TOKEN
$accessToken = (az account get-access-token --query "accessToken" | % { $_.Trim('"') })
echo "##vso[task.setvariable variable=azure_management_access_token]$accessToken"

- pwsh: |
.\validateWorkerVersions.ps1
displayName: 'Validate worker versions'
condition: ne(variables['skipWorkerVersionValidation'], 'true')

- task: PowerShell@2
displayName: "Run Check Vulnerabilities Script"
inputs:
filePath: '$(Build.SourcesDirectory)/check-vulnerabilities.ps1'
workingDirectory: '$(Build.SourcesDirectory)'

- pwsh: |
.\build.ps1
env:
Expand All @@ -92,6 +102,13 @@ jobs:
IntegrationBuildNumber: $(INTEGRATIONBUILDNUMBER)
displayName: 'Executing build script'

- task: PublishTestResults@2
inputs:
testResultsFormat: 'VSTest'
testResultsFiles: '**/*.trx'
failTaskOnFailedTests: true
condition: succeededOrFailed()

- template: ci/sign-files.yml@eng
parameters:
displayName: 'Authenticode signing (dll)'
Expand Down Expand Up @@ -122,13 +139,6 @@ jobs:
}
]

- task: PublishTestResults@2
inputs:
testResultsFormat: 'VSTest'
testResultsFiles: '**/*.trx'
failTaskOnFailedTests: true
condition: succeededOrFailed()

- template: ci/sign-files.yml@eng
parameters:
displayName: 'Third party signing (dll)'
Expand Down Expand Up @@ -251,34 +261,16 @@ jobs:
IntegrationBuildNumber: $(INTEGRATIONBUILDNUMBER)
displayName: 'Move artifacts'

- ${{ if eq(variables['Build.Reason'], 'Schedule') }}:
- task: PowerShell@2
displayName: 'Generate nightly build package version for feed'
inputs:
targetType: filePath
filePath: '$(Build.SourcesDirectory)/generateNightlyBuildPackageVersion.ps1'

- task: UniversalPackages@0
displayName: Publish
inputs:
command: publish
publishDirectory: '$(Build.ArtifactStagingDirectory)'
vstsFeedPublish: 'internal/core-tools-nightly-build'
vstsFeedPackagePublish: 'func-cli-${{ parameters.artifactTargetFramework }}'
versionOption: custom
versionPublish: '$(NightlyBuildVersion)'
packagePublishDescription: 'Core tools ${{ parameters.artifactTargetFramework }} nightly build'

- task: 1ES.PublishPipelineArtifact@1
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)'
artifactName: 'func-cli-${{ parameters.artifactTargetFramework }}'
artifactType: 'pipeline'

- pwsh: |
.\uploadContentToStorageAccount.ps1 -StorageAccountName $env:IntegrationTestsStorageAccountName -StorageAccountKey $env:IntegrationTestsStorageAccountKey -SourcePath '$(Build.ArtifactStagingDirectory)'
env:
IntegrationTestsStorageAccountName: $(IntegrationTestsStorageAccountName)
IntegrationTestsStorageAccountKey: $(IntegrationTestsStorageAccountKey)
displayName: 'Upload Core Tools build to the storage account for Integration Tests'
condition: eq(variables.IsIntegrationBuild, 'true')
condition: eq(variables.IsIntegrationBuild, 'true')
33 changes: 33 additions & 0 deletions eng/ci/templates/official/jobs/upload-artifact-to-feed.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
parameters:
- name: artifactName
type: string
- name: packageName
type: string

jobs:
- job: UploadArtifactToFeed
displayName: 'Upload artifact to Feed'
timeoutInMinutes: "180"

pool:
name: 1es-pool-azfunc-public
image: 1es-windows-2022
os: windows

steps:
- task: DownloadPipelineArtifact@2
displayName: Download artifact
inputs:
artifact: '{{ parameters.artifactName }}'
path: $(Build.ArtifactStagingDirectory)/drop

- task: UniversalPackages@0
displayName: Publish to feed
inputs:
command: publish
publishDirectory: '$(Build.ArtifactStagingDirectory)/drop'
vstsFeedPublish: 'internal/core-tools-nightly-build'
vstsFeedPackagePublish: '{{ parameters.packageName }}'
versionOption: custom
versionPublish: '$(Build.BuildNumber)'
packagePublishDescription: 'Core tools default nightly build'
8 changes: 0 additions & 8 deletions src/Azure.Functions.Cli/Azure.Functions.Cli.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,6 @@
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
<AssemblyName>func</AssemblyName>
<RuntimeIdentifiers>win-x64;win-x86;win-arm64;linux-x64;osx-x64;osx-arm64</RuntimeIdentifiers>
<BuildNumber Condition=" '$(BuildNumber)' == '' ">1</BuildNumber>
<MajorMinorProductVersion>4.0</MajorMinorProductVersion>
<Version>$(MajorMinorProductVersion).$(BuildNumber)</Version>
<AssemblyVersion>$(MajorMinorProductVersion).$(BuildNumber)</AssemblyVersion>
<FileVersion>$(MajorMinorProductVersion).$(BuildNumber)</FileVersion>
<CommitHash Condition="$(CommitHash) == ''">N/A</CommitHash>
<IntegrationBuildNumberInfo Condition="$(IntegrationBuildNumber) != ''">Integration build number: $(IntegrationBuildNumber)</IntegrationBuildNumberInfo>
<InformationalVersion>$(FileVersion) Commit hash: $(CommitHash) $(IntegrationBuildNumberInfo)</InformationalVersion>
<Company>Microsoft</Company>
<Authors>Microsoft</Authors>
<Title>Azure Functions Cli</Title>
Expand Down
6 changes: 3 additions & 3 deletions src/Azure.Functions.Cli/Common/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.ObjectModel;
using System.Reflection;
using Azure.Functions.Cli.Helpers;
using Azure.Functions.Cli.Extensions;

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

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

public static string CliVersion => typeof(Constants).GetTypeInfo().Assembly.GetName().Version.ToString(3);

public static string CliDetailedVersion = typeof(Constants).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? string.Empty;
public static string CliDetailedVersion => typeof(Constants).Assembly.GetInformationalVersion();

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

Expand Down
5 changes: 5 additions & 0 deletions src/Azure.Functions.Cli/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<Project>

<Import Project="$(MSBuildThisFileDirectory)../../eng/build/Version.props" />

</Project>
3 changes: 2 additions & 1 deletion src/Azure.Functions.Cli/Directory.Build.targets
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<Project>

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

</Project>
9 changes: 9 additions & 0 deletions src/Azure.Functions.Cli/Directory.Version.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<Project>

<PropertyGroup>
<VersionPrefix>4.0.10000</VersionPrefix>
<VersionSuffix></VersionSuffix>
<UpdateBuildNumber>true</UpdateBuildNumber>
</PropertyGroup>

</Project>
47 changes: 47 additions & 0 deletions src/Azure.Functions.Cli/Extensions/AssembleyExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using System.Linq;
using System.Reflection;

namespace Azure.Functions.Cli.Extensions
{
internal static class AssemblyExtensions
{
public static string GetInformationalVersion(this Assembly assembly)
{
var informationalVersion = assembly
.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false)
.OfType<AssemblyInformationalVersionAttribute>()
.FirstOrDefault()?.InformationalVersion;

return informationalVersion ?? string.Empty;
}

public static string GetCliVersion(this Assembly assembly)
{
// The package version is stamped into the assembly's AssemblyInformationalVersionAttribute at build time, followed by a '+'
// and the commit hash, e.g.: "4.0.10000-dev+67bd99a8ce2ec3cf833f25c039f60222caf44573 (64-bit)"
var version = assembly.GetInformationalVersion();

if (version is not null)
{
var plusIndex = version.IndexOf('+');

if (plusIndex > 0)
{
return version[..plusIndex];
}

return version;
}

// Fallback to the file version, which is based on the CI build number, and then fallback to the assembly version, which is
// product stable version, e.g. 4.0.0.0
version = assembly.GetCustomAttribute<AssemblyFileVersionAttribute>()?.Version
?? assembly.GetCustomAttribute<AssemblyVersionAttribute>()?.Version;

return version;
}
}
}