Skip to content

Use Azure Pipelines exclusively (i.e. drop Travis, AppVeyor) #1761

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Feb 16, 2020
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
43 changes: 2 additions & 41 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,46 +1,7 @@
# Travis-CI Build for libgit2sharp
# see travis-ci.org for details

language: csharp
mono: none

matrix:
include:
- os: linux
dist: xenial
before_install:
- |
wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
sudo apt-get install -y powershell
- os: osx
osx_image: xcode8.3
before_install:
- brew update # This is necessary to get pwsh 6.2 instead of some 6.0-preview that isn't named `pwsh`
- brew cask install powershell
fast_finish: true

before_install:
- date -u
- uname -a
- env | sort

install:
- git fetch --unshallow
- pwsh ./tools/Install-DotNetSdk.ps1 ; export PATH=~/.dotnet:$PATH

# Build libgit2, LibGit2Sharp and run the tests
script:
- ./buildandtest.sh 'LEAKS_IDENTIFYING'

# Only watch the development branch
# Disable Travis-CI
branches:
only:
- master
- /^maint.*/

# Notify of build changes
notifications:
email:
- [email protected]
- NOTTHISONE
4 changes: 4 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<OutputPath>$(MSBuildThisFileDirectory)bin\$(MSBuildProjectName)\$(Configuration)\</OutputPath>
<BaseIntermediateOutputPath>$(MSBuildThisFileDirectory)obj\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
<PackageOutputPath>$(MSBuildThisFileDirectory)bin\Packages\$(Configuration)\</PackageOutputPath>
<DefineConstants Condition=" '$(ExtraDefine)' != '' ">$(DefineConstants);$(ExtraDefine)</DefineConstants>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0" PrivateAssets="All" />
</ItemGroup>
</Project>
8 changes: 8 additions & 0 deletions Directory.Build.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project>
<PropertyGroup Condition=" '$(IsTestProject)' == 'true' ">
<CoverletOutputFormat>cobertura</CoverletOutputFormat>
<Exclude>[xunit.*]*</Exclude>
<!-- Ensure we preserve each coverlet output file per target framework: https://github.com/tonerdo/coverlet/issues/177 -->
<CoverletOutput>$(OutputPath)/</CoverletOutput>
</PropertyGroup>
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This whole file enables code coverage collection when /p:CollectCoverage=true is specified, as is now done in the Azure Pipelines .yml file.

</Project>
3 changes: 2 additions & 1 deletion LibGit2Sharp.Tests/LibGit2Sharp.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.0.1" />
<PackageReference Include="coverlet.msbuild" Version="2.7.0" />
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is required for code coverage.

<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
<PackageReference Include="Moq" Version="4.10.1" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
<PackageReference Include="xunit" Version="2.4.1" />
Expand Down
2 changes: 1 addition & 1 deletion LibGit2Sharp.Tests/StatusFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -640,7 +640,7 @@ public void CanIncludeStatusOfUnalteredFiles()
RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = true });

Assert.Equal(unalteredPaths.Length, status.Unaltered.Count());
Assert.Equal(unalteredPaths, status.Unaltered.OrderBy(s => s.FilePath).Select(s => s.FilePath).ToArray());
Assert.Equal(unalteredPaths, status.Unaltered.OrderBy(s => s.FilePath, StringComparer.OrdinalIgnoreCase).Select(s => s.FilePath).ToArray());
}
}

Expand Down
1 change: 1 addition & 0 deletions LibGit2Sharp.Tests/desktop/ShadowCopyFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ namespace LibGit2Sharp.Tests
public class ShadowCopyFixture : BaseFixture
{
[Fact]
[Trait("TestCategory", "FailsWhileInstrumented")]
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test sets up an appdomain and loads libgit2sharp. When code coverage is turned on, it invalidates the signature of the strong-name signed assembly and then .NET Framework won't load it. So skip the test during instrumented test runs. We run this test by itself in the very next step on Azure Pipelines to make sure it runs.

public void CanProbeForNativeBinariesFromAShadowCopiedAssembly()
{
Type type = typeof(Wrapper);
Expand Down
15 changes: 8 additions & 7 deletions LibGit2Sharp/LibGit2Sharp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,32 +14,33 @@
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\libgit2sharp.snk</AssemblyOriginatorKeyFile>
<PackageIcon>square-logo.png</PackageIcon>
<PackageLicenseFile>App_Readme/LICENSE.md</PackageLicenseFile>
</PropertyGroup>

<ItemGroup>
<CodeAnalysisDictionary Include="CustomDictionary.xml" />
<None Include="..\README.md" Pack="true" PackagePath="App_Readme\" />
<None Include="..\LICENSE.md" Pack="true" PackagePath="App_Readme\" />
<None Include="..\CHANGES.md" Pack="true" PackagePath="App_Readme\" />
<None Include="..\square-logo.png" Pack="true" PackagePath="" />
<None Include="..\README.md" Pack="true" PackagePath="App_Readme/" />
<None Include="..\LICENSE.md" Pack="true" PackagePath="App_Readme/" />
<None Include="..\CHANGES.md" Pack="true" PackagePath="App_Readme/" />
<None Update="Core\Handles\Objects.tt" Generator="TextTemplatingFileGenerator" LastGenOutput="Objects.cs" />
<Compile Update="Core\Handles\Objects.cs" DependentUpon="Objects.tt" DesignTime="True" AutoGen="True" />
<Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" /> <!-- Needed for T4 generation -->
</ItemGroup>

<ItemGroup>
<PackageReference Include="LibGit2Sharp.NativeBinaries" Version="[2.0.305]" PrivateAssets="none" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta-63127-02" PrivateAssets="all" />
<PackageReference Include="Nerdbank.GitVersioning" Version="2.3.138" PrivateAssets="all" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" />
<PackageReference Include="Nerdbank.GitVersioning" Version="3.0.50" PrivateAssets="all" />
</ItemGroup>

<Import Project="..\Targets\CodeGenerator.targets" />
<Import Project="..\Targets\GenerateNativeDllName.targets" />

<Target Name="SetNuSpecProperties" BeforeTargets="GenerateNuspec" DependsOnTargets="GetBuildVersion">
<PropertyGroup>
<PackageIconUrl>https://github.com/libgit2/libgit2sharp/raw/$(GitCommitIdShort)/square-logo.png</PackageIconUrl>
<PackageReleaseNotes>https://github.com/libgit2/libgit2sharp/blob/$(GitCommitIdShort)/CHANGES.md#libgit2sharp-changes</PackageReleaseNotes>
<PackageLicenseUrl>https://github.com/libgit2/libgit2sharp/raw/$(GitCommitIdShort)/LICENSE.md</PackageLicenseUrl>
</PropertyGroup>
</Target>

Expand Down
160 changes: 3 additions & 157 deletions appveyor.yml
Original file line number Diff line number Diff line change
@@ -1,158 +1,4 @@
version: '{build}'

os: Visual Studio 2019

# Disable AppVeyor
branches:
only:
- master
- /^maint.*/

configuration: release

skip_tags: true

nuget:
disable_publish_on_pr: true

environment:
coveralls_token:
secure: ixIsBslo9NheDb5lJknF58EYdgvZ0r3/L0ecRiXjfXmjHBLvoSU6/ZRwaMM+BAlG
coverity_token:
secure: nuzUT+HecXGIi3KaPd/1hgFEZJan/j6+oNbPV75JKjk=
coverity_email:
secure: eGVilNg1Yuq+Xj+SW8r3WCtjnzhoDV0sNJkma4NRq7A=
matrix:
- publish_on_success: False
ExtraDefine: LEAKS_IDENTIFYING
- publish_on_success: True

matrix:
fast_finish: true

install:
- ps: |
Write-Host "Commit being built = " -NoNewLine
Write-Host $Env:APPVEYOR_REPO_COMMIT -ForegroundColor "Green"
Write-Host "Target branch = " -NoNewLine
Write-Host $Env:APPVEYOR_REPO_BRANCH -ForegroundColor "Green"
Write-Host "Is a Pull Request = " -NoNewLine
Write-Host $($Env:APPVEYOR_PULL_REQUEST_NUMBER -ne $null) -ForegroundColor "Green"

$CommitDate = [DateTime]::Parse($Env:APPVEYOR_REPO_COMMIT_TIMESTAMP)
$BuildDate = $CommitDate.ToUniversalTime().ToString("yyyyMMddHHmmss")
Write-Host "Merge commit UTC timestamp = " -NoNewLine
Write-Host $BuildDate -ForegroundColor "Green"

$Env:SHOULD_RUN_COVERITY_ANALYSIS = $($Env:APPVEYOR_SCHEDULED_BUILD -eq $True)
Write-Host "Should run Coverity analysis = " -NoNewLine
Write-Host $Env:SHOULD_RUN_COVERITY_ANALYSIS -ForegroundColor "Green"

$Env:SHOULD_RUN_COVERALLS = $($Env:APPVEYOR_SCHEDULED_BUILD -eq $True)
Write-Host "Should run Coveralls = " -NoNewLine
Write-Host $Env:SHOULD_RUN_COVERALLS -ForegroundColor "Green"

Write-Host "Identifying leaks = " -NoNewLine
Write-Host ($Env:ExtraDefine -eq "LEAKS_IDENTIFYING") -ForegroundColor "Green"

Write-Host "Should publish on success = " -NoNewLine
Write-Host $Env:publish_on_success -ForegroundColor "Green"

If ($Env:SHOULD_RUN_COVERALLS -eq $True)
{
nuget install OpenCover -Version 4.6.166 -ExcludeVersion -OutputDirectory .\packages
nuget install coveralls.net -Version 0.6.0 -ExcludeVersion -OutputDirectory .\packages
}

If ($Env:SHOULD_RUN_COVERITY_ANALYSIS -eq $True)
{
cinst curl -y
}

./tools/Install-DotNetSdk.ps1

before_build:
- ps: |
msbuild "$Env:APPVEYOR_BUILD_FOLDER\LibGit2Sharp.sln" `
/nologo /verbosity:quiet `
/logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" `
/t:restore

build_script:
- ps: |
& cov-build.exe --dir cov-int msbuild "$Env:APPVEYOR_BUILD_FOLDER\LibGit2Sharp.sln" `
/nologo /verbosity:minimal /fl /flp:verbosity=normal `
/logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" `
/t:build,pack

test_script:
- ps: |
Foreach ($runner in 'xunit.console.exe','xunit.console.x86.exe')
{
If ($Env:SHOULD_RUN_COVERALLS -eq $True -and $Env:publish_on_success -eq $True)
{
.\packages\OpenCover\tools\OpenCover.Console.exe `
-register:user `
"-target:""$Env:userprofile\.nuget\packages\xunit.runner.console\2.4.1\tools\net46\$runner""" `
"-targetargs:""$Env:APPVEYOR_BUILD_FOLDER\bin\LibGit2Sharp.Tests\Release\net46\LibGit2Sharp.Tests.dll"" -noshadow" `
"-filter:+[LibGit2Sharp]* -[LibGit2Sharp.Tests]*" `
-hideskipped:All `
-output:opencoverCoverage.xml
}
ElseIf ($Env:SHOULD_RUN_COVERITY_ANALYSIS -eq $False)
{
& "$Env:userprofile\.nuget\packages\xunit.runner.console\2.4.1\tools\net46\$runner" `
"$Env:APPVEYOR_BUILD_FOLDER\bin\LibGit2Sharp.Tests\Release\net46\LibGit2Sharp.Tests.dll" -noshadow
}
}

- dotnet test LibGit2Sharp.Tests/LibGit2Sharp.Tests.csproj -f netcoreapp2.1 --no-restore --no-build

after_test:
- ps: |
If ($Env:SHOULD_RUN_COVERALLS -eq $True -and $Env:publish_on_success -eq $True)
{
Write-Host "Uploading code coverage result..." -ForegroundColor "Green"

.\packages\coveralls.net\tools\csmacnz.Coveralls.exe `
--opencover -i opencoverCoverage.xml `
--repoToken $Env:coveralls_token `
--useRelativePaths `
--basePath "$Env:APPVEYOR_BUILD_FOLDER\"`
}

If ($Env:SHOULD_RUN_COVERITY_ANALYSIS -eq $True -and $Env:publish_on_success -eq $True)
{
7z a "$Env:APPVEYOR_BUILD_FOLDER\$Env:APPVEYOR_PROJECT_NAME.zip" "$Env:APPVEYOR_BUILD_FOLDER\cov-int\"

# cf. http://stackoverflow.com/a/25045154/335418
Remove-item alias:curl

Write-Host "Uploading Coverity analysis result..." -ForegroundColor "Green"

curl --silent --show-error `
--output curl-out.txt `
--form token="$Env:coverity_token" `
--form email="$Env:coverity_email" `
--form "file=@$Env:APPVEYOR_BUILD_FOLDER\$Env:APPVEYOR_PROJECT_NAME.zip" `
--form version="$Env:APPVEYOR_REPO_COMMIT" `
--form description="CI server scheduled build." `
https://scan.coverity.com/builds?project=libgit2%2Flibgit2sharp

cat .\curl-out.txt
}

on_finish:
- ps: Push-AppveyorArtifact "msbuild.log"

on_success:
- ps: |
if ($Env:publish_on_success -eq $True)
{
Get-ChildItem "bin\LibGit2Sharp\$env:configuration\*.nupkg" |% { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
}

notifications:
- provider: Email
to:
- [email protected]
on_build_status_changed: true
only:
- NOTTHISONE
32 changes: 5 additions & 27 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,10 @@ trigger:
- maint/*

variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
TreatWarningsAsErrors: true
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TreatWarningsAsErrors to keep your build clean. You had a few warnings before I fixed them in #1221, and this helps slam the door against such engineering debt in the future.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of putting this here, I think it makes sense to add <TreatWarningsAsErrors>true</TreatWarningsAsErrors> to Directory.Build.props.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The problem with that is then you can't even build locally when there are warnings. That slows down your dev inner loop. I greatly prefer for warnings to be allowed during the inner loop and only be accountable to fix all warnings before a PR is accepted.

DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
BuildConfiguration: Release
NUGET_PACKAGES: $(Agent.TempDirectory)/.nuget/packages

jobs:
- job: Windows
pool:
vmImage: 'windows-2019'
steps:
- pwsh: ./tools/Install-DotNetSdk.ps1
displayName: Installing .NET Core SDK and runtimes
- script: buildandtest.cmd
displayName: Build and test
- job: Linux
pool:
vmImage: 'Ubuntu 16.04'
steps:
- pwsh: ./tools/Install-DotNetSdk.ps1
displayName: Installing .NET Core SDK and runtimes
- script: ./buildandtest.sh
displayName: Build and test
- job: macOS
pool:
vmImage: 'macOS 10.13'
steps:
- pwsh: ./tools/Install-DotNetSdk.ps1
displayName: Installing .NET Core SDK and runtimes
- script: ./buildandtest.sh
displayName: Build and test
- template: azure-pipelines/build.yml
File renamed without changes.
50 changes: 50 additions & 0 deletions azure-pipelines/artifacts/_all.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# This script returns all the artifacts that should be collected after a build.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As documented, this script executes all the other scripts in this directory to aggregate the data on artifacts to be uploaded.
Overall, these artifacts scripts make it easier to pick and choose which files to collect, gives an opportunity to create/process files before collection, and allows local dev box testing of all this behavior instead of having to run it through Azure Pipelines just to test a yml script.

#
# Each powershell artifact is expressed as an object with these properties:
# Source - the full path to the source file
# ArtifactName - the name of the artifact to upload to
# ContainerFolder - the relative path within the artifact in which the file should appear
#
# Each artifact aggregating .ps1 script should return a hashtable:
# Key = path to the directory from which relative paths within the artifact should be calculated
# Value = an array of paths (absolute or relative to the BaseDirectory) to files to include in the artifact.
# FileInfo objects are also allowed.

$RepoRoot = [System.IO.Path]::GetFullPath("$PSScriptRoot\..\..")

Function EnsureTrailingSlash($path) {
if ($path.length -gt 0 -and !$path.EndsWith('\') -and !$path.EndsWith('/')) {
$path = $path + [IO.Path]::DirectorySeparatorChar
}

$path.Replace('\', [IO.Path]::DirectorySeparatorChar)
}

Get-ChildItem "$PSScriptRoot\*.ps1" -Exclude "_*" -Recurse |% {
$ArtifactName = $_.BaseName

$fileGroups = & $_
if (!$fileGroups -or $fileGroups.Count -eq 0) {
Write-Warning "No files found for the `"$ArtifactName`" artifact."
} else {
$fileGroups.GetEnumerator() | % {
$BaseDirectory = New-Object Uri ((EnsureTrailingSlash $_.Key), [UriKind]::Absolute)
$_.Value | % {
if ($_.GetType() -eq [IO.FileInfo] -or $_.GetType() -eq [IO.DirectoryInfo]) {
$_ = $_.FullName
}

$artifact = New-Object -TypeName PSObject
Add-Member -InputObject $artifact -MemberType NoteProperty -Name ArtifactName -Value $ArtifactName

$SourceFullPath = New-Object Uri ($BaseDirectory, $_)
Add-Member -InputObject $artifact -MemberType NoteProperty -Name Source -Value $SourceFullPath.LocalPath

$RelativePath = [Uri]::UnescapeDataString($BaseDirectory.MakeRelative($SourceFullPath))
Add-Member -InputObject $artifact -MemberType NoteProperty -Name ContainerFolder -Value (Split-Path $RelativePath)

Write-Output $artifact
}
}
}
}
10 changes: 10 additions & 0 deletions azure-pipelines/artifacts/_pipelines.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# This script translates all the artifacts described by _all.ps1
# into commands that instruct Azure Pipelines to actually collect those artifacts.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As documented, this is the Azure-Pipelines adapter for the otherwise CI-agnostic artifact scripts. It assigns a special suffix to each artifact based on the OS of the agent so that you can collect artifacts from win, osx, linux without them stomping on each other.


param (
[string]$ArtifactNameSuffix
)

& "$PSScriptRoot/_stage_all.ps1" -ArtifactNameSuffix $ArtifactNameSuffix |% {
Write-Host "##vso[artifact.upload containerfolder=$($_.Name);artifactname=$($_.Name);]$($_.Path)"
}
Loading